commit 8326004cb213977b1fbeb269b8ed359b37bed4bc Author: zero Date: Sun Aug 12 03:59:52 2007 +0000 삭제 git-svn-id: http://xe-core.googlecode.com/svn/sandbox@2327 201d5d3c-b55e-5fd7-737f-ddc643e51545 diff --git a/.htaccess b/.htaccess new file mode 100644 index 000000000..12419e500 --- /dev/null +++ b/.htaccess @@ -0,0 +1,51 @@ +RewriteEngine On + +# page +RewriteRule ^([a-zA-Z0-9_]+)/([[:digit:]]+)page$ ./index.php?mid=$1&page=$2 [L] + +# total rss +RewriteRule ^rss/([[:digit:]]+){0,14}/([[:digit:]]+){0,14}/([[:digit:]]+)$ ./index.php?module=rss&act=rss&start_date=$1&end_date=$2&page=$3 [L] +RewriteRule ^rss/([[:digit:]]+)$ ./index.php?module=rss&act=rss&page=$1 [L] +RewriteRule ^rss$ ./index.php?module=rss&act=rss [L] + +# administrator page +RewriteRule ^admin$ ./index.php?module=admin [L] + +# mid + act +RewriteRule ^([a-zA-Z0-9_]+)/api$ ./index.php?mid=$1&act=api [L] + +# document permanent link +RewriteRule ^([[:digit:]]+)$ ./index.php?document_srl=$1 [L] + +# document + act link +RewriteRule ^([[:digit:]]+)/([a-zA-Z0-9_]+)$ ./index.php?document_srl=$1&act=$2 [L] + +# mid + document link +RewriteRule ^([a-zA-Z0-9_]+)/([[:digit:]]+)$ ./index.php?mid=$1&document_srl=$2 [L] + +# mid + act link +RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)$ ./index.php?mid=$1&act=$2 [L] + +# mid + page link +RewriteRule ^([a-zA-Z0-9_]+)/page/([[:digit:]]+)$ ./index.php?mid=$1&page=$2 [L] + +# mid + category link +RewriteRule ^([a-zA-Z0-9_]+)/category/([[:digit:]]+)$ ./index.php?mid=$1&category=$2 [L] + +# mid + category + page +RewriteRule ^([a-zA-Z0-9_]+)/category/([[:digit:]]+)/page/([[:digit:]]+)$ ./index.php?mid=$1&category=$2&page=$3 [L] + +# mid + search target regdate (year+month) +RewriteRule ^([a-zA-Z0-9_]+)/([[:digit:]]+){0,4}/([[:digit:]]+){0,2}$ ./index.php?mid=$1&search_target=regdate&search_keyword=$2$3 [L] + +# mid + search target regdate (year+month+day) +RewriteRule ^([a-zA-Z0-9_]+)/([[:digit:]]+){0,4}/([[:digit:]]+){0,2}/([[:digit:]]+){0,2}$ ./index.php?mid=$1&search_target=regdate&search_keyword=$2$3$4 [L] + +# mid + search target tag +RewriteRule ^([a-zA-Z0-9_]+)/tag/(.*)$ ./index.php?mid=$1&search_target=tag&search_keyword=$2 [L] + +# mid + search target writer +RewriteRule ^([a-zA-Z0-9_]+)/writer/(.*)$ ./index.php?mid=$1&search_target=nick_name&search_keyword=$2 [L] + +# module link +RewriteRule ^([a-zA-Z0-9_]+)(/){0,1}$ ./index.php?mid=$1 [L] diff --git a/addons/blogapi/blogapi.addon.php b/addons/blogapi/blogapi.addon.php new file mode 100644 index 000000000..4aa6ceb8d --- /dev/null +++ b/addons/blogapi/blogapi.addon.php @@ -0,0 +1,394 @@ +mid); + + // 헤더에 rsd태그 삽입 + Context::addHtmlHeader(" ".''); + } + + // act가 api가 아니면 그냥 리턴~ + if($_REQUEST['act']!='api') return; + + /** + * blogapi의 경우 GET argument와 XML Content가 같이 오기에 제로보드XE의 경우 XML Content가 오면 이것만 처리하기에 + * GET argument중에 mid값을 강제 설정해야 모듈을 정상적으로 찾는다 + **/ + if($called_position == 'before_module_init') { + $mid = $_REQUEST['mid']; + Context::set('mid', $mid, true); + $this->mid = $mid; + } + + // 관련 func 파일 읽음 + require_once('./addons/blogapi/blogapi.func.php'); + + // xmlprc 파싱 + // 요청된 xmlrpc를 파싱 + $oXmlParser = new XmlParser(); + $xmlDoc = $oXmlParser->parse(); + + $method_name = $xmlDoc->methodcall->methodname->body; + $params = $xmlDoc->methodcall->params->param; + if($params && !is_array($params)) $params = array($params); + + // blogger.deletePost일 경우 첫번째 인자 값 삭제 + if($method_name == 'blogger.deletePost') array_shift($params); + + // user_id, password를 구해서 로그인 시도 + $user_id = trim($params[1]->value->string->body); + $password = trim($params[2]->value->string->body); + + // 모듈 실행전이라면 인증을 처리한다. + if($called_position == 'before_module_init') { + + // member controller을 이용해서 로그인 시도 + if($user_id && $password) { + $oMemberController = &getController('member'); + $output = $oMemberController->doLogin($user_id, $password); + // 로그인 실패시 에러 메시지 출력 + if(!$output->toBool()) { + $content = getXmlRpcFailure(1, $output->getMessage()); + printContent($content); + } + } else { + $content = getXmlRpcFailure(1, 'not logged'); + printContent($content); + } + } + + // 모듈에서 무언가 작업을 하기 전에 blogapi tool의 요청에 대한 처리를 하고 강제 종료한다. + if($called_position == 'before_module_proc') { + + // 글쓰기 권한 체크 (권한명의 경우 약속이 필요할듯..) + if(!$this->grant->write_document) { + printContent( getXmlRpcFailure(1, 'no permission') ); + } + + // 카테고리의 정보를 구해옴 + $oDocumentModel = &getModel('document'); + $category_list = $oDocumentModel->getCategoryList($this->module_srl); + + // 임시 파일 저장 장소 지정 + $tmp_uploaded_path = sprintf('./files/cache/blogapi/%s/%s/', $this->mid, $user_id); + $uploaded_target_path = sprintf('/files/cache/blogapi/%s/%s/', $this->mid, $user_id); + + switch($method_name) { + // 블로그 정보 + case 'blogger.getUsersBlogs' : + $obj->url = Context::getRequestUri().$this->mid; + $obj->blogid = $this->mid; + $obj->blogName = $this->module_info->browser_title; + $blog_list = array($obj); + + $content = getXmlRpcResponse($blog_list); + printContent($content); + break; + + // 카테고리 목록 return + case 'metaWeblog.getCategories' : + $category_obj_list = array(); + if($category_list) { + foreach($category_list as $category_srl => $category_info) { + unset($obj); + $obj->description = $category_info->title; + //$obj->htmlUrl = Context::getRequestUri().$this->mid.'/1'; + //$obj->rssUrl= Context::getRequestUri().'rss/'.$this->mid.'/1'; + $obj->title = $category_info->title; + $obj->categoryid = $category_srl; + $category_obj_list[] = $obj; + } + } + + $content = getXmlRpcResponse($category_obj_list); + printContent($content); + break; + + // 파일 업로드 + case 'metaWeblog.newMediaObject' : + // 파일 업로드 권한 체크 + if(!$this->grant->fileupload) { + printContent( getXmlRpcFailure(1, 'no permission') ); + } + + $fileinfo = $params[3]->value->struct->member; + foreach($fileinfo as $key => $val) { + $nodename = $val->name->body; + if($nodename == 'bits') $filedata = base64_decode($val->value->base64->body); + elseif($nodename == 'name') $filename = $val->value->string->body; + } + + $tmp_arr = explode('/',$filename); + $filename = array_pop($tmp_arr); + + if(!is_dir($tmp_uploaded_path)) FileHandler::makeDir($tmp_uploaded_path); + + $target_filename = sprintf('%s%s', $tmp_uploaded_path, $filename); + FileHandler::writeFile($target_filename, $filedata); + $obj->url = Context::getRequestUri().$target_filename; + + $content = getXmlRpcResponse($obj); + printContent($content); + break; + + // 글작성 + case 'metaWeblog.newPost' : + unset($obj); + $info = $params[3]; + // 글, 제목, 카테고리 정보 구함 + for($i=0;$ivalue->struct->member);$i++) { + $val = $info->value->struct->member[$i]; + switch($val->name->body) { + case 'title' : + $obj->title = $val->value->string->body; + break; + case 'description' : + $obj->content = $val->value->string->body; + break; + case 'categories' : + $categories = $val->value->array->data->value; + if(!is_array($categories)) $categories = array($categories); + $category = $categories[0]->string->body; + if($category && $category_list) { + foreach($category_list as $category_srl => $category_info) { + if($category_info->title == $category) $obj->category_srl = $category_srl; + } + } + break; + case 'tagwords' : + $tags = $val->value->array->data->value; + if(!is_array($tags)) $tags = array($tags); + for($j=0;$jstring->body; + } + if(count($tag_list)) $obj->tags = implode(',',$tag_list); + break; + } + + } + + // 문서 번호 설정 + $document_srl = getNextSequence(); + $obj->document_srl = $document_srl; + $obj->module_srl = $this->module_srl; + + // 첨부파일 정리 + if(is_dir($tmp_uploaded_path)) { + $file_list = FileHandler::readDir($tmp_uploaded_path); + $file_count = count($file_list); + if($file_count) { + $oFileController = &getController('file'); + for($i=0;$i<$file_count;$i++) { + $file_info['tmp_name'] = sprintf('%s%s', $tmp_uploaded_path, $file_list[$i]); + $file_info['name'] = $file_list[$i]; + $oFileController->insertFile($file_info, $this->module_srl, $document_srl, 0, true); + } + $obj->uploaded_count = $file_count; + } + } + $obj->content = str_replace($uploaded_target_path,sprintf('/files/attach/images/%s/%s/%s', $this->module_srl, $document_srl, $filename), $obj->content); + + $oDocumentController = &getController('document'); + $obj->allow_comment = 'Y'; + $obj->allow_trackback = 'Y'; + $output = $oDocumentController->insertDocument($obj); + + if(!$output->toBool()) { + $content = getXmlRpcFailure(1, $output->getMessage()); + } else { + //$content = getXmlRpcResponse(Context::getRequestUri().$this->mid.'/'.$document_srl); + $content = getXmlRpcResponse(''.$document_srl); + } + FileHandler::removeDir($tmp_uploaded_path); + + printContent($content); + break; + + // 글 수정 + case 'metaWeblog.editPost' : + $tmp_val = $params[0]->value->string->body; + $tmp_arr = explode('/', $tmp_val); + $document_srl = array_pop($tmp_arr); + + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + + // 글 수정 권한 체크 + if(!$oDocument->isGranted()) { + $content = getXmlRpcFailure(1, 'no permission'); + break; + } + + $obj = $oDocument->getObjectVars(); + + $info = $params[3]; + + // 글, 제목, 카테고리 정보 구함 + for($i=0;$ivalue->struct->member);$i++) { + $val = $info->value->struct->member[$i]; + switch($val->name->body) { + case 'title' : + $obj->title = $val->value->string->body; + break; + case 'description' : + $obj->content = $val->value->string->body; + break; + case 'categories' : + $categories = $val->value->array->data->value; + if(!is_array($categories)) $categories = array($categories); + $category = $categories[0]->string->body; + if($category && $category_list) { + foreach($category_list as $category_srl => $category_info) { + if($category_info->title == $category) $obj->category_srl = $category_srl; + } + } + break; + case 'tagwords' : + $tags = $val->value->array->data->value; + if(!is_array($tags)) $tags = array($tags); + for($j=0;$jstring->body; + } + if(count($tag_list)) $obj->tags = implode(',',$tag_list); + break; + } + + } + + // 문서 번호 설정 + $obj->document_srl = $document_srl; + $obj->module_srl = $this->module_srl; + + // 첨부파일 정리 + if(is_dir($tmp_uploaded_path)) { + $file_list = FileHandler::readDir($tmp_uploaded_path); + $file_count = count($file_list); + if($file_count) { + $oFileController = &getController('file'); + for($i=0;$i<$file_count;$i++) { + $file_info['tmp_name'] = sprintf('%s%s', $tmp_uploaded_path, $file_list[$i]); + $file_info['name'] = $file_list[$i]; + + $moved_filename = sprintf('./files/attach/images/%s/%s/%s', $this->module_srl, $document_srl, $file_info['name']); + if(file_exists($moved_filename)) continue; + + $oFileController->insertFile($file_info, $this->module_srl, $document_srl, 0, true); + } + $obj->uploaded_count += $file_count; + } + } + $obj->content = str_replace($uploaded_target_path,sprintf('/files/attach/images/%s/%s/%s', $this->module_srl, $document_srl, $filename), $obj->content); + + $oDocumentController = &getController('document'); + $output = $oDocumentController->updateDocument($oDocument,$obj); + + if(!$output->toBool()) { + $content = getXmlRpcFailure(1, $output->getMessage()); + } else { + $content = getXmlRpcResponse(Context::getRequestUri().$this->mid.'/'.$document_srl); + FileHandler::removeDir($tmp_uploaded_path); + } + + printContent($content); + break; + + // 글삭제 + case 'blogger.deletePost' : + $tmp_val = $params[0]->value->string->body; + $tmp_arr = explode('/', $tmp_val); + $document_srl = array_pop($tmp_arr); + + // 글 받아오기 + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + + // 글 삭제 권한 체크 + if(!$oDocument->isGranted()) { + $content = getXmlRpcFailure(1, 'no permission'); + break; + } + + $oDocumentController = &getController('document'); + $output = $oDocumentController->deleteDocument($document_srl); + if(!$output->toBool()) $content = getXmlRpcFailure(1, $output->getMessage()); + else $content = getXmlRpcResponse(true); + + printContent($content); + break; + + // 최신글 받기 + case 'metaWeblog.getRecentPosts' : + // 목록을 구하기 위한 옵션 + $args->module_srl = $this->module_srl; ///< 현재 모듈의 module_srl + $args->page = 1; + $args->list_count = 20; + $args->sort_index = 'list_order'; ///< 소팅 값 + $output = $oDocumentModel->getDocumentList($args); + if(!$output->toBool() || !$output->data) { + $content = getXmlRpcFailure(1, 'post not founded'); + printContent($content); + } else { + $oContext = &Context::getInstance(); + + + $posts = array(); + foreach($output->data as $key => $oDocument) { + $post = null; + $post->link = $post->permaLink = getUrl('','mid',$this->mid,'document_srl',$oDocument->document_srl); + $post->userid = $oDocument->get('user_id'); + $post->mt_allow_pings = 0; + $post->mt_allow_comments = $oDocument->allowComment()=='Y'?1:0; + $post->description = htmlspecialchars($oContext->transContent($oDocument->get('content'))); + $post->postid = $oDocument->document_srl; + $post->title = htmlspecialchars($oDocument->get('title')); + + $year = substr($oDocument->get('regdate'),0,4); + $month = substr($oDocument->get('regdate'),4,2); + $day = substr($oDocument->get('regdate'),6,2); + $hour = substr($oDocument->get('regdate'),8,2); + $min = substr($oDocument->get('regdate'),10,2); + $sec = substr($oDocument->get('regdate'),12,2); + $time = mktime($hour,$min,$sec,$month,$day,$year); + $post->dateCreated = gmdate("D, d M Y H:i:s", $time); + $posts[] = $post; + } + $content = getXmlRpcResponse($posts); + printContent($content); + } + break; + + // 아무런 요청이 없을 경우 RSD 출력 + default : + + $homepagelink = getUrl('','mid',$this->mid); + $api_url = sprintf('%s%s/api', Context::getRequestUri(), $this->mid); + $content = << + + + zeroboardXE + http://www.zeroboard.com/ + {$homepagelink} + + + + + +RSDContent; + printContent($content); + break; + } + } +?> diff --git a/addons/blogapi/blogapi.func.php b/addons/blogapi/blogapi.func.php new file mode 100644 index 000000000..c1334dfd7 --- /dev/null +++ b/addons/blogapi/blogapi.func.php @@ -0,0 +1,67 @@ +\n\n\nfaultCode\n%d\n\n\nfaultString\n%s\n\n\n\n", + $error, + htmlspecialchars($message) + ); + } + + // 결과 표시 + function getXmlRpcResponse($params) { + $buff = ''."\n"; + $buff .= _getEncodedVal($params); + $buff .= "\n\n"; + + return $buff; + } + + // 인코딩 처리 + function _getEncodedVal($val, $is_sub_set = false) { + if(is_int($val)) $buff = sprintf("%d", $val); + elseif(is_double($val)) $buff = sprintf("%f", $val); + elseif(is_bool($val)) $buff = sprintf("%d", $val?1:0); + elseif(is_object($val)) { + $values = get_object_vars($val); + $val_count = count($values); + $buff = ""; + foreach($values as $k => $v) { + $buff .= sprintf("\n%s\n%s\n", htmlspecialchars($k), _getEncodedVal($v, true)); + } + $buff .= "\n"; + } elseif(is_array($val)) { + $val_count = count($val); + $buff = "\n"; + for($i=0;$i<$val_count;$i++) { + $buff .= _getEncodedVal($val[$i], true); + } + $buff .= "\n"; + } else { + $buff = sprintf("%s\n", $val); + } + if(!$is_sub_set) return sprintf("\n%s", $buff); + return $buff; + } + + // 결과 출력 + function printContent($content) { + header("Content-Type: text/xml; charset=UTF-8"); + header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + header("Cache-Control: no-store, no-cache, must-revalidate"); + header("Cache-Control: post-check=0, pre-check=0", false); + header("Pragma: no-cache"); + print $content; + exit(); + } +?> diff --git a/addons/blogapi/conf/info.xml b/addons/blogapi/conf/info.xml new file mode 100644 index 000000000..0357039f7 --- /dev/null +++ b/addons/blogapi/conf/info.xml @@ -0,0 +1,42 @@ + + + BlogAPI 애드온 + BlogAPI + BlogAPI + Addon for BlogAPI + BlogAPI Adicionales + + 제로 + Zero + zero + zero + zero + + metaWeblog를 지원하는 blogApi애드온입니다. + 사용으로 설정하시면 각 모듈마다 RSD 태그를 노출합니다. + api의 주소는 http://설치주소/모듈명/api 입니다. + 사용으로 하셔야 RSD태그 및 api가 동작을 합니다. + + + MetaWeblogをサポートするBlogAPI アドオンです。「使用する」をクリックして設定すると各モジュールごとRSDのアドレスを表示します。API のアドレスは「http://インストールURL/モジュール名/api」です。 「使用する」に設定しておけば RSDのアドレスが表示され、 API が動作します。 + + + 支持metaWeblog的 blogApi插件。 + 设置为"启用"时,会使每个模块都会显示RSD标签。 + api地址为http://安装地址/模块名/api。 + 把状态设置为"使用"时,才会激活RSD标签及api。 + + + This blogApi addon supports metaWeblog. + Toggling this with use option lets RSD tag be exposed for each module. + URL to the api is http://setup_path/module_name/api. + Only selecting use option enables RSD tag and api to behave. + + + Es adicionales para soporte de metaWeblog. + Si marcar en uso, cada modulas van a exponer RSD etiqueta. + dirección de es, http://dirección de instalación/nombre de modula/api. + Para funcionar RSD etiqueta y API, es nesesario marcar USAR. + + + diff --git a/addons/counter/conf/info.xml b/addons/counter/conf/info.xml new file mode 100644 index 000000000..52230ebe6 --- /dev/null +++ b/addons/counter/conf/info.xml @@ -0,0 +1,33 @@ + + + 기본 카운터 애드온 + 接続カウンター + 网站访问统计 + Addon for basic counter + Adición Taquilla Predeterminado + + 제로 + Zero + zero + zero + zero + + 제로보드XE의 기본 카운터 모듈을 이용하여 접속 정보를 기록합니다. + 이 애드온을 켜셔야 접속 정보 수집이 됩니다. + + + セロボードXEの接続カウンターモジュールは、接続情報を記録します。このアドオンを「使用」に設定しておくと接続情報が記録されます。 + + + 利用ZeroboardXE的网站访问统计模块记录网站访问信息。 + 把状态设置为"使用"时,才会记录网站访问信息. + + + This addon logs access information based on the basic counter module within Zeroboard XE. + It is necessary for aggregation of access information to turn on this addon. + + + Contar los visitantes con la taquilla predeterminado de ZeroBoardXE. Es necesario aprender esta adición para acumular las información de visitos. + + + diff --git a/addons/counter/counter.addon.php b/addons/counter/counter.addon.php new file mode 100644 index 000000000..fc2bed4ae --- /dev/null +++ b/addons/counter/counter.addon.php @@ -0,0 +1,20 @@ +module != 'admin') Context::addJsFile('./modules/counter/tpl/js/counter.js'); + $GLOBALS['__counter_addon_called__'] = true; + } +?> diff --git a/addons/google_adsense/conf/info.xml b/addons/google_adsense/conf/info.xml new file mode 100644 index 000000000..85077dded --- /dev/null +++ b/addons/google_adsense/conf/info.xml @@ -0,0 +1,194 @@ + + + 게시글 구글 애드센스 연동 + グーグル・アドセンス + Google AdSense + Linkage of Articles and Google Adsense + + 제로 + Zero + zero + zero + + 게시글의 상/하단에 구글 애드센스를 추가할 수 있습니다. + 추가확장폼에서 사용자에게 구글애드센스 코드를 받게 하여 글쓴이와 연동되는 애드센스 출력이 가능합니다. + 이 기능을 사용하지 않거나 사용자가 애드센스 코드를 입력하지 않았다면 기본으로 설정된 애드센스 코드가 사용됩니다. + 색상을 입력할때는 # 을 제외한 나머지 6자리의 색상코드를 입력해주세요. + 위치를 top 또는 bottom을 입력하시면 게시글 상단 또는 하단에 광고를 출력할 수 있습니다. + + + コンテンツ(書き込み)の上・下段にグーグル・アドセンス(Google AdSense)を追加することができます。追加拡張フォームに、グーグル・アドセンス(Google AdSense)コードを入力すると、書き込みにユーザ自身のグーグル・アドセンス(Google AdSense)が挿入できます。 + + この機能を使わない、またはユーザがグーグル・アドセンス(Google AdSense)コードを入力しない場合は、デフォルトで設定されたアドセンス適用されます。文字列などに色を使用する場合は、「 #」を除く6ケタのカラーコードを入力してください。 + + 「top」または「bottom」を入力すると書き込みの上段または下段に広告を出力することができます。 + + + 可以把Google AdSense添加到文章的上/下端。 + 可以让用户在扩展表单里获得Google AdSense代码,从而也可以显示与作者相关联的AdSense。 + 不使用此功能或用户没有输入Google AdSense代码时,使用默认的AdSense代码。 + 输入颜色时,输入除#以外的 6位颜色代码。 + 指定显示位置时,输入top或bottom即可把AdSense显示在内容的上端或下端。 + + + Google Adsense can be added at top/bottom of article. + An adsense linked with writer can be displayed by Google adsense code input by user in additional form. + If this isn't used or user hasn't input the adsense code, the default adsense code will be used. + To use color, input 6 color code except '#'. + You can display the ad at the top or the bottom of article by input Position as top or bottom. + + + + + 위치 + 位置 + 位置 + Position + top : 게시글 상단, bottom : 게시글 하단 을 지정하실 수 있습니다. + top : 本文の上段, bottom : 本文の下段 + 可以指定显示位置。(top : 内容上端, bottom : 内容下端) + You can set top : top of article, bottom : bottom of article. + + + 구글 애드센스 키 + アドセンスキー + Google Adsense Key + Google Adsense Key + 기본으로 사용될 구글 애드센스 키를 입력해주세요. + デフォルトで使用するグーグルアドセンスキーを入力してください。 + 请输入要使用的默认Google Adsense Key。 + Please input Google Adsense key to use as default. + + + 회원 키 항목 이름 + キー項目名 + 会员Key项目名 + Name of Member Key Item + 회원의 구글 애드센스를 허락하시려면 가입항목중 구글 키 입력 항목 이름을 입력해주세요. + グーグル・アドセンスが使用できるようするにためには、加入項目でグーグルキー入力項目名を入力してください。 + + 允许会员使用个人Google AdSense时,请输入要在会员注册项目中显示的Google Key项目名。 + To permit members' Google Adsense, please input name of Google key item in join items. + + + 가로 길이 + 横幅 + 宽度 + Width + 애드센스의 가로길이를 입력해주세요. + アドセンスの横幅のサイズを入力してください + 请输入AdSense的宽度大小。 + Please input width of Adsense. + + + 세로 길이 + 縦幅 + 高度 + Height + 애드센스의 세로길이를 입력해주세요. + アドセンスの立幅のサイズを入力してください。 + 请输入高度大小。 + Please input height of Adsense. + + + 포맷 + フォーマット + 格式 + Format + 애드센스 포맷을 입력해주세요. + アドセンスのフォーマットを入力してください。 + 请输入广告格式 + Please input format of Adsense. + + + 타입 + タイプ + 样式 + Type + 애드센스의 타입을 입력해주세요. + アドセンスのタイプを入力してください。 + 请输入AdSense样式。 + Please input type of Adsense. + + + 채널 + チャンネル + 频道 + Channel + 채널을 입력해주세요. (사용자 정의 구글 애드센스일 경우 사용되지 않습니다) + チャンネルを入力してください(カスタマイズ・グーグル・アドセンスには使用されません)。 + 请输入频道。 (用户自定义Google AdSense不使用频道) + Please input channel. (It will not be used for custom Google Adsense) + + + 외곽선 색상 + ボーダカラー + 边框颜色 + Border Color + 외곽선 색상을 입력해주세요. + ボーダーカラーを入力してください。. + 请输入边框颜色。 + Please input color of border. + + + 배경색 + 背景色 + 背景色 + Background Color + 배경색상을 입력해주세요. + 背景色を入力してください + 请输入背景颜色。 + Please input color of background. + + + 링크 글자색 + リンク色 + 链接颜色 + Link Color + 링크가 걸린 글자의 색상을 입력해주세요. + リンクの文字列の色を入力してください。 + 请输入链接颜色。 + Please input color of linked text. + + + 글자 색 + 文字列色 + 字体颜色 + Text Color + 링크가 걸리지 않은 글자의 색을 입력해주세요 + 文字列の色を入力してください。 + 请输入没有链接字体颜色。 + Please input color of text. + + + URL 색 + URL色 + URL 颜色 + URL Color + URL의 글자색을 입력해주세요. + URLの色を入力してください。 + 请输入URL的颜色。 + Please input color of URL. + + + 테두리 형태 + ボーダスタイル + 边框样式 + Border Style + 테두리 형태를 입력해주세요. + ボーダースタイルを入力してください。 + 请输入边框样式。 + Please input style of border. + + + 배경 이미지를 입력해주세요. + 背景イメージ + 请输入背景图片。 + Please input image of background. + 접근가능한 웹서버에 올린 배경 이미지의 URL을 입력해주세요. + アクセス可能なWebサーバにアップロードされている背景イメージのURLを入力してください。 + 请输入有效的图片URL。 + Please input URL of background image which is uploaded on accessible web server. + + + diff --git a/addons/google_adsense/google_adsense.addon.php b/addons/google_adsense/google_adsense.addon.php new file mode 100644 index 000000000..5fa45eb00 --- /dev/null +++ b/addons/google_adsense/google_adsense.addon.php @@ -0,0 +1,23 @@ +position == "top") $pos_regx = "!<\!--BeforeDocument\(([0-9]+),([0-9]+)\)-->!is"; + else $pos_regx = "!<\!--AfterDocument\(([0-9]+),([0-9]+)\)-->!is"; + + $GLOBALS['__g_addon_info__'] = $addon_info; + + $output = preg_replace_callback($pos_regx, matchDocument, $output); +?> diff --git a/addons/google_adsense/google_adsense.lib.php b/addons/google_adsense/google_adsense.lib.php new file mode 100644 index 000000000..9d4f79d21 --- /dev/null +++ b/addons/google_adsense/google_adsense.lib.php @@ -0,0 +1,53 @@ +user_ad_client) { + $oMemberModel = &getModel('member'); + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + $key = $member_info->{$addon_info->user_ad_client}; + if($key) { + $addon_info->ad_client = $key; + $addAdSense->ad_type = ''; + } + } + + $adsense_code = addAdSense($addon_info); + + return $source_code.$adsense_code; + } + + function addAdSense($addon_info) { + $script_code = << + + +EndOfScript; + + if($addon_info->background_image) $backgroundStyle = sprintf('background-image:url(%s)', $addon_info->background_image); + + $script_code = sprintf('
%s
',$addon_info->ad_width, $addon_info->ad_height, $backgroundStyle, $script_code); + + return $script_code; + } + +?> diff --git a/addons/member_extra_info/conf/info.xml b/addons/member_extra_info/conf/info.xml new file mode 100644 index 000000000..51ea8c593 --- /dev/null +++ b/addons/member_extra_info/conf/info.xml @@ -0,0 +1,64 @@ + + + 사용자 추가 정보 및 커뮤니케이션 기능 활성화 + 会員情報・コミュニティ + 用户扩展信息 + Addon for enabling facilities for providing additional information about users and communicating + Informaciónes addciónales del usuario y actualzación del función communicación. + + 제로 + Zero + zero + zero + zero + + 사용자의 정보중 이미지이름, 이미지마크, 서명등을 화면에 출력해주는 애드온입니다. + 이런 정보들을 사용하지 않을 경우를 대비하여 별도의 애드온으로 빼어서 실행시간을 줄여줍니다. + 이미지이름, 이미지마크, 서명등을 노출하고 싶다면 이 애드온을 활성화 시키세요. + 1. 출력되기 직전 &lt;div class="member_회원번호"&gt;....&lt;/div&gt; 로 정의가 된 부분을 찾아 회원번호를 구해서 이미지이름, 이미지마크가 있는지를 확인하여 있으면 내용을 변경해버립니다. + 2. 출력되기 직전 &lt;div class="document_번호"&gt;...&lt;/div&gt;로 정의된 곳을 찾아 글의 내용이라 판단, 하단에 서명을 추가합니다. + 3. 새로운 쪽지가 왔을 경우 팝업으로 띄움 + 4. MemberModel::getMemberMenu 호출시 대상이 회원일 경우 쪽지 보내기 기능 추가합니다. + 5. MemberModel::getMemberMenu 호출시 친구 등록 메뉴를 추가합니다. + + + 会員情報のイメージ名、イメージマーク、署名などを画面に表示するアドオンです。このような情報を使用しない場合、アドオンを「使用」に設定すれば、実行時間を少なくします。イメージ名、イメージマーク、署名などを表示させたい時は、このアドオンを「使用」に設定して下さい。 + + 1. 出力の直前 <div class="member_会員番号">....</div> に定義された部分を探し、会員番号をチェックしてイメージ名、イメージマークがあるかを確認します。あった場合は内容を変更します + 2. 出力の直前 <div class="document_番号">...</div>に定義された部分を探し、書込みの内容だと判断して、下段に署名を追加します + 3. 新しいメッセージが来た場合ポップアップで表示します + 4. MemberModel::getMemberMenu を呼出す時、相手が会員の場合はメッセージ送信の機能を追加します + 5. MemberModel::getMemberMenu を呼出す時、友達登録メニュを追加します + + + 此插件将把用户信息中的昵称图片,用户图标,签名等信息显示到页面当中。 + 因部分用户不使用此项功能或为了考虑页面载入速度,以插件形式提供此项功能。 + 要想使用会员扩展信息请激活此插件。 + 1. 显示之前先查找定义为 &lt;div class="member_会员编号"&gt;....&lt;/div&gt; 的部分获得会员编号后,再以会员编号确认有没有昵称图片/用户图标,有的话即可更新相关内容。 + 2. 显示之前先查找定义为 &lt;div class="document_编号"&gt;...&lt;/div&gt;的部分判断此处为主题内容后,在此处下方添加个人签名。 + 3. 收到新消息时,用弹出窗口显示。 + 4. 呼出MemberModel::getMemberMenu时,如对方是会员,就添加[发送短消息]功能。 + 5. 呼出MemberModel::getMemberMenu时,添加[加为好友]菜单。 + + + Among other information about users, this addon displays image name, image mark, and signature. + In case of you not use this information, this stands apart from basic information so runtime should be reduced. + To expose image name, image mark, and signature, please turn on this addon. + 1. Just before displaying user information, this will figure out unique key of member from the definition of "&lt;div class="member_{unique key of member}"&gt;....&lt;/div&gt;" and replace image name and/or image mark if they exsist. + 2. Just before displaying, this is gonna locate the definition of "&lt;div class="document_{unique key of document}"&gt;...&lt;/div&gt;" and insert the signature below it. + 3. When arrived a new slip, this will popup it. + 4. This makes available to send a slip if the target is a member when MemberModel::getMemberMenu is called. + 5. This adds a menu for registering as a friend when MemberModel::getMemberMenu is called. + + + Se muestra nombre de imagén, marcador de imagén, firma del usuario. + para cortar la ejecución de programa, si no es necessario, puede apagar la function adicionales. + Necesita actualizar este funcion, por favor haga clic en ´usar´. + 1. Este adición busca <div class="member_Num. usuario">....</div> en los documentos, y calcula numero de usuario. Y si hay nombre de imagen, marcador de imagen, se cambia el contenido. + 2. Este adicion busca <div class="document_Num. documentos">...</div> en los documentos, coloca la firma donde interpreta el termino de contenido. + 3. Si llega nota, se muestra en pop up. + 4. Si llama MemberModel::getMemberMenu, si es miembro, funcion de "mandar nota" se actualiza. + 5. Si llama MemberModel::getMemberMenu, el addiciona menú ¨agregar contacto¨. + + + diff --git a/addons/member_extra_info/lang/en.lang.php b/addons/member_extra_info/lang/en.lang.php new file mode 100644 index 000000000..462d12387 --- /dev/null +++ b/addons/member_extra_info/lang/en.lang.php @@ -0,0 +1,3 @@ +alert_new_message_arrived = 'You got a new message. Do you want to check now?'; +?> diff --git a/addons/member_extra_info/lang/jp.lang.php b/addons/member_extra_info/lang/jp.lang.php new file mode 100644 index 000000000..3a5dfc9c6 --- /dev/null +++ b/addons/member_extra_info/lang/jp.lang.php @@ -0,0 +1,3 @@ +alert_new_message_arrived = '新しいメッセージが届きました。確認しますか。'; +?> diff --git a/addons/member_extra_info/lang/ko.lang.php b/addons/member_extra_info/lang/ko.lang.php new file mode 100644 index 000000000..5dc594d0d --- /dev/null +++ b/addons/member_extra_info/lang/ko.lang.php @@ -0,0 +1,3 @@ +alert_new_message_arrived = '새로운 메세지가 도착하였습니다. 확인하시겠습니까?'; +?> diff --git a/addons/member_extra_info/lang/zh-CN.lang.php b/addons/member_extra_info/lang/zh-CN.lang.php new file mode 100644 index 000000000..497b4ef68 --- /dev/null +++ b/addons/member_extra_info/lang/zh-CN.lang.php @@ -0,0 +1,3 @@ +alert_new_message_arrived = '您有新消息。要确认吗?'; +?> diff --git a/addons/member_extra_info/member_extra_info.addon.php b/addons/member_extra_info/member_extra_info.addon.php new file mode 100644 index 000000000..af4777ed9 --- /dev/null +++ b/addons/member_extra_info/member_extra_info.addon.php @@ -0,0 +1,111 @@ +.... 로 정의가 된 부분을 찾아 회원번호를 구해서 + * 이미지이름, 이미지마크가 있는지를 확인하여 있으면 내용을 변경해버립니다. + * + * 2. 출력되기 직전
...
로 정의된 곳을 찾아 글의 내용이라 판단, + * 하단에 서명을 추가합니다. + * + * 3. 새로운 쪽지가 왔을 경우 팝업으로 띄움 + * + * 4. MemberModel::getMemberMenu 호출시 대상이 회원일 경우 쪽지 보내기 기능 추가합니다. + * + * 5. MemberModel::getMemberMenu 호출시 친구 등록 메뉴를 추가합니다. + * + **/ + + /** + * 1,2 기능 수행 : 출력되기 바로 직전일 경우에 이미지이름/이미지마크등을 변경 + * 조건 : called_position == 'before_display_content' + **/ + if($called_position == "before_display_content") { + + // 기본적인 기능이라 MemberController 에 변경 코드가 있음 + $oMemberController = &getController('member'); + + // 1. 출력문서중에서
content
를 찾아 MemberController::transImageName() 를 이용하여 이미지이름/마크로 변경 + $output = preg_replace_callback('!<(div|span)([^\>]*)member_([0-9]+)([^\>]*)>(.*?)\<\/(div|span)\>!is', array($oMemberController, 'transImageName'), $output); + + // 2. 출력문서중에 를 찾아서 member_controller::transSignature()를 이용해서 서명을 추가 + $output = preg_replace_callback('//i', array($oMemberController, 'transSignature'), $output); + + /** + * 3 기능 수행 : 시작할때 새쪽지가 왔는지 검사 + * 조건 : called_position = 'before_module_init', module != 'member' + **/ + } elseif($called_position == 'before_module_init' && $this->module != 'member' && Context::get('is_logged') ) { + + // 로그인된 사용자 정보를 구함 + $logged_info = Context::get('logged_info'); + + $flag_path = './files/member_extra_info/new_message_flags/'.getNumberingPath($logged_info->member_srl); + $flag_file = sprintf('%s%s', $flag_path, $logged_info->member_srl); + + // 새로운 쪽지에 대한 플래그가 있으면 쪽지 보기 팝업 띄움 + if(file_exists($flag_file)) { + @unlink($flag_file); + Context::loadLang('./addons/member_extra_info/lang'); + $script = sprintf('', Context::getLang('alert_new_message_arrived'), Context::getRequestUri().'?module=member&act=dispMemberNewMessage'); + Context::addHtmlHeader( $script ); + } + + /** + * 4,5 기능 수행 : 사용자 이름을 클릭시 요청되는 MemberModel::getMemberMenu 후에 $menu_list에 쪽지 발송, 친구추가등의 링크 추가 + * 조건 : called_position == 'after_module_proc', module = 'member', act = 'getMemberMenu' + **/ + } elseif($called_position == 'after_module_proc' && $this->module == 'member' && $this->act == 'getMemberMenu') { + // 비로그인 사용자라면 패스 + if(!Context::get('is_logged')) return; + + // 로그인된 사용자 정보를 구함 + $logged_info = Context::get('logged_info'); + $member_srl = Context::get('member_srl'); + + // 템플릿에서 사용되기 전의 menu_list를 가져옴 + $menu_list = $this->get('menu_list'); + + // 자신이라면 쪽지함 보기 기능 추가 + if($logged_info->member_srl == $member_srl) { + + // 4. 자신의 쪽지함 보기 기능 추가 + $menu_str = Context::getLang('cmd_view_message_box'); + $menu_link = "current_url.setQuery('act','dispMemberMessages')"; + $menu_list .= sprintf("\n%s,%s,move_url(%s,'Y')", Context::getRequestUri().'/modules/member/tpl/images/icon_message_box.gif', $menu_str, $menu_link); + + // 5. 친구 목록 보기 + $menu_str = Context::getLang('cmd_view_friend'); + $menu_link = "current_url.setQuery('act','dispMemberFriend')"; + $menu_list .= sprintf("\n%s,%s,move_url(%s,'Y')", Context::getRequestUri().'/modules/member/tpl/images/icon_friend_box.gif',$menu_str, $menu_link); + + + // 아니라면 쪽지 발송, 친구 등록 추가 + } else { + + // 대상 회원의 정보를 가져옴 + $target_member_info = $this->getMemberInfoByMemberSrl($member_srl); + + // 4. 쪽지 발송 메뉴를 만듬 + if( $target_member_info->allow_message =='Y' || ($target_member_info->allow_message == 'F' && $this->isFriend($member_srl))) { + $menu_str = Context::getLang('cmd_send_message'); + $menu_link = sprintf('%s?module=member&act=dispMemberSendMessage&receiver_srl=%s',Context::getRequestUri(),$member_srl); + $menu_list .= sprintf("\n%s,%s,popopen('%s','sendMessage')", Context::getRequestUri().'/modules/member/tpl/images/icon_write_message.gif', $menu_str, $menu_link); + } + + // 5. 친구 등록 메뉴를 만듬 (이미 등록된 친구가 아닐 경우) + if(!$this->isAddedFriend($member_srl)) { + $menu_str = Context::getLang('cmd_add_friend'); + $menu_link = sprintf('%s?module=member&act=dispMemberAddFriend&target_srl=%s',Context::getRequestUri(),$member_srl); + $menu_list .= sprintf("\n%s,%s,popopen('%s','addFriend')", Context::getRequestUri().'/modules/member/tpl/images/icon_add_friend.gif', $menu_str, $menu_link); + } + } + + // 템플릿에 적용되게 하기 위해 module의 variables에 재등록 + $this->add('menu_list', $menu_list); + } +?> diff --git a/addons/openid_delegation_id/conf/info.xml b/addons/openid_delegation_id/conf/info.xml new file mode 100644 index 000000000..767e00699 --- /dev/null +++ b/addons/openid_delegation_id/conf/info.xml @@ -0,0 +1,72 @@ + + + OpenID delegation ID + OpenID + Addon for delegating domain name to OpenID + delegación ID para OpenID + OpenID + + 제로 + zero + zero + zero + Zero + + 본인의 도메인을 사용하여 오픈아이디로 활용할 수 있도록 합니다. + 꼭 설정을 통해서 openid provider관련 값을 입력후 사용해주세요. + + + 可以把本人的域名当分散式身份验证系统(OpenID)来使用。 + 必须在设置中输入openid provider相关值后再使用。 + + + This addon enables you to use your own domian name as an OpenID. + Just be sure to set the values related with openid provider before using. + + + Utliza su dominio para usar OpenID. + La configuración es necesario. + + + 保有するドメインをオープンIDとして活用することができます。必ず設定で、OpenIDのプロバイダー関連の情報を入力してから使用してください。 + + + + + server + server + server + Servidor + server + openid.server 값을 입력해 주세요. + 请输入 openid.server 值。 + Please input your openid.server value. + Servidor de OpenID. + openid.server の値を入力してください。 + + + delegate + delegate + delegate + Delegador + delegate + openid.delegate값을 입력해주세요. + 请输入 openid.delegate 值。 + Please input your openid.delegate value. + Delegador de OpenID + openid.delegate の値を入力してください。 + + + xrds + xrds + xrds + xrds + xrds + X-XRDS-Location값을 입력해주세요. + 请输入 X-XRDS-Location 值。 + Please input your X-XRDS-Location value. + ubicación de X-XRDS + X-XRDS-Location の値を入力してください。 + + + diff --git a/addons/openid_delegation_id/openid_delegation_id.addon.php b/addons/openid_delegation_id/openid_delegation_id.addon.php new file mode 100644 index 000000000..ee53bc75a --- /dev/null +++ b/addons/openid_delegation_id/openid_delegation_id.addon.php @@ -0,0 +1,29 @@ +server||!$addon_info->delegate||!$addon_info->xrds) return; + + $header_script = sprintf( + ''."\n". + ''."\n". + '', + $addon_info->server, + $addon_info->delegate, + $addon_info->xrds + ); + + Context::addHtmlHeader($header_script); +?> diff --git a/addons/point/conf/info.xml b/addons/point/conf/info.xml new file mode 100644 index 000000000..f3c29dfcc --- /dev/null +++ b/addons/point/conf/info.xml @@ -0,0 +1,25 @@ + + + 포인트 활성화 애드온 + 积分插件 + ポイントシステム + Addon for activating point + + 제로 + Zero + Zero + zero + + 포인트시스템 모듈에 설정된 내용을 바탕으로 글작성/삭제/댓글작성/삭제/파일업로드/삭제/다운로드등의 행동에 대해서 포인트를 기록합니다. + + + 以积分系统模块中设置的内容为基础,对发表/删除新帖,发表/删除评论,上传/下载/删除/文件等动作记录为积分。 + + + ポイントシステムモジュールで設定された内容を基に、書き込み作成・削除/コメント作成・削除/ファイルアップロード・削除/ダウンロードなどのユーザの活動に対してポイントを記録します。 + + + This addon records point on writing/deleting/adding comments/deleting comments/uploading/downloading following to point system module. + + + 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/conf/info.xml b/addons/point_level_icon/conf/info.xml new file mode 100644 index 000000000..e198042a5 --- /dev/null +++ b/addons/point_level_icon/conf/info.xml @@ -0,0 +1,28 @@ + + + 포인트 레벨 아이콘 표시 애드온 + 积分级别图标 + ポイントレベルアイコン + Addon for displaying level icon + + 제로 + Zero + Zero + zero + + 포인트 시스템을 사용중일 경우 사용자 이름 앞에 레벨 아이콘을 표시하도록 합니다. + 레벨 아이콘은 모듈 > 포인트시스템에서 선택 가능합니다. + + + 使用积分系统时,可以在用户名前显示级别图标。 + 级别图标可以在模块 > 积分系统中进行选择。 + + + ポイントシステムを使用している場合、ユーザ名の前にレベルアイコンを表示させます。レベルアイコンは、「モジュール>ポイントシステム」で選択できます。 + + + This addon displays level icon in front of user name when point system is using. + You can choose level icon on Module > Point System. + + + 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..952e25c1d --- /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/addons/rainbow_link/conf/info.xml b/addons/rainbow_link/conf/info.xml new file mode 100644 index 000000000..2134040d3 --- /dev/null +++ b/addons/rainbow_link/conf/info.xml @@ -0,0 +1,34 @@ + + + 레인보우 링크 애드온 + Rainbow 链接 + Addon for rainbow links + Adición Enlace Arco Iris + レインボーリンク + + dynamicdrive.com + dynamicdrive.com + dynamicdrive.com + dynamicdrive.com + dynamicdrive.com + + rainbow.js를 header에 추가하여 링크가 걸린 글의 색을 무지개색으로 나타냅니다. + 이 애드온의 rainbow.js는 <a href="http://www.dynamicdrive.com" target="_blank">Dynamicdrive.com</a>에 저작권이 있습니다. + + + 把rainbow.js添加到header区使链接显示为彩虹色。 + 此插件的rainbow.js文件版权属于 <a href="http://www.dynamicdrive.com" target="_blank">Dynamicdrive.com</a> + + + This addon adds a file named "rainbow.js" to headers, then linked text will get chameleon(rainbow) color change effect. + "rainbow.js" Copyrightⓒ2007 <a href="http://www.dynamicdrive.com" target="_blank">Dynamicdrive.com</a>. + + + incluye rainbow.js en header para mostrar enlaces en colores de arco iris. + <a href="http://www.dynamicdrive.com" target="_blank">Dynamicdrive.com</a> tiene derecho de autor sobre rainbow.js + + + 「rainbow.js」をヘッダーに追加し、リンクされている文字列の色を虹色で表示します。この機能拡張の「 rainbow.js」は「<a href="http://www.dynamicdrive.com" target="_blank">Dynamicdrive.com</a>」に著作権があります。 + + + diff --git a/addons/rainbow_link/js/rainbow.js b/addons/rainbow_link/js/rainbow.js new file mode 100644 index 000000000..5e8421bcb --- /dev/null +++ b/addons/rainbow_link/js/rainbow.js @@ -0,0 +1,245 @@ +/************************************************************************/ +/* Rainbow Links Version 1.03 (2003.9.20) */ +/* Script updated by Dynamicdrive.com for IE6 */ +/* Copyright (C) 1999-2001 TAKANASHI Mizuki */ +/* takanasi@hamal.freemail.ne.jp */ +/*----------------------------------------------------------------------*/ +/* Read it somehow even if my English text is a little wrong! ;-) */ +/* */ +/* Usage: */ +/* Insert '' into the BODY section, */ +/* right after the BODY tag itself, before anything else. */ +/* You don't need to add "onMouseover" and "onMouseout" attributes!! */ +/* */ +/* If you'd like to add effect to other texts(not link texts), then */ +/* add 'onmouseover="doRainbow(this);"' and */ +/* 'onmouseout="stopRainbow();"' to the target tags. */ +/* */ +/* This Script works with IE4,Netscape6,Mozilla browser and above only, */ +/* but no error occurs on other browsers. */ +/************************************************************************/ + + +//////////////////////////////////////////////////////////////////// +// Setting + +var rate = 20; // Increase amount(The degree of the transmutation) + + +//////////////////////////////////////////////////////////////////// +// Main routine + +/* +if (document.getElementById) +window.onerror=new Function("return true") +*/ + +var objActive; // The object which event occured in +var act = 0; // Flag during the action +var elmH = 0; // Hue +var elmS = 128; // Saturation +var elmV = 255; // Value +var clrOrg; // A color before the change +var TimerID; // Timer ID + + +if(xIE4Up) { + xAddEventListener(document, 'mouseover', doRainbowAnchor); + xAddEventListener(document, 'mouseout', stopRainbowAnchor); +} else { + xAddEventListener(document, 'mouseover', Mozilla_doRainbowAnchor); + xAddEventListener(document, 'mouseout', Mozilla_stopRainbowAnchor); +} +/* +if (document.all) { + document.onmouseover = doRainbowAnchor; + document.onmouseout = stopRainbowAnchor; +} +else if (document.getElementById) { + document.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT); + document.onmouseover = Mozilla_doRainbowAnchor; + document.onmouseout = Mozilla_stopRainbowAnchor; +} +*/ + + +//============================================================================= +// doRainbow +// This function begins to change a color. +//============================================================================= +function doRainbow(obj) +{ + if (act == 0) { + act = 1; + if (obj) + objActive = obj; + else + objActive = event.srcElement; + clrOrg = objActive.style.color; + TimerID = setInterval("ChangeColor()",100); + } +} + + +//============================================================================= +// stopRainbow +// This function stops to change a color. +//============================================================================= +function stopRainbow() +{ + if (act) { + objActive.style.color = clrOrg; + clearInterval(TimerID); + act = 0; + } +} + + +//============================================================================= +// doRainbowAnchor +// This function begins to change a color. (of a anchor, automatically) +//============================================================================= +function doRainbowAnchor() +{ + try { + if (act == 0) { + var obj = event.srcElement; + while (obj.tagName != 'A' && obj.tagName != 'BODY') { + obj = obj.parentElement; + if (obj.tagName == 'A' || obj.tagName == 'BODY') + break; + } + + if (obj.tagName == 'A' && obj.href != '') { + objActive = obj; + act = 1; + clrOrg = objActive.style.color; + TimerID = setInterval("ChangeColor()",100); + } + } + } catch(e) { + } +} + + +//============================================================================= +// stopRainbowAnchor +// This function stops to change a color. (of a anchor, automatically) +//============================================================================= +function stopRainbowAnchor() +{ + if (act) { + if (objActive.tagName == 'A') { + objActive.style.color = clrOrg; + clearInterval(TimerID); + act = 0; + } + } +} + + +//============================================================================= +// Mozilla_doRainbowAnchor(for Netscape6 and Mozilla browser) +// This function begins to change a color. (of a anchor, automatically) +//============================================================================= +function Mozilla_doRainbowAnchor(evt) +{ + var e = new xEvent(evt); + if (act == 0) { + obj = e.target; + while (obj.nodeName != 'A' && obj.nodeName != 'BODY') { + obj = obj.parentNode; + if(typeof(obj)=='undefined'||!obj) return; + if (obj.nodeName == 'A' || obj.nodeName == 'BODY') break; + } + + if (obj.nodeName == 'A' && obj.href != '') { + objActive = obj; + act = 1; + clrOrg = obj.style.color; + TimerID = setInterval("ChangeColor()",100); + } + } +} + + +//============================================================================= +// Mozilla_stopRainbowAnchor(for Netscape6 and Mozilla browser) +// This function stops to change a color. (of a anchor, automatically) +//============================================================================= +function Mozilla_stopRainbowAnchor(e) +{ + if (act) { + if (objActive.nodeName == 'A') { + objActive.style.color = clrOrg; + clearInterval(TimerID); + act = 0; + } + } +} + + +//============================================================================= +// Change Color +// This function changes a color actually. +//============================================================================= +function ChangeColor() +{ + objActive.style.color = makeColor(); +} + + +//============================================================================= +// makeColor +// This function makes rainbow colors. +//============================================================================= +function makeColor() +{ + // Don't you think Color Gamut to look like Rainbow? + + // HSVtoRGB + if (elmS == 0) { + elmR = elmV; elmG = elmV; elmB = elmV; + } + else { + t1 = elmV; + t2 = (255 - elmS) * elmV / 255; + t3 = elmH % 60; + t3 = (t1 - t2) * t3 / 60; + + if (elmH < 60) { + elmR = t1; elmB = t2; elmG = t2 + t3; + } + else if (elmH < 120) { + elmG = t1; elmB = t2; elmR = t1 - t3; + } + else if (elmH < 180) { + elmG = t1; elmR = t2; elmB = t2 + t3; + } + else if (elmH < 240) { + elmB = t1; elmR = t2; elmG = t1 - t3; + } + else if (elmH < 300) { + elmB = t1; elmG = t2; elmR = t2 + t3; + } + else if (elmH < 360) { + elmR = t1; elmG = t2; elmB = t1 - t3; + } + else { + elmR = 0; elmG = 0; elmB = 0; + } + } + + elmR = Math.floor(elmR).toString(16); + elmG = Math.floor(elmG).toString(16); + elmB = Math.floor(elmB).toString(16); + if (elmR.length == 1) elmR = "0" + elmR; + if (elmG.length == 1) elmG = "0" + elmG; + if (elmB.length == 1) elmB = "0" + elmB; + + elmH = elmH + rate; + if (elmH >= 360) + elmH = 0; + + return '#' + elmR + elmG + elmB; +} diff --git a/addons/rainbow_link/rainbow_link.addon.php b/addons/rainbow_link/rainbow_link.addon.php new file mode 100644 index 000000000..d47082f38 --- /dev/null +++ b/addons/rainbow_link/rainbow_link.addon.php @@ -0,0 +1,19 @@ + diff --git a/addons/spamfilter/conf/info.xml b/addons/spamfilter/conf/info.xml new file mode 100644 index 000000000..e7c7859ed --- /dev/null +++ b/addons/spamfilter/conf/info.xml @@ -0,0 +1,34 @@ + + + 스팸필터 애드온 + 垃圾过滤 + Addon for filtering spam + Adición Filtros para artículos no deseado + スパムフィルター + + 제로 + zero + zero + zero + Zero + + SpamFilter 모듈을 이용하여 글/코멘트/트랙백 등록 이전에 스팸 필터링 및 도배 방지를 합니다. + 자세한 설정은 " 스팸필터 모듈" 에서 해주세요. + + + 利用垃圾过滤模块在发表主题/评论/引用之前进行垃圾过滤。 + 请在" 垃圾过滤模块"中详细设置。 + + + This addon filters spam and prevents users from cluttering before saving entries, comments, or trackbacks to database by setting SpamFilter module. + You can set up more details on "Spam Filter module". + + + Utiliza SpamFilter para bloquear los artículos/ commentarios/ trackback no deseado. + Para configurar haga clic " Configurar la modula SpamFilter."..º + + + SpamFilterモジュールを利用して書き込み・コメント・トラックバックが登録される前にフィルタリングを行います。更に連続書き込みやロボットによる自動書き込みなどを防ぐことができます。詳細な設定は " スパムフィルターモジュール " で行ってください。 + + + diff --git a/addons/spamfilter/spamfilter.addon.php b/addons/spamfilter/spamfilter.addon.php new file mode 100644 index 000000000..e605e64ce --- /dev/null +++ b/addons/spamfilter/spamfilter.addon.php @@ -0,0 +1,133 @@ +act, $effecived_target_act)) return; + + // 각 모듈별 act에 대해서도 피해갈 부분이 있으면 피해감 + switch($this->act) { + + // 게시물 작성시 신규 등록이 아니면 패스~ + case 'procBoardInsertDocument' : + // document module의 model 객체 생성 + $oDocumentModel = &getModel('document'); + + // 이미 존재하는 글인지 체크 + $document_srl = Context::get('document_srl'); + $oDocument = $oDocumentModel->getDocument($document_srl); + + // 이미 존재하는 글이라면 return + if($oDocument->isExists()) return; + break; + + // 댓글 작성시 신규 등록이 아니면 패스~ + case 'procBoardInsertComment' : + case 'procBlogInsertComment' : + $comment_srl = Context::get('comment_srl'); + $oCommentModel = &getModel('comment'); + + // 이미 존재하는 댓글인지 체크 + $comment = $oCommentModel->getComment($comment_srl); + if($comment->comment_srl == $comment_srl) return; + break; + } + + // 현재 모듈의 관리자이거나 그에 준하는 manager권한이면 그냥 패스 + if($this->grant->is_admin || $this->grant->manager) return; + + // 현 접속자의 ip address를 구함 + $ipaddress = $_SERVER['REMOTE_ADDR']; + + // spamfilter 모듈 객체 생성 + $oSpamFilterController = &getController('spamfilter'); + $oSpamFilterModel = &getModel('spamfilter'); + + // 스팸필터 기본 설정 출력 + $config = $oSpamFilterModel->getConfig(); + + // 스팸 간격을 체크하는 변수 + $interval = $config->interval?$config->interval:60; + + // 스팸 간격내에 limit_count이상 작성을 시도하면 해당 ip를 금지 시킴 + $limit_count = $config->limit_count?$config->limit_count:5; + + // 트랙백의 경우 한 글에 하나의 ip에서만 트랙백을 허용함 + $check_trackback = $config->check_trackback=='Y'?true:false; + + // 스팸 IP에 등록되어 있는지 체크하여 등록되어 있으면 return + $is_denied = $oSpamFilterModel->isDeniedIP($ipaddress); + if($is_denied) { + $output = new Object(-1, 'msg_alert_registered_denied_ip'); + $this->stop_proc = true; + return; + } + + // act==procReceiveTrackback (트랙백)일때 check_trackback==true이면 검사 + if($this->act=='procReceiveTrackback' && $check_trackback){ + $oTrackbackModel = &getModel('trackback'); + $document_srl = Context::get('document_srl'); + $count = $oTrackbackModel->getTrackbackCountByIPAddress($document_srl, $ipaddress); + if($count>0) { + $output = Object(-1, 'msg_alert_trackback_denied'); + $this->stop_proc = true; + return; + } + } + + // 정해진 시간내에 글 작성 시도를 하였는지 체크 + $count = $oSpamFilterModel->getLogCount($interval, $ipaddress); + + // 정해진 시간내에 정해진 글의 수를 초과시 스팸 IP로 등록시킴 + if($count>=$limit_count) { + $oSpamFilterController->insertIP($ipaddress); + $output = new Object(-1, 'msg_alert_registered_denied_ip'); + $this->stop_proc = true; + return; + + // 제한 글수까지는 아니지만 정해진 시간내에 글 작성을 계속 할때 + } elseif($count) { + $message = sprintf(Context::getLang('msg_alert_limited_by_config'), $interval); + $output = new Object(-1, $message); + $this->stop_proc = true; + } + + // 금지 단어 체크를 위해서 몇가지 지정된 변수들을 한데 묶음 + $check_vars = implode("\n",get_object_vars(Context::getRequestVars())); + + // 금지 단어를 이용하여 본문 내용을 체크 + $denied_word_list = $oSpamFilterModel->getDeniedWordList(); + $denied_word_count = count($denied_word_list); + if($denied_word_count>0) { + for($i=0;$i<$denied_word_count;$i++) { + $word = preg_quote($denied_word_list[$i]->word,'/'); + if(preg_match('/'.$word.'/i', $check_vars)) { + $message = sprintf(Context::getLang('msg_alert_denied_word'), $word); + $output = new Object(-1, $message); + $this->stop_proc = true; + return; + } + } + } + + // 로그를 남김 + $oSpamFilterController->insertLog(); +?> diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php new file mode 100644 index 000000000..a56fa2420 --- /dev/null +++ b/classes/context/Context.class.php @@ -0,0 +1,923 @@ +..내의 스크립트코드 + var $html_footer = NULL; ///< @brief display시에 사용하게 되는 바로 앞에 추가될 코드 + + var $path = ''; ///< zbxe의 경로 + + /** + * @brief 언어 정보 + * + * 기본으로 ko. HTTP_USER_AGENT나 사용자의 직접 세팅(쿠키이용)등을 통해 변경됨 + **/ + var $lang_type = ''; ///< 언어 종류 + var $lang = NULL; ///< 언어 데이터를 담고 있는 변수 + var $loaded_lang_files = array(); ///< 로딩된 언어파일의 목록 (재로딩을 피하기 위함) + + var $site_title = ''; ///< @brief 현 사이트의 browser title. Context::setBrowserTitle() 로 변경 가능 + + var $get_vars = NULL; ///< @brief form이나 get으로 요청이 들어온 변수만 별도로 관리 + + var $is_uploaded = false; ///< @brief 첨부파일이 업로드 된 요청이였는지에 대한 체크 플래그 + + /** + * @brief Context 객체를 GLOBALS 변수에 생성 + * + * Context는 어디서든 객체 선언없이 사용하기 위해서 static 하게 사용\n + * php5라면 GLOBALS가 아닌 static으로 처리 가능 + **/ + function &getInstance() { + if(!$GLOBALS['__ContextInstance__']) $GLOBALS['__ContextInstance__'] = new Context(); + return $GLOBALS['__ContextInstance__']; + } + + /** + * @brief DB정보, Request Argument등을 세팅 + * + * Context::init()은 단 한번만 호출되어야 하며 init()시에 + * Request Argument, DB/언어/세션정보등의 모든 정보를 세팅한다 + **/ + function init() { + // context 변수를 $GLOBALS의 변수로 지정 + $this->context = &$GLOBALS['__Context__']; + $this->context->lang = &$GLOBALS['lang']; + $this->context->_COOKIE = $_COOKIE; + + // 기본적인 DB정보 세팅 + $this->_loadDBInfo(); + + // 쿠키로 설정된 언어타입 가져오기 + if($_COOKIE['lang_type']) $this->lang_type = $_COOKIE['lang_type']; + else $this->lang_type = $this->db_info->lang_type; + + // 등록된 기본 언어파일 찾기 + $lang_files = FileHandler::readDir('./common/lang'); + $accept_lang = strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']); + foreach($lang_files as $key => $val) { + list($lang_prefix) = explode('.',$val); + $lang_supported[] = $lang_prefix; + 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(!$this->lang_type) $this->lang_type = "en"; + + Context::set('lang_supported', $lang_supported); + + $this->setLangType($this->lang_type); + + // 기본 언어파일 로드 + $this->lang = &$GLOBALS['lang']; + $this->_loadLang("./common/lang/"); + + // Request Method 설정 + $this->_setRequestMethod(); + + // Request Argument 설정 + $this->_setXmlRpcArgument(); + $this->_setRequestArgument(); + $this->_setUploadedArgument(); + + // 인증관련 데이터를 Context에 설정 + $oMember = getModel('member'); + if($oMember->isLogged()) { + $this->_set('is_logged', true); + $this->_set('logged_info', $_SESSION['logged_info']); + } else { + $this->_set('is_logged', false); + $this->_set('logged_info', NULL); + } + + // rewrite 모듈사용 상태 체크 + if(file_exists('./.htaccess')&&$this->db_info->use_rewrite == 'Y') $this->allow_rewrite = true; + else $this->allow_rewrite = false; + + // 상대 경로 설정 + $this->path = $this->getRequestUri(); + + // rewrite module때문에 javascript에서 location.href 문제 해결을 위해 직접 실제 경로 설정 + if($_SERVER['REQUEST_METHOD'] == 'GET') { + if($this->get_vars) { + foreach($this->get_vars as $key => $val) { + if(!$val) continue; + $url .= ($url?'&':'').$key.'='.$val; + } + Context::set('current_url',sprintf('%s?%s',$this->path, $url)); + } else { + Context::set('current_url',$this->getUrl()); + } + } else { + Context::set('current_url',$this->getRequestUri()); + } + Context::set('request_uri',Context::getRequestUri()); + } + + /** + * @brief DB및 기타 자원들의 close + **/ + function close() { + // DB close + $oDB = &DB::getInstance(); + if(is_object($oDB)&&method_exists($oDB, 'close')) $oDB->close(); + } + + /** + * @brief DB 정보를 설정하고 DB Type과 DB 정보를 return + **/ + function _loadDBInfo() { + if(!$this->isInstalled()) return; + + // db 정보 설정 + $db_config_file = $this->getConfigFile(); + if(file_exists($db_config_file)) @include($db_config_file); + + if(!$db_info->time_zone) $db_info->time_zone = date("O"); + + $this->_setDBInfo($db_info); + + $GLOBALS['_time_zone'] = $db_info->time_zone; + } + + /** + * @brief DB의 db_type을 return + **/ + function getDBType() { + $oContext = &Context::getInstance(); + return $oContext->_getDBType(); + } + + /** + * @brief DB의 db_type을 return + **/ + function _getDBType() { + return $this->db_info->db_type; + } + + /** + * @brief DB 정보가 담긴 object를 return + **/ + function setDBInfo($db_info) { + $oContext = &Context::getInstance(); + $oContext->_setDBInfo($db_info); + } + + /** + * @brief DB 정보가 담긴 object를 return + **/ + function _setDBInfo($db_info) { + $this->db_info = $db_info; + } + + /** + * @brief DB 정보가 담긴 object를 return + **/ + function getDBInfo() { + $oContext = &Context::getInstance(); + return $oContext->_getDBInfo(); + } + + /** + * @brief DB 정보가 담긴 object를 return + **/ + function _getDBInfo() { + return $this->db_info; + } + + /** + * @brief 사이트 title setting + **/ + function setBrowserTitle($site_title) { + if(!$site_title) return; + $oContext = &Context::getInstance(); + $oContext->_setBrowserTitle($site_title); + } + + /** + * @brief 사이트 title setting + **/ + function _setBrowserTitle($site_title) { + $this->site_title = htmlspecialchars($site_title); + } + + /** + * @brief 사이트 title return + **/ + function getBrowserTitle() { + $oContext = &Context::getInstance(); + return $oContext->_getBrowserTitle(); + } + + /** + * @brief 사이트 title return + **/ + function _getBrowserTitle() { + return $this->site_title; + } + + /** + * @brief 지정된 언어파일 로드 + **/ + function loadLang($path) { + $oContext = &Context::getInstance(); + $oContext->_loadLang($path); + } + + /** + * @brief 지정된 언어파일 로드 + * + * loaded_lang_files 변수를 이용하여 한번 로드된 파일을 다시 로드하지 않음 + **/ + function _loadLang($path) { + global $lang; + if(substr($path,-1)!='/') $path .= '/'; + $filename = sprintf('%s%s.lang.php', $path, $this->lang_type); + if(!file_exists($filename)) $filename = sprintf('%s%s.lang.php', $path, 'ko'); + if(!file_exists($filename)) return; + if(!is_array($this->loaded_lang_files)) $this->loaded_lang_files = array(); + if(in_array($filename, $this->loaded_lang_files)) return; + $this->loaded_lang_files[] = $filename; + include($filename); + } + + /** + * @brief lang_type을 세팅 (기본 ko) + **/ + function setLangType($lang_type = 'ko') { + $oContext = &Context::getInstance(); + $oContext->_setLangType($lang_type); + } + + /** + * @brief lang_type을 세팅 (기본 ko) + **/ + function _setLangType($lang_type = 'ko') { + $this->lang_type = $lang_type; + $this->_set('lang_type',$lang_type); + } + + /** + * @brief lang_type을 return + **/ + function getLangType() { + $oContext = &Context::getInstance(); + return $oContext->_getLangType(); + } + + /** + * @brief lang_type을 return + **/ + function _getLangType() { + return $this->lang_type; + } + + /** + * @brief code에 해당하는 문자열을 return + * + * 만약 code에 해당하는 문자열이 없다면 code를 그대로 리턴 + **/ + function getLang($code) { + if(!$code) return; + if($GLOBALS['lang']->{$code}) return $GLOBALS['lang']->{$code}; + return $code; + } + + /** + * @brief 직접 lang 변수에 데이터를 추가 + **/ + function setLang($code, $val) { + $GLOBALS['lang']->{$code} = $val; + } + + /** + * @brief object내의 variables의 문자열을 utf8로 변경 + **/ + function convertEncoding($source_obj) { + $charset_list = array( + 'UTF-8', 'EUC-KR', 'CP949', 'ISO-8859-1', 'EUC-JP', 'SHIFT_JIS', 'CP932', + 'EUC-CN', 'HZ', 'GBK', 'GB18030', 'EUC-TW', 'BIG5', 'CP950', 'BIG5-HKSCS', + 'ISO-2022-CN', 'ISO-2022-CN-EXT', 'ISO-2022-JP', 'ISO-2022-JP-2', 'ISO-2022-JP-1', + 'ISO-8859-6', 'ISO-8859-8', 'JOHAB', 'ISO-2022-KR', 'CP1255', 'CP1256', 'CP862', + 'ASCII', 'ISO-8859-1', 'ISO-8850-2', 'ISO-8850-3', 'ISO-8850-4', 'ISO-8850-5', + 'ISO-8850-7', 'ISO-8850-9', 'ISO-8850-10', 'ISO-8850-13', 'ISO-8850-14', + 'ISO-8850-15', 'ISO-8850-16', 'CP1250', 'CP1251', 'CP1252', 'CP1253', 'CP1254', + 'CP1257', 'CP850', 'CP866', + ); + + $obj = clone($source_obj); + + for($i=0;$i$val) { + if(!$val) continue; + if($val && !iconv($charset,'UTF-8',$val)) $flag = false; + } + if($flag == true) { + foreach($obj as $key => $val) $obj->{$key} = iconv($charset,'UTF-8',$val); + return $obj; + } + } + } + + /** + * @brief response method를 강제로 지정 (기본으로는 request method를 이용함) + * + * method의 종류에는 HTML/ TEXT/ XMLRPC가 있음 + **/ + function setResponseMethod($method = "HTML") { + $oContext = &Context::getInstance(); + return $oContext->_setResponseMethod($method); + } + + function _setResponseMethod($method = "HTML") { + $this->response_method = $method; + } + + /** + * @brief response method 값을 return + * + * method의 종류에는 HTML/ TEXT/ XMLRPC가 있음 + * 별도로 response method를 지정하지 않았다면 request method로 판단하여 결과 return + **/ + function getResponseMethod() { + $oContext = &Context::getInstance(); + return $oContext->_getResponseMethod(); + } + + function _getResponseMethod() { + if($this->response_method) return $this->response_method; + + if($this->_getRequestMethod()=="XMLRPC") return "XMLRPC"; + return "HTML"; + } + + /** + * @brief request method가 어떤것인지 판단하여 저장 (GET/POST/XMLRPC) + **/ + function setRequestMethod($type) { + $oContext = &Context::getInstance(); + $oContext->_setRequestMethod($type); + } + + + /** + * @brief request method가 어떤것인지 판단하여 저장 (GET/POST/XMLRPC) + **/ + function _setRequestMethod($type = '') { + if($type) return $this->request_method = $type; + + if($GLOBALS['HTTP_RAW_POST_DATA']) return $this->request_method = "XMLRPC"; + + $this->request_method = $_SERVER['REQUEST_METHOD']; + } + + /** + * @brief GET/POST방식일 경우 처리 + **/ + function _setRequestArgument() { + if($this->_getRequestMethod() == 'XMLRPC') return; + if(!count($_REQUEST)) return; + + foreach($_REQUEST as $key => $val) { + if($key == "page" || substr($key,-3)=="srl") $val = (int)$val; + if(is_array($val)) { + for($i=0;$i_getRequestMethod()=='GET'&&$_GET[$key]) $set_to_vars = true; + elseif($this->_getRequestMethod()=='POST'&&$_POST[$key]) $set_to_vars = true; + else $set_to_vars = false; + $this->_set($key, $val, $set_to_vars); + } + } + + /** + * @brief XML RPC일때 + **/ + function _setXmlRpcArgument() { + if($this->_getRequestMethod() != 'XMLRPC') return; + $oXml = new XmlParser(); + $xml_obj = $oXml->parse(); + + $params = $xml_obj->methodcall->params; + unset($params->node_name); + + unset($params->attrs); + if(!count($params)) return; + + foreach($params as $key => $obj) { + $val = trim($obj->body); + $this->_set($key, $val, true); + } + } + + /** + * @brief 업로드 되었을 경우 return true + **/ + function isUploaded() { + $oContext = &Context::getInstance(); + return $oContext->_isUploaded(); + } + + /** + * @brief 업로드 되었을 경우 return true + **/ + function _isUploaded() { + return $this->is_uploaded; + } + + /** + * @brief 업로드된 파일이 있을 경우도 역시 context에 통합 처리 (단 정상적인 업로드인지 체크) + **/ + function _setUploadedArgument() { + if($this->_getRequestMethod() != 'POST') return; + if(!eregi("^multipart\/form-data", $_SERVER['CONTENT_TYPE'])) return; + if(!$_FILES) return; + + foreach($_FILES as $key => $val) { + $tmp_name = $val['tmp_name']; + if(!$tmp_name || !is_uploaded_file($tmp_name)) continue; + $this->_set($key, $val, true); + $this->is_uploaded = true; + } + } + + /** + * @brief Request Method값을 return (GET/POST/XMLRPC); + **/ + function getRequestMethod() { + $oContext = &Context::getInstance(); + return $oContext->_getRequestMethod(); + } + + /** + * @brief Request Method값을 return (GET/POST/XMLRPC); + **/ + function _getRequestMethod() { + return $this->request_method; + } + + /** + * @brief 요청받은 url에 args_list를 적용하여 return + **/ + function getUrl($num_args=0, $args_list=array()) { + $oContext = &Context::getInstance(); + return $oContext->_getUrl($num_args, $args_list); + } + + /** + * @brief 요청받은 url에 args_list를 적용하여 return + **/ + function _getUrl($num_args=0, $args_list=array()) { + if(!$this->get_vars || $args_list[0]=='') { + $get_vars = null; + if($args_list[0]=='') { + array_shift($args_list); + $num_args = count($args_list); + } + } else { + $get_vars = get_object_vars($this->get_vars); + } + + for($i=0;$i<$num_args;$i=$i+2) { + $key = $args_list[$i]; + $val = trim($args_list[$i+1]); + if(!$val) unset($get_vars[$key]); + else $get_vars[$key] = $val; + } + + $var_count = count($get_vars); + if(!$var_count) return ''; + + // rewrite모듈을 사용하고 인자의 값이 4개 이하일 경우 + if($this->allow_rewrite && $var_count < 4) { + $var_keys = array_keys($get_vars); + + if($var_count == 1) { + if($var_keys[0]=='mid') return $this->path.$get_vars['mid']; + elseif($var_keys[0]=='document_srl') return $this->path.$get_vars['document_srl']; + } elseif($var_count == 2) { + asort($var_keys); + $target = implode('.',$var_keys); + if($target=='act.mid' && !ereg('([A-Z]+)',$get_vars['act'])) return sprintf('%s%s/%s',$this->path,$get_vars['mid'],$get_vars['act']); + elseif($target=='document_srl.mid') return sprintf('%s%s/%s',$this->path,$get_vars['mid'],$get_vars['document_srl']); + elseif($target=='act.document_srl') return sprintf('%s%s/%s',$this->path,$get_vars['document_srl'],$get_vars['act']); + elseif($target=='mid.page') return sprintf('%s%s/page/%s',$this->path,$get_vars['mid'],$get_vars['page']); + elseif($target=='category.mid') return sprintf('%s%s/category/%s',$this->path,$get_vars['mid'],$get_vars['category']); + } elseif($var_count == 3) { + asort($var_keys); + $target = implode('.',$var_keys); + if($target=='category.mid.page') { + return sprintf('%s%s/category/%s/page/%s',$this->path,$get_vars['mid'],$get_vars['category'],$get_vars['page']); + } elseif($target=='mid.search_keyword.search_target' && $get_vars['search_target']=='tag') { + return sprintf('%s%s/tag/%s',$this->path,$get_vars['mid'],str_replace(' ','-',$get_vars['search_keyword'])); + } elseif($target=='mid.search_keyword.search_target' && $get_vars['search_target']=='regdate') { + if(strlen($get_vars['search_keyword'])==8) return sprintf('%s%s/%04d/%02d/%02d',$this->path,$get_vars['mid'],substr($get_vars['search_keyword'],0,4),substr($get_vars['search_keyword'],4,2),substr($get_vars['search_keyword'],6,2)); + elseif(strlen($get_vars['search_keyword'])==6) return sprintf('%s%s/%04d/%02d',$this->path,$get_vars['mid'],substr($get_vars['search_keyword'],0,4),substr($get_vars['search_keyword'],4,2)); + } + } + } + + // rewrite 모듈을 사용하지 않고 인자의 값이 2개 이상이거나 rewrite모듈을 위한 인자로 적당하지 않을 경우 + foreach($get_vars as $key => $val) { + if(!$val) continue; + $url .= ($url?'&':'').$key.'='.$val; + } + + return $this->path.'?'.htmlspecialchars($url); + } + + /** + * @brief 요청이 들어온 URL에서 argument를 제거하여 return + **/ + function getRequestUri() { + $hostname = $_SERVER['HTTP_HOST']; + $port = $_SERVER['SERVER_PORT']; + if($port!=80) $hostname .= ":{$port}"; + $path = str_replace('index.php','',$_SERVER['SCRIPT_NAME']); + return sprintf("http://%s%s",$hostname,$path); + } + + /** + * @brief key/val로 context vars 세팅 + **/ + function set($key, $val, $set_to_get_vars = false) { + $oContext = &Context::getInstance(); + $oContext->_set($key, $val, $set_to_get_vars); + } + + /** + * @brief key/val로 context vars 세팅 + **/ + function _set($key, $val, $set_to_get_vars = false) { + $this->context->{$key} = $val; + if($set_to_get_vars || $this->get_vars->{$key}) $this->get_vars->{$key} = $val; + } + + /** + * @brief key값에 해당하는 값을 return + **/ + function get($key) { + $oContext = &Context::getInstance(); + return $oContext->_get($key); + } + + /** + * @brief key값에 해당하는 값을 return + **/ + function _get($key) { + return $this->context->{$key}; + } + + /** + * @brief 받고자 하는 변수만 object에 입력하여 받음 + * + * key1, key2, key3 .. 등의 인자를 주어 여러개의 변수를 object vars로 세팅하여 받을 수 있음 + **/ + function gets() { + $num_args = func_num_args(); + if($num_args<1) return; + $args_list = func_get_args(); + + $oContext = &Context::getInstance(); + return $oContext->_gets($num_args, $args_list); + } + + /** + * @brief 받고자 하는 변수만 object에 입력하여 받음 + * + * key1, key2, key3 .. 등의 인자를 주어 여러개의 변수를 object vars로 세팅하여 받을 수 있음 + **/ + function _gets($num_args, $args_list) { + for($i=0;$i<$num_args;$i++) { + $args = $args_list[$i]; + $output->{$args} = $this->_get($args); + } + return $output; + } + + /** + * @brief 모든 데이터를 return + **/ + function getAll() { + $oContext = &Context::getInstance(); + return $oContext->_getAll(); + } + + /** + * @brief 모든 데이터를 return + **/ + function _getAll() { + return $this->context; + } + + /** + * @brief GET/POST/XMLRPC에서 넘어온 변수값을 return + **/ + function getRequestVars() { + $oContext = &Context::getInstance(); + return $oContext->_getRequestVars(); + } + + /** + * @brief GET/POST/XMLRPC에서 넘어온 변수값을 return + **/ + function _getRequestVars() { + return clone($this->get_vars); + } + + /** + * @brief js file을 추가 + **/ + function addJsFile($file) { + $oContext = &Context::getInstance(); + return $oContext->_addJsFile($file); + } + + /** + * @brief js file을 추가 + **/ + function _addJsFile($file) { + if(in_array($file, $this->js_files)) return; + $this->js_files[] = $file; + } + + /** + * @brief js file 목록을 return + **/ + function getJsFile() { + $oContext = &Context::getInstance(); + return $oContext->_getJsFile(); + } + + /** + * @brief js file 목록을 return + **/ + function _getJsFile() { + return $this->js_files; + } + + /** + * @brief CSS file 추가 + **/ + function addCSSFile($file) { + $oContext = &Context::getInstance(); + return $oContext->_addCSSFile($file); + } + + /** + * @brief CSS file 추가 + **/ + function _addCSSFile($file) { + if(in_array($file, $this->css_files)) return; + $this->css_files[] = $file; + } + + /** + * @brief CSS file 목록 return + **/ + function getCSSFile() { + $oContext = &Context::getInstance(); + return $oContext->_getCSSFile(); + } + + /** + * @brief CSS file 목록 return + **/ + function _getCSSFile() { + return $this->css_files; + } + + /** + * @brief HtmlHeader 추가 + **/ + function addHtmlHeader($header) { + $oContext = &Context::getInstance(); + return $oContext->_addHtmlHeader($header); + } + + /** + * @brief HtmlHeader 추가 + **/ + function _addHtmlHeader($header) { + $this->html_header .= "\n".$header; + } + + /** + * @brief HtmlHeader return + **/ + function getHtmlHeader() { + $oContext = &Context::getInstance(); + return $oContext->_getHtmlHeader(); + } + + /** + * @brief HtmlHeader return + **/ + function _getHtmlHeader() { + return $this->html_header; + } + + /** + * @brief HtmlFooter 추가 + **/ + function addHtmlFooter($footer) { + $oContext = &Context::getInstance(); + return $oContext->_addHtmlFooter($footer); + } + + /** + * @brief HtmlFooter 추가 + **/ + function _addHtmlFooter ($footer) { + $this->html_footer .= ($this->Htmlfooter?"\n":"").$footer; + } + + /** + * @brief HtmlFooter return + **/ + function getHtmlFooter() { + $oContext = &Context::getInstance(); + return $oContext->_getHtmlFooter(); + } + + /** + * @brief HtmlFooter return + **/ + function _getHtmlFooter() { + return $this->html_footer; + } + + /** + * @brief db설정내용이 저장되어 있는 config file의 path를 return + **/ + function getConfigFile() { + return "./files/config/db.config.php"; + } + + /** + * @brief 설치가 되어 있는지에 대한 체크 + * + * 단순히 db config 파일의 존재 유무로 설치 여부를 체크한다 + **/ + function isInstalled() { + return file_exists(Context::getConfigFile()); + } + + /** + * @brief 내용의 위젯이나 기타 기능에 대한 code를 실제 code로 변경 + **/ + function transContent($content) { + // 위젯 코드 변경 + $content = preg_replace_callback('!]*)widget=([^\>]*?)\>!is', array($this,'_transWidget'), $content); + + // 메타 파일 변경 + $content = preg_replace_callback('!<\!\-\-Meta:([^\-]*?)\-\->!is', array($this,'_transMeta'), $content); + + // 에디터 컴포넌트를 찾아서 결과 코드로 변환 + $content = preg_replace_callback('!]*)editor_component=([^\>]*)>(.*?)\<\/div\>!is', array($this,'_transEditorComponent'), $content); + $content = preg_replace_callback('!]*)editor_component=([^\>]*?)\>!is', array($this,'_transEditorComponent'), $content); + + // body 내의 를 header로 이동 + $content = preg_replace_callback('!!is', array($this,'_moveStyleToHeader'), $content); + + //
코드 변환 + $content = preg_replace('/\/]*)(\/>|>)/i','', $content); + + // 몇가지 대문자 태그를 소문자로 변경 + //$content = preg_replace_callback('!<(\/){0,1}([A-Z]+)([^>]*?)>!s',array($this,'_transTagToLowerCase'), $content); + + // 코드를 코드로 변환 + $content = preg_replace('//i','', $content); + + // blogapi tool에서 삽입된 코드 삭제 + //$content = str_replace('atomicselection="true"','',$content); + + return $content; + } + + /** + * @brief IE위지윅에디터에서 태그가 대문자로 사용되기에 이를 소문자로 치환 + **/ + function _transTagToLowerCase($matches) { + return sprintf('<%s%s%s>', $matches[1], strtolower($matches[2]), $matches[3]); + } + + /** + * @brief 를 변경 + **/ + function _transMeta($matches) { + if(eregi('\.css$', $matches[1])) $this->addCSSFile($matches[1]); + elseif(eregi('\.js$', $matches[1])) $this->addJSFile($matches[1]); + } + + /** + * @brief 내의 addHtmlHeader($matches[0]); + return ''; + } + + /** + * @brief 내용의 에디터 컴포넌트 코드를 변환 + **/ + function _fixQuotation($matches) { + $key = $matches[1]; + $val = $matches[2]; + if(substr($val,0,1)!='"') $val = '"'.$val.'"'; + return sprintf('%s=%s', $key, $val); + } + + function _transEditorComponent($matches) { + // IE에서는 태그의 특성중에서 " 를 빼어 버리는 경우가 있기에 정규표현식으로 추가해줌 + $buff = $matches[0]; + $buff = preg_replace_callback('/([^=^"^ ]*)=([^ ]*)/i', array($this, _fixQuotation), $buff); + $buff = str_replace("&","&",$buff); + + // 위젯에서 생성된 코드 (img, div태그내에 editor_widget코드 존재)의 parameter를 추출 + $oXmlParser = new XmlParser(); + $xml_doc = $oXmlParser->parse($buff); + if($xml_doc->div) $xml_doc = $xml_doc->div; + + $xml_doc->body = $matches[3]; + + // attribute가 없으면 return + $editor_component = $xml_doc->attrs->editor_component; + if(!$editor_component) return $matches[0]; + + // component::transHTML() 을 이용하여 변환된 코드를 받음 + $oEditorModel = &getModel('editor'); + $oComponent = &$oEditorModel->getComponentObject($editor_component, 0); + if(!is_object($oComponent)||!method_exists($oComponent, 'transHTML')) return $matches[0]; + + return $oComponent->transHTML($xml_doc); + } + + /** + * @brief 위젯 코드를 실제 php코드로 변경 + **/ + function _transWidget($matches) { + // IE에서는 태그의 특성중에서 " 를 빼어 버리는 경우가 있기에 정규표현식으로 추가해줌 + $buff = $matches[0]; + $buff = preg_replace('/([^=^"^ ]*)=([^"])([^=^ ]*)/i', '$1="$2$3"', $buff); + $buff = str_replace("&","&",$buff); + + $oXmlParser = new XmlParser(); + $xml_doc = $oXmlParser->parse(trim($buff)); + + if($xml_doc->img) $vars = $xml_doc->img->attrs; + else $vars = $xml_doc->attrs; + + if(!$vars->widget) return ""; + + // 캐시 체크 + $widget_sequence = $vars->widget_sequence; + $widget_cache = $vars->widget_cache; + if($widget_cache && $widget_sequence) { + $output = WidgetHandler::getCache($widget_sequence, $widget_cache); + if($output) return $output; + } + + // 위젯의 이름을 구함 + $widget = $vars->widget; + unset($vars->widget); + + return WidgetHandler::execute($widget, $vars); + } + + } +?> diff --git a/classes/db/DB.class.php b/classes/db/DB.class.php new file mode 100644 index 000000000..64ef1b9c2 --- /dev/null +++ b/classes/db/DB.class.php @@ -0,0 +1,369 @@ + '=', + 'more' => '>=', + 'excess' => '>', + 'less' => '<=', + 'below' => '<', + 'notequal' => '<>', + 'notnull' => 'is not null', + 'null' => 'is null', + ); + + var $fd = NULL; ///< connector resource or file description + + var $result = NULL; ///< result + + var $errno = 0; ///< 에러 발생시 에러 코드 (0이면 에러가 없다고 정의) + var $errstr = ''; ///< 에러 발생시 에러 메세지 + var $query = ''; ///< 가장 최근에 수행된 query string + + var $transaction_started = false; ///< 트랙잭션 처리 flag + + var $is_connected = false; ///< DB에 접속이 되었는지에 대한 flag + + var $supported_list = array(); ///< 지원하는 DB의 종류, classes/DB/DB***.class.php 를 이용하여 동적으로 작성됨 + + var $cache_file = './files/cache/queries/'; ///< query cache파일의 위치 + + /** + * @brief DB를 상속받는 특정 db type의 instance를 생성 후 return + **/ + function &getInstance($db_type = NULL) { + if(!$db_type) $db_type = Context::getDBType(); + if(!$db_type) return new Object(-1, 'msg_db_not_setted'); + + if(!$GLOBALS['__DB__']) { + $class_name = sprintf("DB%s%s", strtoupper(substr($db_type,0,1)), strtolower(substr($db_type,1))); + $class_file = sprintf("./classes/db/%s.class.php", $class_name); + if(!file_exists($class_file)) new Object(-1, 'msg_db_not_setted'); + + require_once($class_file); + $eval_str = sprintf('$GLOBALS[\'__DB__\'] = new %s();', $class_name); + eval($eval_str); + } + + return $GLOBALS['__DB__']; + } + + /** + * @brief 지원 가능한 DB 목록을 return + **/ + function getSupportedList() { + $oDB = new DB(); + return $oDB->_getSupportedList(); + } + + /** + * @brief 지원 가능한 DB 목록을 return + **/ + function _getSupportedList() { + $db_classes_path = "./classes/db/"; + $filter = "/^DB([^\.]+)\.class\.php/i"; + $supported_list = FileHandler::readDir($db_classes_path, $filter, true); + sort($supported_list); + + // 구해진 클래스의 객체 생성후 isSupported method를 통해 지원 여부를 판단 + for($i=0;$iisSupported()) continue; + + $this->supported_list[] = $db_type; + } + + return $this->supported_list; + } + + /** + * @brief 지원하는 DB인지에 대한 check + **/ + function isSupported($db_type) { + $supported_list = DB::getSupportedList(); + return in_array($db_type, $supported_list); + } + + /** + * @brief 접속되었는지 return + **/ + function isConnected() { + return $this->is_connected?true:false; + } + + /** + * @brief 로그 남김 + **/ + function actStart($query) { + $this->setError(0,'success'); + $this->query = $query; + $this->act_start = getMicroTime(); + } + + function actFinish() { + if(!$this->query ) return; + $this->act_finish = getMicroTime(); + $elapsed_time = $this->act_finish - $this->act_start; + $GLOBALS['__db_elapsed_time__'] += $elapsed_time; + + $str = sprintf("\t%02d. %s (%0.6f sec)\n", ++$GLOBALS['__dbcnt'], $this->query, $elapsed_time); + + if($this->isError()) { + $str .= sprintf("\t Query Failed : %d\n\t\t\t %s\n", $this->errno, $this->errstr); + + if(__DEBUG_DB_OUTPUT__==1) { + $debug_file = "./files/_debug_db_query.php"; + $buff = sprintf("%s\n",print_r($str,true)); + + if($display_line) $buff = "\n====================================\n".$buff."------------------------------------\n"; + + if(@!$fp = fopen($debug_file,"a")) return; + fwrite($fp, $buff); + fclose($fp); + } + } else { + $str .= "\t Query Success\n"; + } + $GLOBALS['__db_queries__'] .= $str; + $this->query = null; + } + + /** + * @brief 에러발생시 에러 메세지를 남기고 debug 모드일때는 GLOBALS 변수에 에러 로깅 + **/ + function setError($errno = 0, $errstr = 'success') { + $this->errno = $errno; + $this->errstr = $errstr; + } + + /** + * @brief 오류가 발생하였는지 return + **/ + function isError() { + return $this->errno===0?false:true; + } + + /** + * @brief 에러결과를 Object 객체로 return + **/ + function getError() { + return new Object($this->errno, $this->errstr); + } + + /** + * @brief query xml 파일을 실행하여 결과를 return + * + * query_id = module.queryname + * query_id에 해당하는 xml문(or 캐싱파일)을 찾아서 컴파일 후 실행 + **/ + function executeQuery($query_id, $args = NULL) { + if(!$query_id) return new Object(-1, 'msg_invalid_queryid'); + + list($module, $id) = explode('.',$query_id); + if(!$module || !$id) return new Object(-1, 'msg_invalid_queryid'); + + $xml_file = sprintf('./modules/%s/queries/%s.xml', $module, $id); + if(!file_exists($xml_file)) return new Object(-1, 'msg_invalid_queryid'); + + // 일단 cache 파일을 찾아본다 + $cache_file = sprintf('%s%s.cache.php', $this->cache_file, $query_id); + + // 없으면 원본 쿼리 xml파일을 찾아서 파싱을 한다 + if(!file_exists($cache_file)||filectime($cache_file)parse($query_id, $xml_file, $cache_file); + } + + // 쿼리를 실행한다 + return $this->_executeQuery($cache_file, $args, $query_id); + } + + /** + * @brief 쿼리문을 실행하고 결과를 return한다 + **/ + function _executeQuery($cache_file, $source_args, $query_id) { + global $lang; + + if(!file_exists($cache_file)) return new Object(-1, 'msg_invalid_queryid'); + + if($source_args) $args = clone($source_args); + + $output = @include($cache_file); + + if( (is_a($output, 'Object')||is_subclass_of($output,'Object'))&&!$output->toBool()) return $output; + + // action값에 따라서 쿼리 생성으로 돌입 + switch($output->action) { + case 'insert' : + $output = $this->_executeInsertAct($output); + break; + case 'update' : + $output = $this->_executeUpdateAct($output); + break; + case 'delete' : + $output = $this->_executeDeleteAct($output); + break; + case 'select' : + $output = $this->_executeSelectAct($output); + break; + } + + if($this->errno !=0 ) return new Object($this->errno, $this->errstr); + if(is_a($output, 'Object') || is_subclass_of($output, 'Object')) return $output; + return new Object(); + } + + /** + * @brief $val을 $filter_type으로 검사 + * XmlQueryParser에서 사용하도록 함 + **/ + function checkFilter($key, $val, $filter_type) { + global $lang; + + switch($filter_type) { + case 'email' : + case 'email_address' : + if(!eregi('^[_0-9a-z-]+(\.[_0-9a-z-]+)*@[0-9a-z-]+(\.[0-9a-z-]+)*$', $val)) return new Object(-1, sprintf($lang->filter->invalid_email, $lang->{$key}?$lang->{$key}:$key)); + break; + case 'homepage' : + if(!eregi('^(http|https)+(:\/\/)+[0-9a-z_-]+\.[^ ]+$', $val)) return new Object(-1, sprintf($lang->filter->invalid_homepage, $lang->{$key}?$lang->{$key}:$key)); + break; + case 'userid' : + case 'user_id' : + if(!eregi('^[a-zA-Z]+([_0-9a-zA-Z]+)*$', $val)) return new Object(-1, sprintf($lang->filter->invalid_userid, $lang->{$key}?$lang->{$key}:$key)); + break; + case 'number' : + if(!eregi('^[0-9]+$', $val)) return new Object(-1, sprintf($lang->filter->invalid_number, $lang->{$key}?$lang->{$key}:$key)); + break; + case 'alpha' : + if(!eregi('^[a-z]+$', $val)) return new Object(-1, sprintf($lang->filter->invalid_alpha, $lang->{$key}?$lang->{$key}:$key)); + break; + case 'alpha_number' : + if(!eregi('^[0-9a-z]+$', $val)) return new Object(-1, sprintf($lang->filter->invalid_alpha_number, $lang->{$key}?$lang->{$key}:$key)); + break; + } + + return new Object(); + } + + /** + * @brief 컬럼의 타입을 구해옴 + * 컬럼의 경우 a.b 와 같이 되어 있는 경우가 있어서 별도 함수가 필요 + **/ + function getColumnType($column_type_list, $name) { + if(strpos($name,'.')===false) return $column_type_list[$name]; + list($prefix, $name) = explode('.',$name); + return $column_type_list[$name]; + } + + /** + * @brief 이름, 값, operation, type으로 값을 변경 + * like, like_prefix의 경우 value자체가 변경됨 + * type == number가 아니면 addQuotes()를 하고 ' ' 로 묶음 + **/ + function getConditionValue($name, $value, $operation, $type) { + if($type == 'number') { + if(strpos($value,',')===false && strpos($value,'(')===false) return (int)$value; + return $value; + } + + $value = preg_replace('/(^\'|\'$){1}/','',$value); + + switch($operation) { + case 'like_prefix' : + $value = $value.'%'; + break; + case 'like_tail' : + $value = '%'.$value; + break; + case 'like' : + $value = '%'.$value.'%'; + break; + case 'in' : + return "'".$value."'"; + break; + } + + + if(strpos($name,'.')!==false && strpos($value,'.')!==false) return $value; + + return "'".$this->addQuotes($value)."'"; + } + + /** + * @brief 이름, 값, operation으로 조건절 작성 + * 조건절을 완성하기 위해 세부 조건절 마다 정리를 해서 return + **/ + function getConditionPart($name, $value, $operation) { + switch($operation) { + case 'equal' : + if(!$value) return; + return $name.' = '.$value; + break; + case 'more' : + if(!$value) return; + return $name.' >= '.$value; + break; + case 'excess' : + if(!$value) return; + return $name.' > '.$value; + break; + case 'less' : + if(!$value) return; + return $name.' <= '.$value; + break; + case 'below' : + if(!$value) return; + return $name.' < '.$value; + break; + case 'like_tail' : + case 'like_prefix' : + case 'like' : + if(!$value) return; + return $name.' like '.$value; + break; + case 'in' : + if(!$value) return; + return $name.' in ('.$value.')'; + break; + case 'notequal' : + if(!$value) return; + return $name.' <> '.$value; + break; + case 'notnull' : + return $name.' is not null'; + break; + case 'null' : + return $name.' is null'; + break; + } + } + } +?> diff --git a/classes/db/DBCubrid.class.php b/classes/db/DBCubrid.class.php new file mode 100644 index 000000000..a0d5897fb --- /dev/null +++ b/classes/db/DBCubrid.class.php @@ -0,0 +1,688 @@ + 'numeric(20)', + 'number' => 'integer', + 'varchar' => 'character varying', + 'char' => 'character', + 'text' => 'character varying(1073741823)', + 'bigtext' => 'character varying(1073741823)', + 'date' => 'character varying(14)', + ); + + /** + * @brief constructor + **/ + function DBCubrid() { + $this->_setDBInfo(); + $this->_connect(); + } + + /** + * @brief 설치 가능 여부를 return + **/ + function isSupported() { + if(!function_exists('cubrid_connect')) return false; + return true; + } + + /** + * @brief DB정보 설정 및 connect/ close + **/ + function _setDBInfo() { + $db_info = Context::getDBInfo(); + $this->hostname = $db_info->db_hostname; + $this->userid = $db_info->db_userid; + $this->password = $db_info->db_password; + $this->database = $db_info->db_database; + $this->port = $db_info->db_port; + $this->prefix = $db_info->db_table_prefix; + if(!substr($this->prefix,-1)!='_') $this->prefix .= '_'; + } + + /** + * @brief DB 접속 + **/ + function _connect() { + // db 정보가 없으면 무시 + if(!$this->hostname || !$this->userid || !$this->password || !$this->database || !$this->port) return; + + // 접속시도 + $this->fd = @cubrid_connect($this->hostname, $this->port, $this->database, $this->userid, $this->password); + + // 접속체크 + if(!$this->fd) { + $this->setError(-1, 'database connect fail'); + return $this->is_connected = false; + } + + $this->is_connected = true; + } + + /** + * @brief DB접속 해제 + **/ + function close() { + if(!$this->isConnected()) return; + @cubrid_commit($this->fd); + @cubrid_disconnect($this->fd); + $this->transaction_started = false; + } + + /** + * @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절 + **/ + function addQuotes($string) { + if(!$this->fd) return $string; + if(get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string)); + if(!is_numeric($string)) $string = str_replace("'","''",$string); + return $string; + } + + /** + * @brief 트랜잭션 시작 + **/ + function begin() { + if(!$this->isConnected() || $this->transaction_started) return; + $this->transaction_started = true; + } + + /** + * @brief 롤백 + **/ + function rollback() { + if(!$this->isConnected() || !$this->transaction_started) return; + @cubrid_rollback($this->fd); + $this->transaction_started = false; + } + + /** + * @brief 커밋 + **/ + function commit() { + if(!$force && (!$this->isConnected() || !$this->transaction_started)) return; + @cubrid_commit($this->fd); + $this->transaction_started = false; + } + + + /** + * @brief : 쿼리문의 실행 및 결과의 fetch 처리 + * + * query : query문 실행하고 result return\n + * fetch : reutrn 된 값이 없으면 NULL\n + * rows이면 array object\n + * row이면 object\n + * return\n + **/ + function _query($query) { + //echo "(((".$this->backtrace().")))"; + if(!$query || !$this->isConnected()) return; + + // 쿼리 시작을 알림 + $this->actStart($query); + + // 쿼리 문 실행 + $result = @cubrid_execute($this->fd, $query); + + // 오류 체크 + if(cubrid_error_code()) $this->setError(cubrid_error_code(), cubrid_error_msg()); + + // 쿼리 실행 종료를 알림 + $this->actFinish(); + + // 결과 리턴 + return $result; + } + + /** + * @brief 결과를 fetch + **/ + function _fetch($result) { + if(!$this->isConnected() || $this->isError() || !$result) return; + + while($tmp = cubrid_fetch($result, CUBRID_OBJECT)) { + $output[] = $tmp; + } + + if($result) cubrid_close_request($result); + + if(count($output)==1) return $output[0]; + return $output; + } + + /** + * @brief 1씩 증가되는 sequence값을 return (cubrid의 auto_increment는 sequence테이블에서만 사용) + **/ + function getNextSequence() { + $query = sprintf("select %ssequence.nextval as seq from db_root", $this->prefix); + $result = $this->_query($query); + $output = $this->_fetch($result); + return $output->seq; + } + + /** + * @brief 테이블 기생성 여부 return + **/ + function isTableExists($target_name) { + if($target_name == 'sequence') + $query = sprintf("select * from db_serial where name = '%s%s'", $this->prefix, $target_name); + else + $query = sprintf("select * from db_class where class_name = '%s%s'", $this->prefix, $target_name); + $result = $this->_query($query); + + if(cubrid_num_rows($result)>0) $output = true; + else $output = false; + + if($result) cubrid_close_request($result); + return $output; + } + + /** + * @brief 특정 테이블에 특정 column 추가 + **/ + function addColumn($table_name, $column_name, $type='number', $size='', $default = '', $notnull=false) { + $type = $this->column_type[$type]; + if(strtoupper($type)=='INTEGER') $size = ''; + + $query = sprintf("alter class %s%s add %s ", $this->prefix, $table_name, $column_name); + if($size) $query .= sprintf(" %s(%s) ", $type, $size); + else $query .= sprintf(" %s ", $type); + if($default) $query .= sprintf(" default '%s' ", $default); + if($notnull) $query .= " not null "; + + $this->_query($query); + } + + /** + * @brief 특정 테이블의 column의 정보를 return + **/ + function isColumnExists($table_name, $column_name) { + $query = sprintf("select * from db_attribute where attr_name ='%s' and class_name = '%s%s'", + $column_name, $this->prefix, $table_name); + $result = $this->_query($query); + if(cubrid_num_rows($result)>0) $output = true; + else $output = false; + + if($result) cubrid_close_request($result); + return $output; + } + + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXml($xml_doc) { + return $this->_createTable($xml_doc); + } + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXmlFile($file_name) { + if(!file_exists($file_name)) return; + // xml 파일을 읽음 + $buff = FileHandler::readFile($file_name); + return $this->_createTable($buff); + } + + /** + * @brief schema xml을 이용하여 create class query생성 + * + * type : number, varchar, text, char, date, \n + * opt : notnull, default, size\n + * index : primary key, index, unique\n + **/ + function _createTable($xml_doc) { + // xml parsing + $oXml = new XmlParser(); + $xml_obj = $oXml->parse($xml_doc); + + // 테이블 생성 schema 작성 + $table_name = $xml_obj->table->attrs->name; + + // 만약 테이블 이름이 sequence라면 serial 생성 + if($table_name == 'sequence') { + + $query = sprintf('create serial %s start with 1 increment by 1 minvalue 1 maxvalue 10000000000000000000000000000000000000 nocycle;', $this->prefix.$table_name); + return $this->_query($query); + } + + if($this->isTableExists($table_name)) return; + + $table_name = $this->prefix.$table_name; + + $query = sprintf('create class %s;', $table_name); + $this->_query($query); + + $query = sprintf("call change_owner('%s','%s') on class db_root;", $table_name, $this->userid); + $this->_query($query); + + if(!is_array($xml_obj->table->column)) $columns[] = $xml_obj->table->column; + else $columns = $xml_obj->table->column; + + $query = sprintf("alter class %s add attribute ", $table_name); + + foreach($columns as $column) { + $name = $column->attrs->name; + $type = $column->attrs->type; + $size = $column->attrs->size; + $notnull = $column->attrs->notnull; + $primary_key = $column->attrs->primary_key; + $index = $column->attrs->index; + $unique = $column->attrs->unique; + $default = $column->attrs->default; + + switch($this->column_type[$type]) { + case 'integer' : + $size = null; + break; + case 'text' : + $size = null; + break; + } + + if($default && !is_numeric($default)) $default = "'".$default."'"; + + $column_schema[] = sprintf('"%s" %s%s %s %s', + $name, + $this->column_type[$type], + $size?'('.$size.')':'', + $default?"default ".$default:'', + $notnull?'not null':'' + ); + + if($primary_key) $primary_list[] = $name; + else if($unique) $unique_list[$unique][] = $name; + else if($index) $index_list[$index][] = $name; + } + + $query .= implode(',', $column_schema).';'; + $this->_query($query); + + if(count($primary_list)) { + $query = sprintf("alter class %s add attribute constraint \"pkey_%s\" PRIMARY KEY(%s);", $table_name, $table_name, '"'.implode('","',$primary_list).'"'); + $this->_query($query); + } + + if(count($unique_list)) { + foreach($unique_list as $key => $val) { + $query = sprintf("create unique index %s_%s on %s (%s);", $table_name, $key, $table_name, '"'.implode('","',$val).'"'); + $this->_query($query); + } + } + + if(count($index_list)) { + foreach($index_list as $key => $val) { + $query = sprintf("create index %s_%s on %s (%s);", $table_name, $key, $table_name, '"'.implode('","',$val).'"'); + $this->_query($query); + } + } + } + + /** + * @brief 조건문 작성하여 return + **/ + function getCondition($output) { + if(!$output->conditions) return; + + $condition = ""; + foreach($output->conditions as $key => $val) { + $sub_condition = ''; + foreach($val['condition'] as $k =>$v) { + if(!$v['value']) continue; + + $name = $v['column']; + $operation = $v['operation']; + $value = $v['value']; + $type = $this->getColumnType($output->column_type,$name); + $pipe = $v['pipe']; + + $value = $this->getConditionValue($name, $value, $operation, $type); + if(!$value) $value = $v['value']; + if(strpos($name,'.')===false) $name = '"'.$name.'"'; + + $str = $this->getConditionPart($name, $value, $operation); + + if($sub_condition) $sub_condition .= ' '.$pipe.' '; + $sub_condition .= $str; + } + + if($sub_condition) { + if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' '; + $condition .= '('.$sub_condition.')'; + } + } + + if($condition) $condition = ' where '.$condition; + return $condition; + } + + /** + * @brief insertAct 처리 + **/ + function _executeInsertAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = '"'.$this->prefix.$key.'"'; + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + $name = $val['name']; + $value = $val['value']; + if($this->getColumnType($output->column_type,$name)!='number') { + $clen=strlen($value); + if ($clen <= $this->cutlen) + $value = "'".$this->addQuotes($value)."'"; + else { + $wrk=""; + $off=0; + while ($off<$clen) { + $wlen=$clen-$off; + if ($wlen>$this->cutlen) $wlen=$this->cutlen; + if ($off>0) $wrk .= "+\n"; + $wrk .= "'".$this->addQuotes(substr($value, $off, $wlen))."'"; + $off += $wlen; + } + $value = $wrk; + } + if(!$value) $value = 'null'; + } elseif(!$value || is_numeric($value)) $value = (int)$value; + + if(strpos($name,'.')===false) $column_list[] = '"'.$name.'"'; + else $column_list[] = $name; + $value_list[] = $value; + } + + $query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $value_list)); + return $this->_query($query); + } + + /** + * @brief updateAct 처리 + **/ + function _executeUpdateAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = "\"".$this->prefix.$key."\" as ".$val; + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + if(!isset($val['value'])) continue; + $name = $val['name']; + $value = $val['value']; + if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value; + else { + if($output->column_type[$name]!='number') { + $clen=strlen($value); + if ($clen <= $this->cutlen) + $value = "'".$this->addQuotes($value)."'"; + else { + $wrk=""; + $off=0; + while ($off<$clen) { + $wlen=$clen-$off; + if ($wlen>$this->cutlen) $wlen=$this->cutlen; + if ($off>0) $wrk .= "+\n"; + $wrk .= "'".$this->addQuotes(substr($value, $off, $wlen))."'"; + $off += $wlen; + } + $value = $wrk; + } + } + elseif(!$value || is_numeric($value)) $value = (int)$value; + + $column_list[] = sprintf("\"%s\" = %s", $name, $value); + } + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("update %s set %s %s", implode(',',$table_list), implode(',',$column_list), $condition); + + return $this->_query($query); + } + + /** + * @brief deleteAct 처리 + **/ + function _executeDeleteAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = '"'.$this->prefix.$key.'"'; + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("delete from %s %s", implode(',',$table_list), $condition); + + return $this->_query($query); + } + + /** + * @brief selectAct 처리 + * + * select의 경우 특정 페이지의 목록을 가져오는 것을 편하게 하기 위해\n + * navigation이라는 method를 제공 + **/ + function _executeSelectAct($output) { + // 테이블 정리 + $table_list = array(); + foreach($output->tables as $key => $val) { + $table_list[] = '"'.$this->prefix.$key.'" as '.$val; + } + + if(!$output->columns) { + $columns = '*'; + } else { + $column_list = array(); + foreach($output->columns as $key => $val) { + $name = $val['name']; + $alias = $val['alias']; + if($name == '*') { + $column_list[] = '*'; + } elseif(strpos($name,'.')===false && strpos($name,'(')===false) { + if($alias) $column_list[] = sprintf('"%s" as "%s"', $name, $alias); + else $column_list[] = sprintf('"%s"',$name); + } else { + if(strpos($name,'.')!=false) { + list($prefix, $name) = explode('.',$name); + $deli=($name == '*') ? "" : "\""; + if($alias) $column_list[] = sprintf("%s.$deli%s$deli as \"%s\"", $prefix, $name, $alias); + else $column_list[] = sprintf("%s.$deli%s$deli",$prefix,$name); + } else { + if($alias) $column_list[] = sprintf('%s as "%s"', $name, $alias); + else $column_list[] = sprintf('%s',$name); + } + } + } + $columns = implode(',',$column_list); + } + + $condition = $this->getCondition($output); + + if($output->list_count) return $this->_getNavigationData($table_list, $columns, $condition, $output); + + $query = sprintf("select %s from %s %s", $columns, implode(',',$table_list), $condition); + + if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); + + if($output->order) { + foreach($output->order as $key => $val) { + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + } + if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + } + + $result = $this->_query($query); + if($this->isError()) return; + $data = $this->_fetch($result); + + $buff = new Object(); + $buff->data = $data; + return $buff; + } + + /** + * @brief 현재 시점의 Stack trace를 보여줌.결과를 fetch + **/ + function backtrace() + { + $output = "
\n"; + $output .= "Backtrace:
\n"; + $backtrace = debug_backtrace(); + + foreach ($backtrace as $bt) { + $args = ''; + foreach ($bt['args'] as $a) { + if (!empty($args)) { + $args .= ', '; + } + switch (gettype($a)) { + case 'integer': + case 'double': + $args .= $a; + break; + case 'string': + $a = htmlspecialchars(substr($a, 0, 64)).((strlen($a) > 64) ? '...' : ''); + $args .= "\"$a\""; + break; + case 'array': + $args .= 'Array('.count($a).')'; + break; + case 'object': + $args .= 'Object('.get_class($a).')'; + break; + case 'resource': + $args .= 'Resource('.strstr($a, '#').')'; + break; + case 'boolean': + $args .= $a ? 'True' : 'False'; + break; + case 'NULL': + $args .= 'Null'; + break; + default: + $args .= 'Unknown'; + } + } + $output .= "
\n"; + $output .= "file: {$bt['line']} - {$bt['file']}
\n"; + $output .= "call: {$bt['class']}{$bt['type']}{$bt['function']}($args)
\n"; + } + $output .= "
\n"; + return $output; + } + + + /** + * @brief query xml에 navigation 정보가 있을 경우 페이징 관련 작업을 처리한다 + * + * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; + **/ + function _getNavigationData($table_list, $columns, $condition, $output) { + require_once('./classes/page/PageHandler.class.php'); + + // 전체 개수를 구함 + $count_query = sprintf('select count(*) as "count" from %s %s', implode(',',$table_list), $condition); + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; + + $list_count = $output->list_count['value']; + if(!$list_count) $list_count = 20; + $page_count = $output->page_count['value']; + if(!$page_count) $page_count = 10; + $page = $output->page['value']; + if(!$page) $page = 1; + + // 전체 페이지를 구함 + if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1; + else $total_page = 1; + + // 페이지 변수를 체크 + if($page > $total_page) $page = $total_page; + $start_count = ($page-1)*$list_count; + + $query = sprintf("select %s from %s %s", $columns, implode(',',$table_list), $condition); + + if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); + + if ($output->order) { + foreach($output->order as $key => $val) { + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + } + if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + $query = sprintf('%s for orderby_num() between %d and %d', $query, $start_count, $list_count); + } + else { + if (count($output->groups)) + $query = sprintf('%s having groupby_num() between %d and %d', $query, $start_count, $list_count); + else { + if ($condition) + $query = sprintf('%s and inst_num() between %d and %d', $query, $start_count, $list_count); + else + $query = sprintf('%s where inst_num() between %d and %d', $query, $start_count, $list_count); + } + } + + $result = $this->_query($query); + if($this->isError()) { + $buff = new Object(); + $buff->total_count = 0; + $buff->total_page = 0; + $buff->page = 1; + $buff->data = array(); + + $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); + return $buff; + } + + $virtual_no = $total_count - ($page-1)*$list_count; + while($tmp = cubrid_fetch($result, CUBRID_OBJECT)) { + $data[$virtual_no--] = $tmp; + } + + $buff = new Object(); + $buff->total_count = $total_count; + $buff->total_page = $total_page; + $buff->page = $page; + $buff->data = $data; + + $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); + return $buff; + } + } +?> diff --git a/classes/db/DBMysql.class.php b/classes/db/DBMysql.class.php new file mode 100644 index 000000000..7ec19b22c --- /dev/null +++ b/classes/db/DBMysql.class.php @@ -0,0 +1,552 @@ + 'bigint', + 'number' => 'bigint', + 'varchar' => 'varchar', + 'char' => 'char', + 'text' => 'text', + 'bigtext' => 'longtext', + 'date' => 'varchar(14)', + ); + + /** + * @brief constructor + **/ + function DBMysql() { + $this->_setDBInfo(); + $this->_connect(); + } + + /** + * @brief 설치 가능 여부를 return + **/ + function isSupported() { + if(!function_exists('mysql_connect')) return false; + return true; + } + + /** + * @brief DB정보 설정 및 connect/ close + **/ + function _setDBInfo() { + $db_info = Context::getDBInfo(); + $this->hostname = $db_info->db_hostname; + $this->userid = $db_info->db_userid; + $this->password = $db_info->db_password; + $this->database = $db_info->db_database; + $this->prefix = $db_info->db_table_prefix; + if(!substr($this->prefix,-1)!='_') $this->prefix .= '_'; + } + + /** + * @brief DB 접속 + **/ + function _connect() { + // db 정보가 없으면 무시 + if(!$this->hostname || !$this->userid || !$this->password || !$this->database) return; + + // 접속시도 + $this->fd = @mysql_connect($this->hostname, $this->userid, $this->password); + if(mysql_error()) { + $this->setError(mysql_errno(), mysql_error()); + return; + } + + // 버전 확인후 4.1 이하면 오류 표시 + if(mysql_get_server_info($this->fd)<"4.1") { + $this->setError(-1, "zeroboard xe can not install under mysql 4.1. Current mysql version is ".mysql_get_server_info()); + return; + } + + // db 선택 + @mysql_select_db($this->database, $this->fd); + if(mysql_error()) { + $this->setError(mysql_errno(), mysql_error()); + return; + } + + // 접속체크 + $this->is_connected = true; + + // mysql의 경우 utf8임을 지정 + $this->_query("set names 'utf8'"); + } + + /** + * @brief DB접속 해제 + **/ + function close() { + if(!$this->isConnected()) return; + @mysql_close($this->fd); + } + + /** + * @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절 + **/ + function addQuotes($string) { + if(get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string)); + if(!is_numeric($string)) $string = @mysql_escape_string($string); + return $string; + } + + /** + * @brief 트랜잭션 시작 + **/ + function begin() { + } + + /** + * @brief 롤백 + **/ + function rollback() { + } + + /** + * @brief 커밋 + **/ + function commit() { + } + + /** + * @brief : 쿼리문의 실행 및 결과의 fetch 처리 + * + * query : query문 실행하고 result return\n + * fetch : reutrn 된 값이 없으면 NULL\n + * rows이면 array object\n + * row이면 object\n + * return\n + **/ + function _query($query) { + if(!$this->isConnected()) return; + + // 쿼리 시작을 알림 + $this->actStart($query); + + // 쿼리 문 실행 + $result = @mysql_query($query, $this->fd); + + // 오류 체크 + if(mysql_error($this->fd)) $this->setError(mysql_errno($this->fd), mysql_error($this->fd)); + + // 쿼리 실행 종료를 알림 + $this->actFinish(); + + // 결과 리턴 + return $result; + } + + /** + * @brief 결과를 fetch + **/ + function _fetch($result) { + if(!$this->isConnected() || $this->isError() || !$result) return; + while($tmp = mysql_fetch_object($result)) { + $output[] = $tmp; + } + if(count($output)==1) return $output[0]; + return $output; + } + + /** + * @brief 1씩 증가되는 sequence값을 return (mysql의 auto_increment는 sequence테이블에서만 사용) + **/ + function getNextSequence() { + $query = sprintf("insert into `%ssequence` (seq) values ('')", $this->prefix); + $this->_query($query); + $sequence = mysql_insert_id(); + $query = sprintf("delete from `%ssequence` where seq < %d", $this->prefix, $sequence); + $this->_query($query); + + return $sequence; + } + + /** + * @brief 테이블 기생성 여부 return + **/ + function isTableExists($target_name) { + $query = sprintf("show tables like '%s%s'", $this->prefix, $this->addQuotes($target_name)); + $result = $this->_query($query); + $tmp = $this->_fetch($result); + if(!$tmp) return false; + return true; + } + + /** + * @brief 특정 테이블에 특정 column 추가 + **/ + function addColumn($table_name, $column_name, $type='number', $size='', $default = '', $notnull=false) { + $type = $this->column_type[$type]; + if(strtoupper($type)=='INTEGER') $size = ''; + + $query = sprintf("alter table %s%s add %s ", $this->prefix, $table_name, $column_name); + if($size) $query .= sprintf(" %s(%s) ", $type, $size); + else $query .= sprintf(" %s ", $type); + if($default) $query .= sprintf(" default '%s' ", $default); + if($notnull) $query .= " not null "; + + $this->_query($query); + } + + + /** + * @brief 특정 테이블의 column의 정보를 return + **/ + function isColumnExists($table_name, $column_name) { + $query = sprintf("show fields from %s%s", $this->prefix, $table_name); + $result = $this->_query($query); + if($this->isError()) return; + $output = $this->_fetch($result); + if($output) { + $column_name = strtolower($column_name); + foreach($output as $key => $val) { + $name = strtolower($val->Field); + if($column_name == $name) return true; + } + } + return false; + } + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXml($xml_doc) { + return $this->_createTable($xml_doc); + } + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXmlFile($file_name) { + if(!file_exists($file_name)) return; + // xml 파일을 읽음 + $buff = FileHandler::readFile($file_name); + return $this->_createTable($buff); + } + + /** + * @brief schema xml을 이용하여 create table query생성 + * + * type : number, varchar, text, char, date, \n + * opt : notnull, default, size\n + * index : primary key, index, unique\n + **/ + function _createTable($xml_doc) { + // xml parsing + $oXml = new XmlParser(); + $xml_obj = $oXml->parse($xml_doc); + + // 테이블 생성 schema 작성 + $table_name = $xml_obj->table->attrs->name; + if($this->isTableExists($table_name)) return; + $table_name = $this->prefix.$table_name; + + if(!is_array($xml_obj->table->column)) $columns[] = $xml_obj->table->column; + else $columns = $xml_obj->table->column; + + foreach($columns as $column) { + $name = $column->attrs->name; + $type = $column->attrs->type; + $size = $column->attrs->size; + $notnull = $column->attrs->notnull; + $primary_key = $column->attrs->primary_key; + $index = $column->attrs->index; + $unique = $column->attrs->unique; + $default = $column->attrs->default; + $auto_increment = $column->attrs->auto_increment; + + $column_schema[] = sprintf('`%s` %s%s %s %s %s', + $name, + $this->column_type[$type], + $size?'('.$size.')':'', + $default?"default '".$default."'":'', + $notnull?'not null':'', + $auto_increment?'auto_increment':'' + ); + + if($primary_key) $primary_list[] = $name; + else if($unique) $unique_list[$unique][] = $name; + else if($index) $index_list[$index][] = $name; + } + + if(count($primary_list)) { + $column_schema[] = sprintf("primary key (%s)", '`'.implode($primary_list,'`,`').'`'); + } + + if(count($unique_list)) { + foreach($unique_list as $key => $val) { + $column_schema[] = sprintf("unique %s (%s)", $key, '`'.implode($val,'`,`').'`'); + } + } + + if(count($index_list)) { + foreach($index_list as $key => $val) { + $column_schema[] = sprintf("index %s (%s)", $key, '`'.implode($val,'`,`').'`'); + } + } + + $schema = sprintf('create table `%s` (%s%s) %s;', $this->addQuotes($table_name), "\n", implode($column_schema,",\n"), "ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci"); + + $output = $this->_query($schema); + if(!$output) return false; + } + + /** + * @brief 조건문 작성하여 return + **/ + function getCondition($output) { + if(!$output->conditions) return; + + foreach($output->conditions as $key => $val) { + $sub_condition = ''; + foreach($val['condition'] as $k =>$v) { + if(!$v['value']) continue; + + $name = $v['column']; + $operation = $v['operation']; + $value = $v['value']; + $type = $this->getColumnType($output->column_type,$name); + $pipe = $v['pipe']; + + $value = $this->getConditionValue($name, $value, $operation, $type); + if(!$value) $value = $v['value']; + $str = $this->getConditionPart($name, $value, $operation); + if($sub_condition) $sub_condition .= ' '.$pipe.' '; + $sub_condition .= $str; + } + if($sub_condition) { + if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' '; + $condition .= '('.$sub_condition.')'; + } + } + + if($condition) $condition = ' where '.$condition; + return $condition; + } + + /** + * @brief insertAct 처리 + **/ + function _executeInsertAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = '`'.$this->prefix.$key.'`'; + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + $name = $val['name']; + $value = $val['value']; + if($output->column_type[$name]!='number') { + $value = "'".$this->addQuotes($value)."'"; + if(!$value) $value = 'null'; + } elseif(!$value || is_numeric($value)) $value = (int)$value; + + $column_list[] = '`'.$name.'`'; + $value_list[] = $value; + } + + $query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $value_list)); + return $this->_query($query); + } + + /** + * @brief updateAct 처리 + **/ + function _executeUpdateAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = '`'.$this->prefix.$key.'` as '.$val; + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + if(!isset($val['value'])) continue; + $name = $val['name']; + $value = $val['value']; + if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value; + else { + if($output->column_type[$name]!='number') $value = "'".$this->addQuotes($value)."'"; + elseif(!$value || is_numeric($value)) $value = (int)$value; + + $column_list[] = sprintf("`%s` = %s", $name, $value); + } + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("update %s set %s %s", implode(',',$table_list), implode(',',$column_list), $condition); + + return $this->_query($query); + } + + /** + * @brief deleteAct 처리 + **/ + function _executeDeleteAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = '`'.$this->prefix.$key.'`'; + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("delete from %s %s", implode(',',$table_list), $condition); + + return $this->_query($query); + } + + /** + * @brief selectAct 처리 + * + * select의 경우 특정 페이지의 목록을 가져오는 것을 편하게 하기 위해\n + * navigation이라는 method를 제공 + **/ + function _executeSelectAct($output) { + // 테이블 정리 + $table_list = array(); + foreach($output->tables as $key => $val) { + $table_list[] = '`'.$this->prefix.$key.'` as '.$val; + } + + if(!$output->columns) { + $columns = '*'; + } else { + $column_list = array(); + foreach($output->columns as $key => $val) { + $name = $val['name']; + $alias = $val['alias']; + if($name == '*') { + $column_list[] = '*'; + } elseif(strpos($name,'.')===false && strpos($name,'(')===false) { + if($alias) $column_list[] = sprintf('`%s` as `%s`', $name, $alias); + else $column_list[] = sprintf('`%s`',$name); + } else { + if($alias) $column_list[] = sprintf('%s as `%s`', $name, $alias); + else $column_list[] = sprintf('%s',$name); + } + } + $columns = implode(',',$column_list); + } + + $condition = $this->getCondition($output); + + if($output->list_count) return $this->_getNavigationData($table_list, $columns, $condition, $output); + + $query = sprintf("select %s from %s %s", $columns, implode(',',$table_list), $condition); + + if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); + + if($output->order) { + foreach($output->order as $key => $val) { + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + } + if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + } + + $result = $this->_query($query); + if($this->isError()) return; + $data = $this->_fetch($result); + + $buff = new Object(); + $buff->data = $data; + return $buff; + } + + /** + * @brief query xml에 navigation 정보가 있을 경우 페이징 관련 작업을 처리한다 + * + * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; + **/ + function _getNavigationData($table_list, $columns, $condition, $output) { + require_once('./classes/page/PageHandler.class.php'); + + // 전체 개수를 구함 + $count_query = sprintf("select count(*) as count from %s %s", implode(',',$table_list), $condition); + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; + + $list_count = $output->list_count['value']; + if(!$list_count) $list_count = 20; + $page_count = $output->page_count['value']; + if(!$page_count) $page_count = 10; + $page = $output->page['value']; + if(!$page) $page = 1; + + // 전체 페이지를 구함 + if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1; + else $total_page = 1; + + // 페이지 변수를 체크 + if($page > $total_page) $page = $total_page; + $start_count = ($page-1)*$list_count; + + $query = sprintf("select %s from %s %s", $columns, implode(',',$table_list), $condition); + + if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); + + if(count($output->order)) { + foreach($output->order as $key => $val) { + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + } + if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + } + + $query = sprintf('%s limit %d, %d', $query, $start_count, $list_count); + + $result = $this->_query($query); + if($this->isError()) { + $buff = new Object(); + $buff->total_count = 0; + $buff->total_page = 0; + $buff->page = 1; + $buff->data = array(); + + $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); + return $buff; + } + + $virtual_no = $total_count - ($page-1)*$list_count; + while($tmp = mysql_fetch_object($result)) { + $data[$virtual_no--] = $tmp; + } + + $buff = new Object(); + $buff->total_count = $total_count; + $buff->total_page = $total_page; + $buff->page = $page; + $buff->data = $data; + + $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); + return $buff; + } + } +?> diff --git a/classes/db/DBMysql_innodb.class.php b/classes/db/DBMysql_innodb.class.php new file mode 100644 index 000000000..0c6dc539e --- /dev/null +++ b/classes/db/DBMysql_innodb.class.php @@ -0,0 +1,562 @@ + 'bigint', + 'number' => 'bigint', + 'varchar' => 'varchar', + 'char' => 'char', + 'text' => 'text', + 'bigtext' => 'longtext', + 'date' => 'varchar(14)', + ); + + /** + * @brief constructor + **/ + function DBMysql_innodb() { + $this->_setDBInfo(); + $this->_connect(); + } + + /** + * @brief 설치 가능 여부를 return + **/ + function isSupported() { + if(!function_exists('mysql_connect')) return false; + return true; + } + + /** + * @brief DB정보 설정 및 connect/ close + **/ + function _setDBInfo() { + $db_info = Context::getDBInfo(); + $this->hostname = $db_info->db_hostname; + $this->userid = $db_info->db_userid; + $this->password = $db_info->db_password; + $this->database = $db_info->db_database; + $this->prefix = $db_info->db_table_prefix; + if(!substr($this->prefix,-1)!='_') $this->prefix .= '_'; + } + + /** + * @brief DB 접속 + **/ + function _connect() { + // db 정보가 없으면 무시 + if(!$this->hostname || !$this->userid || !$this->password || !$this->database) return; + + // 접속시도 + $this->fd = @mysql_connect($this->hostname, $this->userid, $this->password); + if(mysql_error()) { + $this->setError(mysql_errno(), mysql_error()); + return; + } + + // 버전 확인후 4.1 이하면 오류 표시 + if(mysql_get_server_info($this->fd)<"4.1") { + $this->setError(-1, "zeroboard xe can not install under mysql 4.1. Current mysql version is ".mysql_get_server_info()); + return; + } + + // db 선택 + @mysql_select_db($this->database, $this->fd); + if(mysql_error()) { + $this->setError(mysql_errno(), mysql_error()); + return; + } + + // 접속체크 + $this->is_connected = true; + + // mysql의 경우 utf8임을 지정 + $this->_query("set names 'utf8'"); + } + + /** + * @brief DB접속 해제 + **/ + function close() { + if(!$this->isConnected()) return; + $this->_query("commit"); + @mysql_close($this->fd); + } + + /** + * @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절 + **/ + function addQuotes($string) { + if(get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string)); + if(!is_numeric($string)) $string = @mysql_escape_string($string); + return $string; + } + + /** + * @brief 트랜잭션 시작 + **/ + function begin() { + if(!$this->isConnected() || $this->transaction_started) return; + $this->_query("begin"); + } + + /** + * @brief 롤백 + **/ + function rollback() { + if(!$this->isConnected() || !$this->transaction_started) return; + $this->_query("rollback"); + $this->transaction_started = false; + } + + /** + * @brief 커밋 + **/ + function commit($force = false) { + if(!$force && (!$this->isConnected() || !$this->transaction_started)) return; + $this->_query("commit"); + $this->transaction_started = false; + } + + /** + * @brief : 쿼리문의 실행 및 결과의 fetch 처리 + * + * query : query문 실행하고 result return\n + * fetch : reutrn 된 값이 없으면 NULL\n + * rows이면 array object\n + * row이면 object\n + * return\n + **/ + function _query($query) { + if(!$this->isConnected()) return; + + // 쿼리 시작을 알림 + $this->actStart($query); + + // 쿼리 문 실행 + $result = @mysql_query($query, $this->fd); + + // 오류 체크 + if(mysql_error($this->fd)) $this->setError(mysql_errno($this->fd), mysql_error($this->fd)); + + // 쿼리 실행 종료를 알림 + $this->actFinish(); + + // 결과 리턴 + return $result; + } + + /** + * @brief 결과를 fetch + **/ + function _fetch($result) { + if(!$this->isConnected() || $this->isError() || !$result) return; + while($tmp = mysql_fetch_object($result)) { + $output[] = $tmp; + } + if(count($output)==1) return $output[0]; + return $output; + } + + /** + * @brief 1씩 증가되는 sequence값을 return (mysql의 auto_increment는 sequence테이블에서만 사용) + **/ + function getNextSequence() { + $query = sprintf("insert into `%ssequence` (seq) values ('')", $this->prefix); + $this->_query($query); + $sequence = mysql_insert_id(); + $query = sprintf("delete from `%ssequence` where seq < %d", $this->prefix, $sequence); + $this->_query($query); + + return $sequence; + } + + /** + * @brief 테이블 기생성 여부 return + **/ + function isTableExists($target_name) { + $query = sprintf("show tables like '%s%s'", $this->prefix, $this->addQuotes($target_name)); + $result = $this->_query($query); + $tmp = $this->_fetch($result); + if(!$tmp) return false; + return true; + } + + /** + * @brief 특정 테이블에 특정 column 추가 + **/ + function addColumn($table_name, $column_name, $type='number', $size='', $default = '', $notnull=false) { + $type = $this->column_type[$type]; + if(strtoupper($type)=='INTEGER') $size = ''; + + $query = sprintf("alter table %s%s add %s ", $this->prefix, $table_name, $column_name); + if($size) $query .= sprintf(" %s(%s) ", $type, $size); + else $query .= sprintf(" %s ", $type); + if($default) $query .= sprintf(" default '%s' ", $default); + if($notnull) $query .= " not null "; + + $this->_query($query); + } + + + /** + * @brief 특정 테이블의 column의 정보를 return + **/ + function isColumnExists($table_name, $column_name) { + $query = sprintf("show fields from %s%s", $this->prefix, $table_name); + $result = $this->_query($query); + if($this->isError()) return; + $output = $this->_fetch($result); + if($output) { + $column_name = strtolower($column_name); + foreach($output as $key => $val) { + $name = strtolower($val->Field); + if($column_name == $name) return true; + } + } + return false; + } + + + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXml($xml_doc) { + return $this->_createTable($xml_doc); + } + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXmlFile($file_name) { + if(!file_exists($file_name)) return; + // xml 파일을 읽음 + $buff = FileHandler::readFile($file_name); + return $this->_createTable($buff); + } + + /** + * @brief schema xml을 이용하여 create table query생성 + * + * type : number, varchar, text, char, date, \n + * opt : notnull, default, size\n + * index : primary key, index, unique\n + **/ + function _createTable($xml_doc) { + // xml parsing + $oXml = new XmlParser(); + $xml_obj = $oXml->parse($xml_doc); + + // 테이블 생성 schema 작성 + $table_name = $xml_obj->table->attrs->name; + if($this->isTableExists($table_name)) return; + $table_name = $this->prefix.$table_name; + + if(!is_array($xml_obj->table->column)) $columns[] = $xml_obj->table->column; + else $columns = $xml_obj->table->column; + + foreach($columns as $column) { + $name = $column->attrs->name; + $type = $column->attrs->type; + $size = $column->attrs->size; + $notnull = $column->attrs->notnull; + $primary_key = $column->attrs->primary_key; + $index = $column->attrs->index; + $unique = $column->attrs->unique; + $default = $column->attrs->default; + $auto_increment = $column->attrs->auto_increment; + + $column_schema[] = sprintf('`%s` %s%s %s %s %s', + $name, + $this->column_type[$type], + $size?'('.$size.')':'', + $default?"default '".$default."'":'', + $notnull?'not null':'', + $auto_increment?'auto_increment':'' + ); + + if($primary_key) $primary_list[] = $name; + else if($unique) $unique_list[$unique][] = $name; + else if($index) $index_list[$index][] = $name; + } + + if(count($primary_list)) { + $column_schema[] = sprintf("primary key (%s)", '`'.implode($primary_list,'`,`').'`'); + } + + if(count($unique_list)) { + foreach($unique_list as $key => $val) { + $column_schema[] = sprintf("unique %s (%s)", $key, '`'.implode($val,'`,`').'`'); + } + } + + if(count($index_list)) { + foreach($index_list as $key => $val) { + $column_schema[] = sprintf("index %s (%s)", $key, '`'.implode($val,'`,`').'`'); + } + } + + $schema = sprintf('create table `%s` (%s%s) %s;', $this->addQuotes($table_name), "\n", implode($column_schema,",\n"), "ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci"); + + $output = $this->_query($schema); + if(!$output) return false; + } + + /** + * @brief 조건문 작성하여 return + **/ + function getCondition($output) { + if(!$output->conditions) return; + + foreach($output->conditions as $key => $val) { + $sub_condition = ''; + foreach($val['condition'] as $k =>$v) { + if(!$v['value']) continue; + + $name = $v['column']; + $operation = $v['operation']; + $value = $v['value']; + $type = $this->getColumnType($output->column_type,$name); + $pipe = $v['pipe']; + + $value = $this->getConditionValue($name, $value, $operation, $type); + if(!$value) $value = $v['value']; + $str = $this->getConditionPart($name, $value, $operation); + if($sub_condition) $sub_condition .= ' '.$pipe.' '; + $sub_condition .= $str; + } + if($sub_condition) { + if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' '; + $condition .= '('.$sub_condition.')'; + } + } + + if($condition) $condition = ' where '.$condition; + return $condition; + } + + /** + * @brief insertAct 처리 + **/ + function _executeInsertAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = '`'.$this->prefix.$key.'`'; + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + $name = $val['name']; + $value = $val['value']; + if($output->column_type[$name]!='number') { + $value = "'".$this->addQuotes($value)."'"; + if(!$value) $value = 'null'; + } elseif(!$value || is_numeric($value)) $value = (int)$value; + + $column_list[] = '`'.$name.'`'; + $value_list[] = $value; + } + + $query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $value_list)); + return $this->_query($query); + } + + /** + * @brief updateAct 처리 + **/ + function _executeUpdateAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = '`'.$this->prefix.$key.'` as '.$val; + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + if(!isset($val['value'])) continue; + $name = $val['name']; + $value = $val['value']; + if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value; + else { + if($output->column_type[$name]!='number') $value = "'".$this->addQuotes($value)."'"; + elseif(!$value || is_numeric($value)) $value = (int)$value; + + $column_list[] = sprintf("`%s` = %s", $name, $value); + } + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("update %s set %s %s", implode(',',$table_list), implode(',',$column_list), $condition); + + return $this->_query($query); + } + + /** + * @brief deleteAct 처리 + **/ + function _executeDeleteAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = '`'.$this->prefix.$key.'`'; + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("delete from %s %s", implode(',',$table_list), $condition); + + return $this->_query($query); + } + + /** + * @brief selectAct 처리 + * + * select의 경우 특정 페이지의 목록을 가져오는 것을 편하게 하기 위해\n + * navigation이라는 method를 제공 + **/ + function _executeSelectAct($output) { + // 테이블 정리 + $table_list = array(); + foreach($output->tables as $key => $val) { + $table_list[] = '`'.$this->prefix.$key.'` as '.$val; + } + + if(!$output->columns) { + $columns = '*'; + } else { + $column_list = array(); + foreach($output->columns as $key => $val) { + $name = $val['name']; + $alias = $val['alias']; + if($name == '*') { + $column_list[] = '*'; + } elseif(strpos($name,'.')===false && strpos($name,'(')===false) { + if($alias) $column_list[] = sprintf('`%s` as `%s`', $name, $alias); + else $column_list[] = sprintf('`%s`',$name); + } else { + if($alias) $column_list[] = sprintf('%s as `%s`', $name, $alias); + else $column_list[] = sprintf('%s',$name); + } + } + $columns = implode(',',$column_list); + } + + $condition = $this->getCondition($output); + + if($output->list_count) return $this->_getNavigationData($table_list, $columns, $condition, $output); + + $query = sprintf("select %s from %s %s", $columns, implode(',',$table_list), $condition); + + if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); + + if($output->order) { + foreach($output->order as $key => $val) { + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + } + if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + } + + $result = $this->_query($query); + if($this->isError()) return; + $data = $this->_fetch($result); + + $buff = new Object(); + $buff->data = $data; + return $buff; + } + + /** + * @brief query xml에 navigation 정보가 있을 경우 페이징 관련 작업을 처리한다 + * + * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; + **/ + function _getNavigationData($table_list, $columns, $condition, $output) { + require_once('./classes/page/PageHandler.class.php'); + + // 전체 개수를 구함 + $count_query = sprintf("select count(*) as count from %s %s", implode(',',$table_list), $condition); + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; + + $list_count = $output->list_count['value']; + if(!$list_count) $list_count = 20; + $page_count = $output->page_count['value']; + if(!$page_count) $page_count = 10; + $page = $output->page['value']; + if(!$page) $page = 1; + + // 전체 페이지를 구함 + if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1; + else $total_page = 1; + + // 페이지 변수를 체크 + if($page > $total_page) $page = $total_page; + $start_count = ($page-1)*$list_count; + + $query = sprintf("select %s from %s %s", $columns, implode(',',$table_list), $condition); + if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); + + if($output->order) { + foreach($output->order as $key => $val) { + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + } + if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + } + + $query = sprintf('%s limit %d, %d', $query, $start_count, $list_count); + + $result = $this->_query($query); + if($this->isError()) { + $buff = new Object(); + $buff->total_count = 0; + $buff->total_page = 0; + $buff->page = 1; + $buff->data = array(); + + $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); + return $buff; + } + + $virtual_no = $total_count - ($page-1)*$list_count; + while($tmp = mysql_fetch_object($result)) { + $data[$virtual_no--] = $tmp; + } + + $buff = new Object(); + $buff->total_count = $total_count; + $buff->total_page = $total_page; + $buff->page = $page; + $buff->data = $data; + + $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); + return $buff; + } + } +?> diff --git a/classes/db/DBSqlite2.class.php b/classes/db/DBSqlite2.class.php new file mode 100644 index 000000000..0f4f1d227 --- /dev/null +++ b/classes/db/DBSqlite2.class.php @@ -0,0 +1,593 @@ + 'INTEGER', + 'number' => 'INTEGER', + 'varchar' => 'VARHAR', + 'char' => 'CHAR', + 'text' => 'TEXT', + 'bigtext' => 'TEXT', + 'date' => 'VARCHAR(14)', + ); + + /** + * @brief constructor + **/ + function DBSqlite2() { + $this->_setDBInfo(); + $this->_connect(); + } + + /** + * @brief 설치 가능 여부를 return + **/ + function isSupported() { + if(!function_exists('sqlite_open')) return false; + return true; + } + + /** + * @brief DB정보 설정 및 connect/ close + **/ + function _setDBInfo() { + $db_info = Context::getDBInfo(); + $this->database = $db_info->db_database; + $this->prefix = $db_info->db_table_prefix; + if(!substr($this->prefix,-1)!='_') $this->prefix .= '_'; + } + + /** + * @brief DB 접속 + **/ + function _connect() { + // db 정보가 없으면 무시 + if(!$this->database) return; + + // 데이터 베이스 파일 접속 시도 + $this->fd = sqlite_open($this->database, 0666, &$error); + if(!file_exists($this->database) || $error) { + $this->setError(-1,$error); + $this->is_connected = false; + return; + } + + // 접속체크 + $this->is_connected = true; + } + + /** + * @brief DB접속 해제 + **/ + function close() { + if(!$this->isConnected()) return; + sqlite_close($this->fd); + } + + /** + * @brief 트랜잭션 시작 + **/ + function begin() { + if(!$this->is_connected || $this->transaction_started) return; + if($this->_query("BEGIN;")) $this->transaction_started = true; + } + + /** + * @brief 롤백 + **/ + function rollback() { + if(!$this->is_connected || !$this->transaction_started) return; + $this->_query("ROLLBACK;"); + $this->transaction_started = false; + } + + /** + * @brief 커밋 + **/ + function commit($force = false) { + if(!$force && (!$this->isConnected() || !$this->transaction_started)) return; + if(!$this->is_connected || !$this->transaction_started) return; + $this->_query("COMMIT;"); + $this->transaction_started = false; + } + + /** + * @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절 + **/ + function addQuotes($string) { + if(get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string)); + if(!is_numeric($string)) $string = str_replace("'","''", $string); + return $string; + } + + /** + * @brief : 쿼리문의 실행 및 결과의 fetch 처리 + * + * query : query문 실행하고 result return\n + * fetch : reutrn 된 값이 없으면 NULL\n + * rows이면 array object\n + * row이면 object\n + * return\n + **/ + function _query($query) { + if(!$this->isConnected()) return; + + // 쿼리 시작을 알림 + $this->actStart($query); + + // 쿼리 문 실행 + $result = @sqlite_query($query, $this->fd); + + // 오류 체크 + if(sqlite_last_error($this->fd)) $this->setError(sqlite_last_error($this->fd), sqlite_error_string(sqlite_last_error($this->fd))); + + // 쿼리 실행 알림 + $this->actFinish(); + + return $result; + } + + /** + * @brief 결과를 fetch + **/ + function _fetch($result) { + if($this->isError() || !$result) return; + + while($tmp = sqlite_fetch_array($result, SQLITE_ASSOC)) { + unset($obj); + foreach($tmp as $key => $val) { + $pos = strpos($key, '.'); + if($pos) $key = substr($key, $pos+1); + $obj->{$key} = $val; + } + $output[] = $obj; + } + + if(count($output)==1) return $output[0]; + return $output; + } + + /** + * @brief 1씩 증가되는 sequence값을 return + **/ + function getNextSequence() { + $query = sprintf("insert into %ssequence (seq) values ('')", $this->prefix); + $this->_query($query); + $sequence = sqlite_last_insert_rowid($this->fd); + $query = sprintf("delete from %ssequence where seq < %d", $this->prefix, $sequence); + $this->_query($query); + + return $sequence; + } + + /** + * @brief 테이블 기생성 여부 return + **/ + function isTableExists($target_name) { + $query = sprintf('pragma table_info(%s%s)', $this->prefix, $this->addQuotes($target_name)); + $result = $this->_query($query); + if(sqlite_num_rows($result)==0) return false; + return true; + } + + /** + * @brief 특정 테이블에 특정 column 추가 + **/ + function addColumn($table_name, $column_name, $type='number', $size='', $default = '', $notnull=false) { + $type = $this->column_type[$type]; + if(strtoupper($type)=='INTEGER') $size = ''; + + $query = sprintf("alter table %s%s add %s ", $this->prefix, $table_name, $column_name); + if($size) $query .= sprintf(" %s(%s) ", $type, $size); + else $query .= sprintf(" %s ", $type); + if($default) $query .= sprintf(" default '%s' ", $default); + if($notnull) $query .= " not null "; + + return $this->_query($query); + } + + + /** + * @brief 특정 테이블의 column의 정보를 return + **/ + function isColumnExists($table_name, $column_name) { + $query = sprintf("pragma table_info(%s%s)", $this->prefix, $table_name); + $result = $this->_query($query); + $output = $this->_fetch($result); + if($output) { + $column_name = strtolower($column_name); + foreach($output as $key => $val) { + $name = strtolower($val->name); + if($column_name == $name) return true; + } + } + return false; + } + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXml($xml_doc) { + return $this->_createTable($xml_doc); + } + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXmlFile($file_name) { + if(!file_exists($file_name)) return; + // xml 파일을 읽음 + $buff = FileHandler::readFile($file_name); + return $this->_createTable($buff); + } + + /** + * @brief schema xml을 이용하여 create table query생성 + * + * type : number, varchar, text, char, date, \n + * opt : notnull, default, size\n + * index : primary key, index, unique\n + **/ + function _createTable($xml_doc) { + // xml parsing + $oXml = new XmlParser(); + $xml_obj = $oXml->parse($xml_doc); + + // 테이블 생성 schema 작성 + $table_name = $xml_obj->table->attrs->name; + if($this->isTableExists($table_name)) return; + $table_name = $this->prefix.$table_name; + + if(!is_array($xml_obj->table->column)) $columns[] = $xml_obj->table->column; + else $columns = $xml_obj->table->column; + + foreach($columns as $column) { + $name = $column->attrs->name; + $type = $column->attrs->type; + if(strtoupper($this->column_type[$type])=='INTEGER') $size = ''; + else $size = $column->attrs->size; + $notnull = $column->attrs->notnull; + $primary_key = $column->attrs->primary_key; + $index = $column->attrs->index; + $unique = $column->attrs->unique; + $default = $column->attrs->default; + $auto_increment = $column->attrs->auto_increment; + + if($auto_increment) { + $column_schema[] = sprintf('%s %s %s', + $name, + $this->column_type[$type], + $auto_increment?'AUTOINCREMENT':'' + ); + } else { + $column_schema[] = sprintf('%s %s%s %s %s %s %s', + $name, + $this->column_type[$type], + $size?'('.$size.')':'', + $notnull?'NOT NULL':'', + $primary_key?'PRIMARY KEY':'', + $default?"DEFAULT '".$default."'":'', + $auto_increment?'AUTOINCREMENT':'' + ); + } + + if($unique) $unique_list[$unique][] = $name; + else if($index) $index_list[$index][] = $name; + } + + $schema = sprintf('CREATE TABLE %s (%s%s) ;', $this->addQuotes($table_name)," ", implode($column_schema,", ")); + $this->_query($schema); + + if(count($unique_list)) { + foreach($unique_list as $key => $val) { + $query = sprintf('CREATE UNIQUE INDEX %s_%s ON %s (%s)', $this->addQuotes($table_name), $key, $this->addQuotes($table_name), implode(',',$val)); + $this->_query($query); + } + } + + if(count($index_list)) { + foreach($index_list as $key => $val) { + $query = sprintf('CREATE INDEX %s_%s ON %s (%s)', $this->addQuotes($table_name), $key, $this->addQuotes($table_name), implode(',',$val)); + $this->_query($query); + } + } + } + + /** + * @brief 조건문 작성하여 return + **/ + function getCondition($output) { + if(!$output->conditions) return; + + foreach($output->conditions as $key => $val) { + $sub_condition = ''; + foreach($val['condition'] as $k =>$v) { + if(!$v['value']) continue; + + $name = $v['column']; + $operation = $v['operation']; + $value = $v['value']; + $type = $this->getColumnType($output->column_type,$name); + $pipe = $v['pipe']; + + $value = $this->getConditionValue($name, $value, $operation, $type); + if(!$value) $value = $v['value']; + $str = $this->getConditionPart($name, $value, $operation); + if($sub_condition) $sub_condition .= ' '.$pipe.' '; + $sub_condition .= $str; + } + if($sub_condition) { + if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' '; + $condition .= '('.$sub_condition.')'; + } + } + + if($condition) $condition = ' where '.$condition; + return $condition; + } + + /** + * @brief insertAct 처리 + **/ + function _executeInsertAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = $this->prefix.$key; + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + $name = $val['name']; + $value = $val['value']; + if($output->column_type[$name]!='number') { + $value = "'".$this->addQuotes($value)."'"; + if(!$value) $value = 'null'; + } elseif(!$value || is_numeric($value)) $value = (int)$value; + + $column_list[] = $name; + $value_list[] = $value; + } + + $query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $value_list)); + return $this->_query($query); + } + + /** + * @brief updateAct 처리 + **/ + function _executeUpdateAct($output) { + $table_count = count(array_values($output->tables)); + + // 대상 테이블이 1개일 경우 + if($table_count == 1) { + // 테이블 정리 + list($target_table) = array_keys($output->tables); + $target_table = $this->prefix.$target_table; + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + if(!isset($val['value'])) continue; + $name = $val['name']; + $value = $val['value']; + if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value; + else { + if($output->column_type[$name]!='number') $value = "'".$this->addQuotes($value)."'"; + elseif(!$value || is_numeric($value)) $value = (int)$value; + + $column_list[] = sprintf("%s = %s", $name, $value); + } + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("update %s set %s %s", $target_table, implode(',',$column_list), $condition); + + // 대상 테이블이 2개일 경우 (sqlite에서 update 테이블을 1개 이상 지정 못해서 이렇게 꽁수로... 다른 방법이 있으려나..) + } elseif($table_count == 2) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[$val] = $this->prefix.$val; + } + list($source_table, $target_table) = array_values($table_list); + + // 조건절 정리 + $condition = $this->getCondition($output); + foreach($table_list as $key => $val) { + $condition = eregi_replace($key.'\\.', $val.'.', $condition); + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + if(!isset($val['value'])) continue; + $name = $val['name']; + $value = $val['value']; + list($s_prefix, $s_column) = explode('.',$name); + list($t_prefix, $t_column) = explode('.',$value); + + $s_table = $table_list[$s_prefix]; + $t_table = $table_list[$t_prefix]; + $column_list[] = sprintf(' %s = (select %s from %s %s) ', $s_column, $t_column, $t_table, $condition); + } + + $query = sprintf('update %s set %s where exists(select * from %s %s)', $source_table, implode(',', $column_list), $target_table, $condition); + } else { + return; + } + + return $this->_query($query); + } + + /** + * @brief deleteAct 처리 + **/ + function _executeDeleteAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = $this->prefix.$key; + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("delete from %s %s", implode(',',$table_list), $condition); + + return $this->_query($query); + } + + /** + * @brief selectAct 처리 + * + * select의 경우 특정 페이지의 목록을 가져오는 것을 편하게 하기 위해\n + * navigation이라는 method를 제공 + **/ + function _executeSelectAct($output) { + // 테이블 정리 + $table_list = array(); + foreach($output->tables as $key => $val) { + $table_list[] = $this->prefix.$key.' as '.$val; + } + + if(!$output->columns) { + $columns = '*'; + } else { + $column_list = array(); + foreach($output->columns as $key => $val) { + $name = $val['name']; + $alias = $val['alias']; + if($name == '*') { + $column_list[] = '*'; + } elseif(strpos($name,'.')===false && strpos($name,'(')===false) { + if($alias) $column_list[] = sprintf('%s as %s', $name, $alias); + else $column_list[] = sprintf('%s',$name); + } else { + if($alias) $column_list[] = sprintf('%s as %s', $name, $alias); + else $column_list[] = sprintf('%s',$name); + } + } + $columns = implode(',',$column_list); + } + + $condition = $this->getCondition($output); + + if($output->list_count) return $this->_getNavigationData($table_list, $columns, $condition, $output); + + $query = sprintf("select %s from %s %s", $columns, implode(',',$table_list), $condition); + + if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); + + if($output->order) { + foreach($output->order as $key => $val) { + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + } + if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + } + + $result = $this->_query($query); + if($this->isError()) return; + $data = $this->_fetch($result); + + $buff = new Object(); + $buff->data = $data; + return $buff; + } + + /** + * @brief query xml에 navigation 정보가 있을 경우 페이징 관련 작업을 처리한다 + * + * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; + **/ + function _getNavigationData($table_list, $columns, $condition, $output) { + require_once('./classes/page/PageHandler.class.php'); + + // 전체 개수를 구함 + $count_query = sprintf("select count(*) as count from %s %s", implode(',',$table_list), $condition); + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; + + $list_count = $output->list_count['value']; + if(!$list_count) $list_count = 20; + $page_count = $output->page_count['value']; + if(!$page_count) $page_count = 10; + $page = $output->page['value']; + if(!$page) $page = 1; + + // 전체 페이지를 구함 + if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1; + else $total_page = 1; + + // 페이지 변수를 체크 + if($page > $total_page) $page = $total_page; + $start_count = ($page-1)*$list_count; + + $query = sprintf("select %s from %s %s", $columns, implode(',',$table_list), $condition); + + if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); + + if($output->order) { + foreach($output->order as $key => $val) { + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + } + if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + } + + $query = sprintf('%s limit %d, %d', $query, $start_count, $list_count); + + $result = $this->_query($query); + if($this->isError()) { + $buff = new Object(); + $buff->total_count = 0; + $buff->total_page = 0; + $buff->page = 1; + $buff->data = array(); + + $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); + return $buff; + } + + if($result) { + $virtual_no = $total_count - ($page-1)*$list_count; + while($tmp = sqlite_fetch_array($result, SQLITE_ASSOC)) { + unset($obj); + foreach($tmp as $key => $val) { + $pos = strpos($key, '.'); + if($pos) $key = substr($key, $pos+1); + $obj->{$key} = $val; + } + $data[$virtual_no--] = $obj; + } + } + + $buff = new Object(); + $buff->total_count = $total_count; + $buff->total_page = $total_page; + $buff->page = $page; + $buff->data = $data; + + $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); + return $buff; + } + } +?> diff --git a/classes/db/DBSqlite3_pdo.class.php b/classes/db/DBSqlite3_pdo.class.php new file mode 100644 index 000000000..e831a13d2 --- /dev/null +++ b/classes/db/DBSqlite3_pdo.class.php @@ -0,0 +1,647 @@ + 'INTEGER', + 'number' => 'INTEGER', + 'varchar' => 'VARHAR', + 'char' => 'CHAR', + 'text' => 'TEXT', + 'bigtext' => 'TEXT', + 'date' => 'VARCHAR(14)', + ); + + /** + * @brief constructor + **/ + function DBSqlite3_pdo() { + $this->_setDBInfo(); + $this->_connect(); + } + + /** + * @brief 설치 가능 여부를 return + **/ + function isSupported() { + if(!class_exists('PDO')) return false; + return true; + } + + /** + * @brief DB정보 설정 및 connect/ close + **/ + function _setDBInfo() { + $db_info = Context::getDBInfo(); + $this->database = $db_info->db_database; + $this->prefix = $db_info->db_table_prefix; + if(!substr($this->prefix,-1)!='_') $this->prefix .= '_'; + } + + /** + * @brief DB 접속 + **/ + function _connect() { + // db 정보가 없으면 무시 + if(!$this->database) return; + + // 데이터 베이스 파일 접속 시도 + $this->handler = new PDO('sqlite:'.$this->database); + + if(!file_exists($this->database) || $error) { + $this->setError(-1,'permission denied to access database'); + //$this->setError(-1,$error); + $this->is_connected = false; + return; + } + + // 접속체크 + $this->is_connected = true; + } + + /** + * @brief DB접속 해제 + **/ + function close() { + if(!$this->isConnected()) return; + $this->commit(); + } + + /** + * @brief 트랜잭션 시작 + **/ + function begin() { + if(!$this->isConnected() || $this->transaction_started) return; + if($this->handler->beginTransaction()) $this->transaction_started = true; + } + + /** + * @brief 롤백 + **/ + function rollback() { + if(!$this->isConnected() || !$this->transaction_started) return; + $this->handler->rollBack(); + $this->transaction_started = false; + } + + /** + * @brief 커밋 + **/ + function commit($force = false) { + if(!$force && (!$this->isConnected() || !$this->transaction_started)) return; + $this->handler->commit(); + $this->transaction_started = false; + } + + /** + * @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절 + **/ + function addQuotes($string) { + if(get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string)); + if(!is_numeric($string)) $string = str_replace("'","''",$string); + return $string; + } + + /** + * @brief : 쿼리문의 prepare + **/ + function _prepare($query) { + if(!$this->isConnected()) return; + + // 쿼리 시작을 알림 + $this->actStart($query); + + $this->stmt = $this->handler->prepare($query); + + if($this->handler->errorCode() != '00000') { + $this->setError($this->handler->errorCode(), print_r($this->handler->errorInfo(),true)); + $this->actFinish(); + } + $this->bind_idx = 0; + $this->bind_vars = array(); + } + + /** + * @brief : stmt에 binding params + **/ + function _bind($val) { + if(!$this->isConnected() || !$this->stmt) return; + + $this->bind_idx ++; + $this->bind_vars[] = $val; + $this->stmt->bindParam($this->bind_idx, $val); + } + + /** + * @brief : prepare된 쿼리의 execute + **/ + function _execute() { + if(!$this->isConnected() || !$this->stmt) return; + + $this->stmt->execute(); + + if($this->stmt->errorCode() === '00000') { + $output = null; + while($tmp = $this->stmt->fetch(PDO::FETCH_ASSOC)) { + unset($obj); + foreach($tmp as $key => $val) { + $pos = strpos($key, '.'); + if($pos) $key = substr($key, $pos+1); + $obj->{$key} = str_replace("''","'",$val); + } + $output[] = $obj; + } + } else { + $this->setError($this->stmt->errorCode(),print_r($this->stmt->errorInfo(),true)); + } + + $this->stmt = null; + $this->actFinish(); + + if(is_array($output) && count($output)==1) return $output[0]; + return $output; + } + + /** + * @brief 1씩 증가되는 sequence값을 return + **/ + function getNextSequence() { + $query = sprintf("insert into %ssequence (seq) values (NULL)", $this->prefix); + $this->_prepare($query); + $result = $this->_execute(); + $sequence = $this->handler->lastInsertId(); + $query = sprintf("delete from %ssequence where seq < %d", $this->prefix, $sequence); + $this->_prepare($query); + $result = $this->_execute(); + + return $sequence; + } + + /** + * @brief 테이블 기생성 여부 return + **/ + function isTableExists($target_name) { + $query = sprintf('pragma table_info(%s%s)', $this->prefix, $target_name); + $this->_prepare($query); + if(!$this->_execute()) return false; + return true; + } + + /** + * @brief 특정 테이블에 특정 column 추가 + **/ + function addColumn($table_name, $column_name, $type='number', $size='', $default = '', $notnull=false) { + $type = $this->column_type[$type]; + if(strtoupper($type)=='INTEGER') $size = ''; + + $query = sprintf("alter table %s%s add %s ", $this->prefix, $table_name, $column_name); + if($size) $query .= sprintf(" %s(%s) ", $type, $size); + else $query .= sprintf(" %s ", $type); + if($default) $query .= sprintf(" default '%s' ", $default); + if($notnull) $query .= " not null "; + + $this->_prepare($query); + return $this->_execute(); + } + + /** + * @brief 특정 테이블의 column의 정보를 return + **/ + function isColumnExists($table_name, $column_name) { + $query = sprintf("pragma table_info(%s%s)", $this->prefix, $table_name); + $this->_prepare($query); + $output = $this->_execute(); + + if($output) { + $column_name = strtolower($column_name); + foreach($output as $key => $val) { + $name = strtolower($val->name); + if($column_name == $name) return true; + } + } + return false; + } + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXml($xml_doc) { + return $this->_createTable($xml_doc); + } + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXmlFile($file_name) { + if(!file_exists($file_name)) return; + // xml 파일을 읽음 + $buff = FileHandler::readFile($file_name); + return $this->_createTable($buff); + } + + /** + * @brief schema xml을 이용하여 create table query생성 + * + * type : number, varchar, text, char, date, \n + * opt : notnull, default, size\n + * index : primary key, index, unique\n + **/ + function _createTable($xml_doc) { + // xml parsing + $oXml = new XmlParser(); + $xml_obj = $oXml->parse($xml_doc); + + // 테이블 생성 schema 작성 + $table_name = $xml_obj->table->attrs->name; + if($this->isTableExists($table_name)) return; + $table_name = $this->prefix.$table_name; + + if(!is_array($xml_obj->table->column)) $columns[] = $xml_obj->table->column; + else $columns = $xml_obj->table->column; + + foreach($columns as $column) { + $name = $column->attrs->name; + $type = $column->attrs->type; + if(strtoupper($this->column_type[$type])=='INTEGER') $size = ''; + else $size = $column->attrs->size; + $notnull = $column->attrs->notnull; + $primary_key = $column->attrs->primary_key; + $index = $column->attrs->index; + $unique = $column->attrs->unique; + $default = $column->attrs->default; + $auto_increment = $column->attrs->auto_increment; + + if($auto_increment) { + $column_schema[] = sprintf('%s %s PRIMARY KEY %s', + $name, + $this->column_type[$type], + $auto_increment?'AUTOINCREMENT':'' + ); + } else { + $column_schema[] = sprintf('%s %s%s %s %s %s', + $name, + $this->column_type[$type], + $size?'('.$size.')':'', + $notnull?'NOT NULL':'', + $primary_key?'PRIMARY KEY':'', + $default?"DEFAULT '".$default."'":'' + ); + } + + if($unique) $unique_list[$unique][] = $name; + else if($index) $index_list[$index][] = $name; + } + + $schema = sprintf('CREATE TABLE %s (%s%s) ;', $table_name," ", implode($column_schema,", ")); + $this->_prepare($schema); + $this->_execute(); + if($this->isError()) return; + + if(count($unique_list)) { + foreach($unique_list as $key => $val) { + $query = sprintf('CREATE UNIQUE INDEX %s_%s ON %s (%s)', $this->addQuotes($table_name), $key, $this->addQuotes($table_name), implode(',',$val)); + $this->_prepare($query); + $this->_execute(); + if($this->isError()) $this->rollback(); + } + } + + if(count($index_list)) { + foreach($index_list as $key => $val) { + $query = sprintf('CREATE INDEX %s_%s ON %s (%s)', $this->addQuotes($table_name), $key, $this->addQuotes($table_name), implode(',',$val)); + $this->_prepare($query); + $this->_execute(); + if($this->isError()) $this->rollback(); + } + } + } + + /** + * @brief 조건문 작성하여 return + **/ + function getCondition($output) { + if(!$output->conditions) return; + + foreach($output->conditions as $key => $val) { + $sub_condition = ''; + foreach($val['condition'] as $k =>$v) { + if(!$v['value']) continue; + + $name = $v['column']; + $operation = $v['operation']; + $value = $v['value']; + $type = $this->getColumnType($output->column_type,$name); + $pipe = $v['pipe']; + + $value = $this->getConditionValue($name, $value, $operation, $type); + if(!$value) $value = $v['value']; + + $str = $this->getConditionPart($name, $value, $operation); + if($sub_condition) $sub_condition .= ' '.$pipe.' '; + $sub_condition .= $str; + } + if($sub_condition) { + if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' '; + $condition .= '('.$sub_condition.')'; + } + } + + if($condition) $condition = ' where '.$condition; + return $condition; + } + + /** + * @brief insertAct 처리 + **/ + function _executeInsertAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = $this->prefix.$key; + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + $name = $val['name']; + $value = $val['value']; + + $key_list[] = $name; + + if($output->column_type[$name]!='number') $val_list[] = $this->addQuotes($value); + else { + if(!$value || is_numeric($value)) $value = (int)$value; + $val_list[] = $value; + } + + $prepare_list[] = '?'; + } + + $query = sprintf("INSERT INTO %s (%s) VALUES (%s);", implode(',',$table_list), implode(',',$key_list), implode(',',$prepare_list)); + + $this->_prepare($query); + + $val_count = count($val_list); + for($i=0;$i<$val_count;$i++) $this->_bind($val_list[$i]); + + return $this->_execute(); + } + + /** + * @brief updateAct 처리 + **/ + function _executeUpdateAct($output) { + $table_count = count(array_values($output->tables)); + + // 대상 테이블이 1개일 경우 + if($table_count == 1) { + // 테이블 정리 + list($target_table) = array_keys($output->tables); + $target_table = $this->prefix.$target_table; + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + if(!isset($val['value'])) continue; + $name = $val['name']; + $value = $val['value']; + if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value; + else { + if($output->column_type[$name]!='number') $value = "'".$this->addQuotes($value)."'"; + elseif(!$value || is_numeric($value)) $value = (int)$value; + + $column_list[] = sprintf("%s = %s", $name, $value); + } + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("update %s set %s %s", $target_table, implode(',',$column_list), $condition); + + // 대상 테이블이 2개일 경우 (sqlite에서 update 테이블을 1개 이상 지정 못해서 이렇게 꽁수로... 다른 방법이 있으려나..) + } elseif($table_count == 2) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[$val] = $this->prefix.$val; + } + list($source_table, $target_table) = array_values($table_list); + + // 조건절 정리 + $condition = $this->getCondition($output); + foreach($table_list as $key => $val) { + $condition = eregi_replace($key.'\\.', $val.'.', $condition); + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + if(!isset($val['value'])) continue; + $name = $val['name']; + $value = $val['value']; + list($s_prefix, $s_column) = explode('.',$name); + list($t_prefix, $t_column) = explode('.',$value); + + $s_table = $table_list[$s_prefix]; + $t_table = $table_list[$t_prefix]; + $column_list[] = sprintf(' %s = (select %s from %s %s) ', $s_column, $t_column, $t_table, $condition); + } + + $query = sprintf('update %s set %s where exists(select * from %s %s)', $source_table, implode(',', $column_list), $target_table, $condition); + } else { + return; + } + + $this->_prepare($query); + return $this->_execute(); + } + + /** + * @brief deleteAct 처리 + **/ + function _executeDeleteAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = $this->prefix.$key; + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("delete from %s %s", implode(',',$table_list), $condition); + + $this->_prepare($query); + return $this->_execute(); + } + + /** + * @brief selectAct 처리 + * + * select의 경우 특정 페이지의 목록을 가져오는 것을 편하게 하기 위해\n + * navigation이라는 method를 제공 + **/ + function _executeSelectAct($output) { + // 테이블 정리 + $table_list = array(); + foreach($output->tables as $key => $val) { + $table_list[] = $this->prefix.$key.' as '.$val; + } + + if(!$output->columns) { + $columns = '*'; + } else { + $column_list = array(); + foreach($output->columns as $key => $val) { + $name = $val['name']; + $alias = $val['alias']; + if($name == '*') { + $column_list[] = '*'; + } elseif(strpos($name,'.')===false && strpos($name,'(')===false) { + if($alias) $column_list[] = sprintf('%s as %s', $name, $alias); + else $column_list[] = sprintf('%s',$name); + } else { + if($alias) $column_list[] = sprintf('%s as %s', $name, $alias); + else $column_list[] = sprintf('%s',$name); + } + } + $columns = implode(',',$column_list); + } + + $condition = $this->getCondition($output); + + if($output->list_count) return $this->_getNavigationData($table_list, $columns, $condition, $output); + + $query = sprintf("select %s from %s %s", $columns, implode(',',$table_list), $condition); + + if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); + + if($output->order) { + foreach($output->order as $key => $val) { + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + } + if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + } + + $this->_prepare($query); + $data = $this->_execute(); + if($this->isError()) return; + + $buff = new Object(); + $buff->data = $data; + return $buff; + } + + /** + * @brief query xml에 navigation 정보가 있을 경우 페이징 관련 작업을 처리한다 + * + * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; + **/ + function _getNavigationData($table_list, $columns, $condition, $output) { + require_once('./classes/page/PageHandler.class.php'); + + // 전체 개수를 구함 + $count_query = sprintf("select count(*) as count from %s %s", implode(',',$table_list), $condition); + $this->_prepare($count_query); + $count_output = $this->_execute(); + $total_count = (int)$count_output->count; + + $list_count = $output->list_count['value']; + if(!$list_count) $list_count = 20; + $page_count = $output->page_count['value']; + if(!$page_count) $page_count = 10; + $page = $output->page['value']; + if(!$page) $page = 1; + + // 전체 페이지를 구함 + if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1; + else $total_page = 1; + + // 페이지 변수를 체크 + if($page > $total_page) $page = $total_page; + $start_count = ($page-1)*$list_count; + + $query = sprintf("select %s from %s %s", $columns, implode(',',$table_list), $condition); + + if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); + + if($output->order) { + foreach($output->order as $key => $val) { + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + } + if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + } + + // return 결과물 생성 + $buff = new Object(); + $buff->total_count = 0; + $buff->total_page = 0; + $buff->page = 1; + $buff->data = array(); + $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); + + // 쿼리 실행 + $query = sprintf('%s limit %d, %d', $query, $start_count, $list_count); + $this->_prepare($query); + + if($this->isError()) { + $this->setError($this->handler->errorCode(), print_r($this->handler->errorInfo(),true)); + $this->actFinish(); + return $buff; + } + + $this->stmt->execute(); + + if($this->stmt->errorCode() != '00000') { + $this->setError($this->stmt->errorCode(), print_r($this->stmt->errorInfo(),true)); + $this->actFinish(); + return $buff; + } + + $output = null; + $virtual_no = $total_count - ($page-1)*$list_count; + while($tmp = $this->stmt->fetch(PDO::FETCH_ASSOC)) { + unset($obj); + foreach($tmp as $key => $val) { + $pos = strpos($key, '.'); + if($pos) $key = substr($key, $pos+1); + $obj->{$key} = $val; + } + $data[$virtual_no--] = $obj; + } + + $this->stmt = null; + $this->actFinish(); + + $buff = new Object(); + $buff->total_count = $total_count; + $buff->total_page = $total_page; + $buff->page = $page; + $buff->data = $data; + + $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); + return $buff; + } + } +?> diff --git a/classes/display/DisplayHandler.class.php b/classes/display/DisplayHandler.class.php new file mode 100644 index 000000000..4f7b7ab9a --- /dev/null +++ b/classes/display/DisplayHandler.class.php @@ -0,0 +1,237 @@ +_printHeader(); + + // request method에 따른 처리 + $content = $this->getContent($oModule); + + // 요청방식에 따라 출력을 별도로 + if(Context::getResponseMethod()!="XMLRPC") { + + Context::set('content', $content); + + // 레이아웃을 컴파일 + if(__DEBUG__==3) $start = getMicroTime(); + $oTemplate = &TemplateHandler::getInstance(); + + if(Context::get('layout') != 'none') { + $layout_path = $oModule->getLayoutPath(); + $layout_file = $oModule->getLayoutFile(); + $edited_layout_file = $oModule->getEditedLayoutFile(); + } + + if(!$layout_path) $layout_path = './common/tpl/'; + if(!$layout_file) $layout_file = 'default_layout.html'; + + $zbxe_final_content = $oTemplate->compile($layout_path, $layout_file, $edited_layout_file); + + if(__DEBUG__==3) $GLOBALS['__layout_compile_elapsed__'] = getMicroTime()-$start; + + // 각 위젯, 에디터 컴포넌트의 코드 변경 + if(__DEBUG__==3) $start = getMicroTime(); + + $oContext = &Context::getInstance(); + $zbxe_final_content= $oContext->transContent($zbxe_final_content); + + if(__DEBUG__==3) $GLOBALS['__trans_widget_editor_elapsed__'] = getMicroTime()-$start; + + // 최종 결과를 common_layout에 넣어버림 + Context::set('zbxe_final_content', $zbxe_final_content); + $output = $oTemplate->compile('./common/tpl', 'common_layout'); + + } else { + + $output = $content; + + } + + // 애드온 실행 + $called_position = 'before_display_content'; + @include("./files/cache/activated_addons.cache.php"); + + $this->content_size = strlen($output); + + // 컨텐츠 출력 + $this->display($output); + + // 디버깅 데이터 출력 + $this->_debugOutput(); + } + + /** + * @brief 최종 결과물의 출력 + **/ + function display($content) { + $path = str_replace('index.php','',$_SERVER['SCRIPT_NAME']); + + // files로 시작되는 src나 href의 값을 절대경로로 변경 + $content = preg_replace('!(href|src)=("|\'){0,1}files!is', '\\1=\\2'.$path.'files', $content); + print preg_replace('!(href|src)=("|\'){0,1}\.\/([a-zA-Z0-9\_^\/]+)\/!is', '\\1=\\2'.$path.'$3/', $content); + } + + /** + * @brief 모듈 객체의 content return + **/ + function getContent(&$oModule) { + return $this->_toDoc($oModule); + } + + /** + * @brief 모듈 객체의 content return + **/ + function _toDoc(&$oModule) { + if(Context::getRequestMethod() == 'XMLRPC') $content = $this->_toXmlDoc($oModule); + else $content = $this->_toHTMLDoc($oModule); + return $content; + } + + /** + * @brief RequestMethod가 XML이면 XML 데이터로 컨텐츠 생성 + **/ + function _toXmlDoc(&$oModule) { + $xmlDoc = "\n"; + $xmlDoc .= sprintf("%s\n",$oModule->getError()); + $xmlDoc .= sprintf("%s\n",str_replace(array('<','>','&'),array('<','>','&'),$oModule->getMessage())); + + $variables = $oModule->getVariables(); + + if(count($variables)) { + foreach($variables as $key => $val) { + if(is_string($val)) $val = ''; + $xmlDoc .= "<{$key}>{$val}\n"; + } + } + + $xmlDoc .= ""; + + return $xmlDoc; + } + + /** + * @brief RequestMethod가 XML이 아니면 html 컨텐츠 생성 + **/ + function _toHTMLDoc(&$oModule) { + // template handler 객체 생성 + $oTemplate = &TemplateHandler::getInstance(); + + // module tpl 변환 + $template_path = $oModule->getTemplatePath(); + $tpl_file = $oModule->getTemplateFile(); + return $oTemplate->compile($template_path, $tpl_file); + } + + /** + * @brief content size return + **/ + function getContentSize() { + return $this->content_size; + } + + /** + * @brief 디버그 모드일 경우 디버기 메세지 출력 + * + * __DEBUG__가 1이상일 경우 각 부분의 실행시간등을 debugPrint 함수를 이용해서 출력\n + * 개발시나 테스트시에 config/config.inc.php의 __DEBUG__를 세팅하고\n + * tail -f ./files/_debug_message.php로 하여 console로 확인하면 편리함\n + **/ + function _debugOutput() { + if(!__DEBUG__ || (__DEBUG_OUTPUT!=0 && Context::getResponseMethod()!='HTML') ) return; + $end = getMicroTime(); + + // debug string 작성 시작 + $buff = "\n\n** Debug at ".date('Y-m-d H:i:s')." ************************************************************\n"; + + // Request/Response 정보 작성 + $buff .= "\n- Request/ Response info\n"; + $buff .= sprintf("\tRequest URI \t\t\t: %s:%s%s%s%s\n", $_SERVER['SERVER_NAME'], $_SERVER['SERVER_PORT'], $_SERVER['PHP_SELF'], $_SERVER['QUERY_STRING']?'?':'', $_SERVER['QUERY_STRING']); + $buff .= sprintf("\tRequest method \t\t\t: %s\n", $_SERVER['REQUEST_METHOD']); + $buff .= sprintf("\tResponse method \t\t: %s\n", Context::getResponseMethod()); + $buff .= sprintf("\tResponse contents size\t\t: %d byte\n", $this->getContentSize()); + + // DB 로그 작성 + if(__DEBUG__>1) { + if($GLOBALS['__db_queries__']) { + $buff .= "\n- DB Queries\n"; + $buff .= $GLOBALS['__db_queries__']; + } + $buff .= "\n- Elapsed time\n"; + + if($GLOBALS['__db_elapsed_time__']) $buff .= sprintf("\tDB queries elapsed time\t\t: %0.5f sec\n", $GLOBALS['__db_elapsed_time__']); + } + + // 기타 로그 작성 + if(__DEBUG__==3) { + $buff .= sprintf("\tclass file load elapsed time \t: %0.5f sec\n", $GLOBALS['__elapsed_class_load__']); + $buff .= sprintf("\tTemplate compile elapsed time\t: %0.5f sec (%d called)\n", $GLOBALS['__template_elapsed__'], $GLOBALS['__TemplateHandlerCalled__']); + $buff .= sprintf("\tXmlParse compile elapsed time\t: %0.5f sec\n", $GLOBALS['__xmlparse_elapsed__']); + $buff .= sprintf("\tPHP elapsed time \t\t: %0.5f sec\n", $end-__StartTime__-$GLOBALS['__template_elapsed__']-$GLOBALS['__xmlparse_elapsed__']-$GLOBALS['__db_elapsed_time__']-$GLOBALS['__elapsed_class_load__']); + + // 위젯 실행 시간 작성 + $buff .= sprintf("\n\tWidgets elapsed time \t\t: %0.5f sec", $GLOBALS['__widget_excute_elapsed__']); + + // 레이아웃 실행 시간 + $buff .= sprintf("\n\tLayout compile elapsed time \t: %0.5f sec", $GLOBALS['__layout_compile_elapsed__']); + + // 위젯, 에디터 컴포넌트 치환 시간 + $buff .= sprintf("\n\tTrans widget&editor elapsed time: %0.5f sec\n\n", $GLOBALS['__trans_widget_editor_elapsed__']); + } + + // 전체 실행 시간 작성 + $buff .= sprintf("\tTotal elapsed time \t\t: %0.5f sec", $end-__StartTime__); + + debugPrint($buff, false); + } + + /** + * @brief RequestMethod에 맞춰 헤더 출력 + ***/ + function _printHeader() { + if(Context::getResponseMethod() != 'HTML') return $this->_printXMLHeader(); + else return $this->_printHTMLHeader(); + } + + /** + * @brief xml header 출력 (utf8 고정) + **/ + function _printXMLHeader() { + header("Content-Type: text/xml; charset=UTF-8"); + header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + header("Cache-Control: no-store, no-cache, must-revalidate"); + header("Cache-Control: post-check=0, pre-check=0", false); + header("Pragma: no-cache"); + } + + /** + * @brief html header 출력 (utf8 고정) + **/ + function _printHTMLHeader() { + header("Content-Type: text/html; charset=UTF-8"); + header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + header("Cache-Control: no-store, no-cache, must-revalidate"); + header("Cache-Control: post-check=0, pre-check=0", false); + header("Pragma: no-cache"); + } + } +?> diff --git a/classes/editor/EditorHandler.class.php b/classes/editor/EditorHandler.class.php new file mode 100644 index 000000000..252619d24 --- /dev/null +++ b/classes/editor/EditorHandler.class.php @@ -0,0 +1,27 @@ +extra_vars) return; + + foreach($info->extra_vars as $key => $val) { + $this->{$key} = trim($val->value); + } + } + + } + +?> diff --git a/classes/file/FileHandler.class.php b/classes/file/FileHandler.class.php new file mode 100644 index 000000000..5ab8262ad --- /dev/null +++ b/classes/file/FileHandler.class.php @@ -0,0 +1,276 @@ +read()) { + if(substr($file,0,1)=='.') continue; + if($filter && !preg_match($filter, $file)) continue; + if($to_lower) $file = strtolower($file); + if($filter) $file = preg_replace($filter, '$1', $file); + else $file = $file; + + if($concat_prefix) $file = $path.$file; + $output[] = $file; + } + if(!$output) return array(); + return $output; + } + + /** + * @brief 디렉토리 생성 + * + * 주어진 경로를 단계별로 접근하여 recursive하게 디렉토리 생성 + **/ + function makeDir($path_string) { + $path_list = explode('/', $path_string); + + for($i=0;$iread()) { + if ($entry != "." && $entry != "..") { + if (is_dir($path."/".$entry)) { + FileHandler::removeDir($path."/".$entry); + } else { + @unlink($path."/".$entry); + } + } + } + $directory->close(); + @rmdir($path); + } + + /** + * @brief byte단위의 파일크기를 적절하게 변환해서 return + **/ + function filesize($size) { + if(!$size) return "0Byte"; + if($size<1024) return ($size."Byte"); + if($size >1024 && $size< 1024 *1024) return sprintf("%0.1fKB",$size / 1024); + return sprintf("%0.2fMB",$size / (1024*1024)); + } + + /** + * @brief 원격파일을 다운받아서 특정 위치에 저장 + **/ + function getRemoteFile($url, $target_filename) { + $url_info = parse_url($url); + + if(!$url_info['port']) $url_info['port'] = 80; + + $fp = @fsockopen($url_info['host'], $url_info['port']); + if(!$fp) return; + + // 한글 파일이 있으면 한글파일 부분만 urlencode하여 처리 (iconv 필수) + $path = $url_info['path']; + if(preg_match('/[\xEA-\xED][\x80-\xFF]{2}/', $path)&&function_exists('iconv')) { + $path_list = explode('/',$path); + $cnt = count($path_list); + $filename = $path_list[$cnt-1]; + $filename = urlencode(iconv("UTF-8","EUC-KR",$filename)); + $path_list[$cnt-1] = $filename; + $path = implode('/',$path_list); + $url_info['path'] = $path; + } + + $header = sprintf("GET %s HTTP/2.0\r\nHost: %s\r\nReferer: %s://%s\r\nRequestUrl: %s\r\nConnection: Close\r\n\r\n", $url_info['path'], $url_info['host'], $url_info['scheme'], $url_info['host'], Context::getRequestUri()); + + @fwrite($fp, $header); + + $ft = @fopen($target_filename, 'w'); + if(!$ft) return; + + $begin = false; + while(!feof($fp)) { + $str = fgets($fp, 1024); + if($begin) @fwrite($ft, $str); + if(!trim($str)) $begin = true; + } + @fclose($ft); + @fclose($fp); + + return true; + } + + /** + * @brief 특정 이미지 파일을 특정 위치로 옮김 (옮길때 이미지의 크기를 리사이징할 수 있음..) + **/ + function createImageFile($source_file, $target_file, $resize_width = 0, $resize_height = 0, $target_type = '') { + if(!file_exists($source_file)) return; + + // 이미지 정보를 구함 + list($width, $height, $type, $attrs) = @getimagesize($source_file); + if($width<1 || $height<1) return; + + switch($type) { + case '1' : + $type = 'gif'; + break; + case '2' : + $type = 'jpg'; + break; + case '3' : + $type = 'png'; + break; + case '6' : + $type = 'bmp'; + break; + default : + return; + break; + } + + // 타겟 파일의 type을 구함 + if(!$target_type) $target_type = $type; + $target_type = strtolower($target_type); + + // 리사이즈를 원하는 크기의 임시 이미지를 만듬 + if(function_exists('imagecreatetruecolor')) $thumb = @imagecreatetruecolor($resize_width, $resize_height); + else $thumb = @imagecreate($resize_width, $resize_height); + + $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; + if($resize_height>0 && $height >= $resize_height) $height_per = $resize_height / $height; + if($width_per < $height_per) $per = $height_per; + else $per = $width_per; + + // 원본 이미지의 타입으로 임시 이미지 생성 + switch($type) { + case 'gif' : + $source = @imagecreatefromgif($source_file); + break; + // jpg + case 'jpeg' : + case 'jpg' : + $source = @imagecreatefromjpeg($source_file); + break; + // png + case 'png' : + $source = @imagecreatefrompng($source_file); + break; + // bmp + case 'wbmp' : + case 'bmp' : + $source = @imagecreatefromwbmp($source_file); + break; + default : + return; + } + + // 디렉토리 생성 + $path = preg_replace('/\/([^\.^\/]*)\.(gif|png|jpeg|bmp|wbmp)$/i','',$target_file); + FileHandler::makeDir($path); + + // 원본 이미지의 크기를 조절해서 임시 이미지에 넣음 + $new_width = (int)($width * $per); + $new_height = (int)($height * $per); + + $x = ($resize_width/2 - $new_width/2); + $y = ($resize_height/2 - $new_height/2); + + if($source) { + if($new_width != $width || $new_height != $height) { + if(function_exists('imagecopyresampled')) @imagecopyresampled($thumb, $source, $x, $y, 0, 0, $new_width, $new_height, $width, $height); + else @imagecopyresized($thumb, $source, $x, $y, 0, 0, $new_width, $new_height, $width, $height); + } else $thumb = $source; + } + + // 파일을 쓰고 끝냄 + switch($target_type) { + case 'gif' : + @imagegif($thumb, $target_file, 100); + break; + case 'jpeg' : + case 'jpg' : + @imagejpeg($thumb, $target_file, 100); + break; + case 'png' : + @imagepng($thumb, $target_file, 100); + break; + case 'wbmp' : + case 'bmp' : + @imagewbmp($thumb, $target_file, 100); + break; + } + } + } +?> diff --git a/classes/handler/Handler.class.php b/classes/handler/Handler.class.php new file mode 100644 index 000000000..d7f1603ed --- /dev/null +++ b/classes/handler/Handler.class.php @@ -0,0 +1,11 @@ + diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php new file mode 100644 index 000000000..b6e330ea9 --- /dev/null +++ b/classes/module/ModuleHandler.class.php @@ -0,0 +1,326 @@ +module = 'install'; + $this->act = Context::get('act'); + return; + } + + // Request Argument중 모듈을 찾을 수 있는 변수를 구함 + if(!$module) $this->module = Context::get('module'); + else $this->module = $module; + + if(!$act) $this->act = Context::get('act'); + else $this->act = $act; + + if(!$mid) $this->mid = Context::get('mid'); + else $this->mid = $mid; + + if(!$document_srl) $this->document_srl = (int)Context::get('document_srl'); + else $this->document_srl = (int)$document_srl; + + // 기본 변수들의 검사 (XSS방지를 위한 기초적 검사) + if($this->module && !eregi("^([a-z0-9\_\-]+)$",$this->module)) die(Context::getLang("msg_invalid_request")); + if($this->mid && !eregi("^([a-z0-9\_\-]+)$",$this->mid)) die(Context::getLang("msg_invalid_request")); + if($this->act && !eregi("^([a-z0-9\_\-]+)$",$this->act)) die(Context::getLang("msg_invalid_request")); + + // 애드온 실행 (모듈 실행 전) + $called_position = 'before_module_init'; + @include("./files/cache/activated_addons.cache.php"); + } + + /** + * @brief module, mid, document_srl을 이용하여 모듈을 찾고 act를 실행하기 위한 준비를 함 + **/ + function init() { + // ModuleModel 객체 생성 + $oModuleModel = &getModel('module'); + + // document_srl이 있으면 document_srl로 모듈과 모듈 정보를 구함 + if($this->document_srl && !$this->mid) $module_info = $oModuleModel->getModuleInfoByDocumentSrl($this->document_srl); + if($this->module && $module_info->module != $this->module) unset($module_info); + + // 아직 모듈을 못 찾았고 $mid값이 있으면 $mid로 모듈을 구함 + if(!$module_info && $this->mid) $module_info = $oModuleModel->getModuleInfoByMid($this->mid); + if($this->module && $module_info->module != $this->module) unset($module_info); + + // 역시 모듈을 못 찾았고 $module이 없다면 기본 모듈을 찾아봄 + if(!$module_info && !$this->module) $module_info = $oModuleModel->getModuleInfoByMid(); + + // 모듈 정보가 찾아졌을 경우 모듈 정보에서 기본 변수들을 구함, 모듈 정보에서 module 이름을 구해움 + if($module_info) { + $this->module = $module_info->module; + $this->mid = $module_info->mid; + $this->module_info = $module_info; + Context::setBrowserTitle($module_info->browser_title); + } + + // 여기까지도 모듈 정보를 찾지 못했다면 깔끔하게 시스템 오류 표시 + if(!$this->module) $this->error = 'msg_module_is_not_exists'; + + // mid값이 있을 경우 mid값을 세팅 + if($this->mid) Context::set('mid', $this->mid, true); + } + + /** + * @brief 모듈과 관련된 정보를 이용하여 객체를 구하고 act 실행까지 진행시킴 + **/ + function procModule() { + // 에러가 있으면 return + if($this->error) return; + + // ModuleModel 객체 생성 + $oModuleModel = &getModel('module'); + + // 해당 모듈의 conf/action.xml 을 분석하여 action 정보를 얻어옴 + $xml_info = $oModuleModel->getModuleActionXml($this->module); + + // 미설치시에는 act값을 강제로 변경 + if($this->module=="install") { + if(!$this->act || !$xml_info->action->{$this->act}) $this->act = $xml_info->default_index_act; + } + + // 현재 요청된 act가 있으면 $xml_info에서 type을 찾음, 없다면 기본 action을 이용 + if(!$this->act) $this->act = $xml_info->default_index_act; + + // act값이 지정이 안되어 있으면 오류 표시 + if(!$this->act) { + $this->error = 'msg_module_is_not_exists'; + return; + } + + // 설정된 mid가 없을 경우 요청된 act의 standalone 여부 체크 + /* + if(!$this->mid && !$xml_info->action->{$this->act}->standalone) { + $this->error = 'msg_module_is_not_standalone'; + return; + } + */ + + // type, grant 값 구함 + $type = $xml_info->action->{$this->act}->type; + $grant = $xml_info->action->{$this->act}->grant; + $kind = strpos(strtolower($this->act),'admin')!==false?'admin':''; + if(!$kind && $this->module == 'admin') $kind = 'admin'; + + // 모듈 객체 생성 + $oModule = &$this->getModuleInstance($this->module, $type, $kind); + if(!is_object($oModule)) { + $this->error = 'msg_module_is_not_exists'; + return; + } + + // 모듈에 act값을 세팅 + $oModule->setAct($this->act); + + // 모듈 정보 세팅 + $oModule->setModuleInfo($this->module_info, $xml_info); + + // 모듈을 수행하고 결과가 false이면 message 모듈 호출 지정 + if(!$oModule->proc()) $this->error = $oModule->getMessage(); + + return $oModule; + } + + /** + * @ 실행된 모듈의 컨텐츠를 출력 + **/ + function displayContent($oModule = NULL) { + // 설정된 모듈이 정상이지 않을 경우 message 모듈 객체 생성 + if(!$oModule || !is_object($oModule)) { + $this->error = 'msg_module_is_not_exists'; + } + + // 에러가 발생하였을시 처리 + if($this->error) { + // message 모듈 객체를 생성해서 컨텐츠 생성 + $oMessageView = &getView('message'); + $oMessageView->setError(-1); + $oMessageView->setMessage($this->error); + $oMessageView->dispMessage(); + + // 정상적으로 호출된 객체가 있을 경우 해당 객체의 template를 변경 + if($oModule) { + $oModule->setTemplatePath($oMessageView->getTemplatePath()); + $oModule->setTemplateFile($oMessageView->getTemplateFile()); + + // 그렇지 않으면 message 객체를 호출된 객체로 지정 + } else { + $oModule = $oMessageView; + } + } + + // 해당 모듈에 layout_srl이 있는지 확인 + if($oModule->module_info->layout_srl && !$oModule->getLayoutFile()) { + // layout_srl이 있으면 해당 레이아웃 정보를 가져와 layout_path/ layout_file 위치 변경 + $oLayoutModel = &getModel('layout'); + $layout_info = $oLayoutModel->getLayout($oModule->module_info->layout_srl); + + if($layout_info) { + + // 레이아웃 정보중 extra_vars의 이름과 값을 $layout_info에 입력 + if($layout_info->extra_var_count) { + foreach($layout_info->extra_var as $var_id => $val) { + $layout_info->{$var_id} = $val->value; + } + } + + // 레이아웃 정보중 menu를 Context::set + if($layout_info->menu_count) { + foreach($layout_info->menu as $menu_id => $menu) { + if(file_exists($menu->php_file)) @include($menu->php_file); + Context::set($menu_id, $menu); + } + } + + // 레이아웃 정보를 Context::set + Context::set('layout_info', $layout_info); + + $oModule->setLayoutPath($layout_info->path); + $oModule->setLayoutFile('layout'); + + // 레이아웃이 수정되었을 경우 수정본을 지정 + $edited_layout = sprintf('./files/cache/layout/%d.html', $layout_info->layout_srl); + if(file_exists($edited_layout)) $oModule->setEditedLayoutFile($edited_layout); + } + } + + // 컨텐츠 출력 + $oDisplayHandler = new DisplayHandler(); + $oDisplayHandler->printContent($oModule); + + // DB 및 기타 자원의 종결 처리 + Context::close(); + } + + /** + * @brief module의 위치를 찾아서 return + **/ + function getModulePath($module) { + $class_path = sprintf('./modules/%s/', $module); + if(is_dir($class_path)) return $class_path; + + return ""; + } + + /** + * @brief 모듈 객체를 생성함 + **/ + function &getModuleInstance($module, $type = 'view', $kind = '') { + $class_path = ModuleHandler::getModulePath($module); + if(!$class_path) return NULL; + + if(__DEBUG__==3) $start_time = getMicroTime(); + + if($kind != 'admin') $kind = 'svc'; + + // global 변수에 미리 생성해 둔 객체가 없으면 새로 생성 + if(!$GLOBALS['_loaded_module'][$module][$type][$kind]) { + + /** + * 모듈의 위치를 파악 + **/ + + // 상위 클래스명 구함 + if(!class_exists($module)) { + $high_class_file = sprintf('%s%s.class.php', $class_path, $module); + if(!file_exists($high_class_file)) return NULL; + require_once($high_class_file); + } + + // 객체의 이름을 구함 + switch($type) { + case 'controller' : + if($kind == 'admin') { + $instance_name = sprintf("%sAdmin%s",$module,"Controller"); + $class_file = sprintf('%s%s.admin.%s.php', $class_path, $module, $type); + } else { + $instance_name = sprintf("%s%s",$module,"Controller"); + $class_file = sprintf('%s%s.%s.php', $class_path, $module, $type); + } + break; + case 'model' : + if($kind == 'admin') { + $instance_name = sprintf("%sAdmin%s",$module,"Model"); + $class_file = sprintf('%s%s.admin.%s.php', $class_path, $module, $type); + } else { + $instance_name = sprintf("%s%s",$module,"Model"); + $class_file = sprintf('%s%s.%s.php', $class_path, $module, $type); + } + break; + case 'class' : + $instance_name = $module; + $class_file = sprintf('%s%s.class.php', $class_path, $module); + break; + default : + $type = 'view'; + if($kind == 'admin') { + $instance_name = sprintf("%sAdmin%s",$module,"View"); + $class_file = sprintf('%s%s.admin.view.php', $class_path, $module, $type); + } else { + $instance_name = sprintf("%s%s",$module,"View"); + $class_file = sprintf('%s%s.view.php', $class_path, $module, $type); + } + break; + } + + // 클래스 파일의 이름을 구함 + if(!file_exists($class_file)) return NULL; + + // eval로 객체 생성 + require_once($class_file); + $eval_str = sprintf('$oModule = new %s();', $instance_name); + @eval($eval_str); + if(!is_object($oModule)) return NULL; + + // 해당 위치에 속한 lang 파일을 읽음 + Context::loadLang($class_path.'lang'); + + // 생성된 객체에 자신이 호출된 위치를 세팅해줌 + $oModule->setModule($module); + $oModule->setModulePath($class_path); + + // GLOBALS 변수에 생성된 객체 저장 + $GLOBALS['_loaded_module'][$module][$type][$kind] = $oModule; + } + + if(__DEBUG__==3) $GLOBALS['__elapsed_class_load__'] += getMicroTime() - $start_time; + + // 객체 리턴 + return $GLOBALS['_loaded_module'][$module][$type][$kind]; + } + } +?> diff --git a/classes/module/ModuleObject.class.php b/classes/module/ModuleObject.class.php new file mode 100644 index 000000000..3255e4b58 --- /dev/null +++ b/classes/module/ModuleObject.class.php @@ -0,0 +1,342 @@ +module = $module; + } + + /** + * @brief 현재 모듈의 path를 지정 + **/ + function setModulePath($path) { + if(substr($path,-1)!='/') $path.='/'; + $this->module_path = $path; + } + + /** + * @brief redirect_url을 정함 + * + * redirect_url의 경우 ajax로 request를 받았을 경우에 사용하면 됨... + **/ + function setRedirectUrl($url='./') { + $this->add('redirect_url', $url); + } + + /** + * @brief 현재 페이지를 refresh시킴 + * + * 공통 tpl중 refresh.html을 실행할 뿐.. + **/ + function setRefreshPage() { + $this->setTemplatePath('./common/tpl'); + $this->setTemplateFile('refresh'); + } + + + /** + * @brief act값 지정 + **/ + function setAct($act) { + $this->act = $act; + } + + /** + * @brief 모듈의 정보 세팅 + **/ + function setModuleInfo($module_info, $xml_info) { + // 기본 변수 설정 + $this->mid = $module_info->mid; + $this->module_srl = $module_info->module_srl; + $this->module_info = $module_info; + $this->xml_info = $xml_info; + $this->skin_vars = $module_info->skin_vars; + + // 웹서비스에서 꼭 필요한 인증 정보와 권한 설정 체크 + $is_logged = Context::get('is_logged'); + $logged_info = Context::get('logged_info'); + $user_id = $logged_info->user_id; + $user_group = $logged_info->group_list; + + // 로그인되어 있다면 admin 체크 + if($is_logged && ($logged_info->is_admin == 'Y' || (is_array($this->module_info->admin_id)&&in_array($user_id, $this->module_info->admin_id) )) ) { + $grant->is_admin = true; + } else { + $grant->is_admin = false; + } + + // act값에 admin이 들어 있는데 관리자가 아닌 경우 오류 표시 + if(substr_count($this->act, 'Admin')) { + if(!$is_logged) { + $this->setAct("dispMemberLoginForm"); + } elseif(!$grant->is_admin) { + return $this->stop('msg_not_permitted_act'); + } + } + + if($module_info->grants) { + foreach($module_info->grants as $key => $val) { + if(!$xml_info->grant->{$key}) { + $xml_info->grant->{$key}->title = $key; + } + } + } + + // 권한 설정 + if($xml_info->grant) { + + // 이 모듈에 action.xml에서 선언된 권한 목록을 루프 + foreach($xml_info->grant as $grant_name => $grant_item) { + + // 제목과 기타 설정 없을 경우의 기본 권한(guest, member, root)에 대한 변수 설정 + $title = $grant_item->title; + $default = $grant_item->default; + + // 관리자이면 모든 권한에 대해 true 설정 + if($grant->is_admin) { + $grant->{$grant_name} = true; + continue; + } + + // 일단 현재 권한에 대해 false 지정 + $grant->{$grant_name} = false; + + // 모듈의 개별 설정에서 이 권한에 대한 그룹 지정이 있으면 체크 + if(count($this->module_info->grants[$grant_name])) { + $group_srls = $this->module_info->grants[$grant_name]; + if(!is_array($group_srls)) $group_srls = array($group_srls); + + if(count($user_group)) { + foreach($user_group as $group_srl => $group_title) { + if(in_array($group_srl, $group_srls)) { + $grant->{$grant_name} = true; + break; + } + } + } + + // 별도의 지정이 없으면 default값으로 권한 체크 + } else { + switch($default) { + case 'member' : + if($is_logged) $grant->{$grant_name} = true; + break; + case 'root' : + if($grant->is_admin) $grant->{$grant_name} = true; + break; + default : + $grant->{$grant_name} = true; + break; + } + + } + } + } + + // 권한변수 설정 + $this->grant = $grant; + Context::set('grant', $grant); + + if(method_exists($this, 'init')) $this->init(); + } + + /** + * @brief 메세지 출력 + **/ + function stop($msg_code) { + // proc 수행을 중지 시키기 위한 플래그 세팅 + $this->stop_proc = true; + + // 에러 처리 + $this->setError(-1); + $this->setMessage($msg_code); + + // message 모듈의 에러 표시 + $oMessageView = &getView('message'); + $oMessageView->setError(-1); + $oMessageView->setMessage($msg_code); + $oMessageView->dispMessage(); + + $this->setTemplatePath($oMessageView->getTemplatePath()); + $this->setTemplateFile($oMessageView->getTemplateFile()); + + return $this; + } + + /** + * @brief template 파일 지정 + **/ + function setTemplateFile($filename) { + if(substr($filename,-5)!='.html') $filename .= '.html'; + $this->template_file = $filename; + } + + /** + * @brief template 파일 return + **/ + function getTemplateFile() { + return $this->template_file; + } + + /** + * @brief template 경로 지정 + **/ + function setTemplatePath($path) { + if(substr($path,0,2)!='./') $path = './'.$path; + if(substr($path,-1)!='/') $path .= '/'; + $this->template_path = $path; + } + + /** + * @brief template 경로 return + **/ + function getTemplatePath() { + return $this->template_path; + } + + /** + * @brief edited layout 파일 지정 + **/ + function setEditedLayoutFile($filename) { + if(substr($filename,-5)!='.html') $filename .= '.html'; + $this->edited_layout_file = $filename; + } + + /** + * @brief layout 파일 return + **/ + function getEditedLayoutFile() { + return $this->edited_layout_file; + } + + /** + * @brief layout 파일 지정 + **/ + function setLayoutFile($filename) { + if(substr($filename,-5)!='.html') $filename .= '.html'; + $this->layout_file = $filename; + } + + /** + * @brief layout 파일 return + **/ + function getLayoutFile() { + return $this->layout_file; + } + + /** + * @brief layout 경로 지정 + **/ + function setLayoutPath($path) { + if(substr($path,-1)!='/') $path .= '/'; + if(substr($path,0,2)!='./') $path = './'.$path; + $this->layout_path = $path; + } + + /** + * @brief layout 경로 return + **/ + function getLayoutPath() { + return $this->layout_path; + } + + /** + * @brief 모듈의 action에 해당하는 method를 실행 + * + * $act값에 의해서 $action_list에 선언된 것들을 실행한다 + **/ + function proc() { + // stop_proc==true이면 그냥 패스 + if($this->stop_proc==true) return false; + + // addon 실행(called_position 를 before_module_proc로 하여 호출) + $called_position = 'before_module_proc'; + @include("./files/cache/activated_addons.cache.php"); + + // 지금까지 이상이 없었다면 action 실행 + if(!$this->stop_proc) { + // 현재 모듈에 act값이 있으면 해당 act를 실행 + if(method_exists($this, $this->act)) { + //$output = call_user_method($this->act, $this); + //$output = call_user_func(array($this, $this->act)); + $output = $this->{$this->act}(); + + // act가 없으면 action_forward에서 해당하는 act가 있는지 찾아서 대신 실행 + } else if(Context::isInstalled()) { + + $oModuleModel = &getModel('module'); + $forward = $oModuleModel->getActionForward($this->act); + if($forward->module && $forward->type && $forward->act) { + + $kind = strpos(strtolower($forward->act),'admin')!==false?'admin':''; + $oModule = &getModule($forward->module, $forward->type, $kind); + $xml_info = $oModuleModel->getModuleActionXml($forward->module); + $oModule->setAct($forward->act); + $oModule->init(); + $oModule->setModuleInfo($this->module_info, $xml_info); + + //$output = call_user_method($forward->act, $oModule); + //$output = call_user_func(array($oModule, $forward->act)); + $output = $oModule->{$forward->act}(); + + $this->setTemplatePath($oModule->getTemplatePath()); + $this->setTemplateFile($oModule->getTemplateFile()); + + } else { + if($this->xml_info->default_index_act) { + //$output = call_user_method($this->xml_info->default_index_act, $this); + //$output = call_user_func(array($this, $this->xml_info->default_index_act)); + if(method_exists($this, $this->xml_info->default_index_act)) { + $output = $this->{$this->xml_info->default_index_act}(); + } + } else { + return false; + } + } + + } else { + return false; + } + } + + // addon 실행(called_position 를 after_module_proc로 하여 호출) + $called_position = 'after_module_proc'; + @include("./files/cache/activated_addons.cache.php"); + + if(is_a($output, 'Object') || is_subclass_of($output, 'Object')) { + $this->setError($output->getError()); + $this->setMessage($output->getMessage()); + return false; + } + + return true; + } + } +?> diff --git a/classes/object/Object.class.php b/classes/object/Object.class.php new file mode 100644 index 000000000..8cf027e78 --- /dev/null +++ b/classes/object/Object.class.php @@ -0,0 +1,120 @@ +setError($error); + $this->setMessage($message); + } + + /** + * @brief error 코드를 지정 + **/ + function setError($error = 0) { + $this->error = $error; + } + + /** + * @brief error 코드를 return + **/ + function getError() { + return $this->error; + } + + /** + * @brief 에러 메세지 지정 + **/ + function setMessage($message = 'success') { + if(Context::getLang($message)) $message = Context::getLang($message); + $this->message = $message; + return true; + } + + /** + * @brief 에러 메세지 return + **/ + function getMessage() { + return $this->message; + } + + /** + * @brief 추가 변수 + **/ + function add($key, $val) { + $this->variables[$key] = $val; + } + + /** + * @brief 추가된 변수의 key, value들을 추가 + **/ + function adds($object) { + if(is_object($object)) { + $vars = get_object_vars($object); + foreach($vars as $key => $val) $this->add($key, $val); + } elseif(is_array($object)) { + foreach($object as $key => $val) $this->add($key, $val); + } + } + + /** + * @brief 추가된 변수의 key에 해당하는 값을 return + **/ + function get($key) { + return $this->variables[$key]; + } + + /** + * @brief 추가된 변수의 key들에 해당하는 값을 return + **/ + function gets() { + $num_args = func_num_args(); + $args_list = func_get_args(); + for($i=0;$i<$num_args;$i++) { + $key = $args_list[$i]; + $output->{$key} = $this->gets($key); + } + return $output; + } + + /** + * @brief 추가변수 전체 return + **/ + function getVariables() { + return $this->variables; + } + + function getObjectVars() { + foreach($this->variables as $key => $val) $output->{$key} = $val; + return $output; + } + + /** + * @brief error값이 0이 아니면 오류 + **/ + function toBool() { + return $this->error==0?true:false; + } + + /** + * @brief error값이 0이 아니면 오류 (Object::toBool()의 aliasing) + **/ + function toBoolean() { + return $this->toBool(); + } + } +?> diff --git a/classes/page/PageHandler.class.php b/classes/page/PageHandler.class.php new file mode 100644 index 000000000..5dd920731 --- /dev/null +++ b/classes/page/PageHandler.class.php @@ -0,0 +1,52 @@ +total_count = $total_count; + $this->total_page = $total_page; + $this->cur_page = $cur_page; + $this->page_count = $page_count; + $this->point = 0; + + $first_page = $cur_page - (int)($page_count/2); + if($first_page<1) $first_page = 1; + $last_page = $total_page; + if($last_page>$total_page) $last_page = $total_page; + + $this->first_page = $first_page; + $this->last_page = $last_page; + + if($total_page < $this->page_count) $this->page_count = $total_page; + } + + /** + * @brief 다음 페이지 요청 + **/ + function getNextPage() { + $page = $this->first_page+$this->point++; + if($this->point > $this->page_count || $page > $this->last_page) $page = 0; + return $page; + } + } +?> diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php new file mode 100644 index 000000000..3f68d3d8a --- /dev/null +++ b/classes/template/TemplateHandler.class.php @@ -0,0 +1,339 @@ +tpl_path = $tpl_path; + $this->tpl_file = $tpl_file; + + // compiled된(or 될) 파일이름을 구함 + $compiled_tpl_file = $this->_getCompiledFileName($tpl_file); + + // 일단 컴파일 + $buff = $this->_compile($tpl_file, $compiled_tpl_file); + + // Context와 compiled_tpl_file로 컨텐츠 생성 + $output = $this->_fetch($compiled_tpl_file, $buff, $tpl_path); + + if(__DEBUG__==3 ) $GLOBALS['__template_elapsed__'] += getMicroTime() - $start; + + return $output; + } + + /** + * @brief tpl_file이 컴파일이 되어 있는 것이 있는지 체크 + **/ + function _compile($tpl_file, $compiled_tpl_file) { + if(!file_exists($compiled_tpl_file)) return $this->_compileTplFile($tpl_file, $compiled_tpl_file); + + $source_ftime = filectime($tpl_file); + $target_ftime = filectime($compiled_tpl_file); + if($source_ftime>$target_ftime) return $this->_compileTplFile($tpl_file, $compiled_tpl_file); + } + + /** + * @brief tpl_file을 compile + **/ + function _compileTplFile($tpl_file, $compiled_tpl_file) { + + // tpl 파일을 읽음 + $buff = FileHandler::readFile($tpl_file); + if(!$buff) return; + + // include 변경 + $buff = preg_replace_callback('!<\!--#include\(([^\)]*?)\)-->!is', array($this, '_compileIncludeToCode'), $buff); + + // include 변경 + $buff = preg_replace_callback('!<\!--#include\(([^\)]*?)\)-->!is', array($this, '_compileIncludeToCode'), $buff); + + // 이미지 태그 img의 src의 값이 http:// 나 / 로 시작하지 않으면 제로보드의 root경로부터 시작하도록 변경 + $buff = preg_replace_callback('!(img|input)([^>]*)src=[\'"]{1}(.*?)[\'"]{1}!is', array($this, '_compileImgPath'), $buff); + + // 변수를 변경 + $buff = preg_replace_callback('/\{[^@^ ]([^\}]+)\}/i', array($this, '_compileVarToContext'), $buff); + + // 결과를 출력하지 않는 구문 변경 + $buff = preg_replace_callback('/\{\@([^\}]+)\}/i', array($this, '_compileVarToSilenceExecute'), $buff); + + // 의 변경 + $buff = preg_replace_callback('!<\!--@(.*?)-->!is', array($this, '_compileFuncToCode'), $buff); + + // import xml filter/ css/ js/ 언어파일 + $buff = preg_replace_callback('!<\!--%import\(\"([^\"]*?)\"\)-->!is', array($this, '_compileImportCode'), $buff); + + // 파일에 쓰기 전에 직접 호출되는 것을 방지 + $buff = sprintf('%s%s%s','',"\n",$buff); + + // strip white spaces.. + // $buff = preg_replace('/ +/', ' ', $buff); + + // 컴파일된 코드를 파일에 저장 + FileHandler::writeFile($compiled_tpl_file, $buff); + + return $buff; + } + + /** + * @brief {$와 } 안의 $... 변수를 Context::get(...) 으로 변경 + **/ + function _compileVarToContext($matches) { + $str = trim(substr($matches[0],1,strlen($matches[0])-2)); + return ']+)/i','$__Context->\\1', $str).');?>'; + } + + /** + * @brief {$와 } 안의 $... 변수를 Context::get(...) 으로 변경 + **/ + function _compileImgPath($matches) { + $str1 = $matches[0]; + $str2 = $path = $matches[3]; + + if(!eregi("^([a-z0-9\_\.])",$path)) return $str1; + + $path = preg_replace('/^(\.\/|\/)/','',$path); + $path = 'tpl_path?>'.$path; + $output = str_replace($str2, $path, $str1); + return $output; + } + + /** + * @brief {@와 } 안의 @... 함수를 print func(..)로 변경 + **/ + function _compileVarToSilenceExecute($matches) { + return ']+)/i','$__Context->\\1', trim($matches[1])).';?>'; + } + + /** + * @brief 사이의 구문을 php코드로 변경 + **/ + function _compileFuncToCode($matches) { + $code = trim($matches[1]); + if(!$code) return; + + switch(strtolower($code)) { + case 'else' : + $output = '}else{'; + break; + case 'end' : + case 'endif' : + case 'endfor' : + case 'endforeach' : + $output = '}'; + break; + default : + if(substr($code,0,4)=='else') { + $code = '}'.$code; + } elseif(substr($code,0,7)=='foreach') { + $tmp_str = substr($code,8); + $tmp_arr = explode(' ', $tmp_str); + $var_name = $tmp_arr[0]; + if(substr($var_name,0,1)=='$') $prefix = sprintf('if(count($__Context->%s)) ', substr($var_name,1)); + else $prefix = sprintf('if(count(%s)) ', $var_name); + } + $output = preg_replace('/\$([a-zA-Z0-9\_\-]+)/i','$__Context->\\1', $code).'{'; + break; + } + + return sprintf('', $prefix, $output); + } + + /** + * @brief 를 변환 + **/ + function _compileIncludeToCode($matches) { + // include하려는 대상문자열에 변수가 있으면 변수 처리 + $arg = str_replace(array('"','\''), '', $matches[1]); + if(!$arg) return; + + $tmp_arr = explode("/", $arg); + for($i=0;$itpl_file), $arg); + + // 2단계로 root로부터 경로를 체크 + if(!file_exists($source_filename)) $source_filename = './'.$arg; + if(!file_exists($source_filename)) return; + + // path, filename으로 분리 + $tmp_arr = explode('/', $source_filename); + $filename = array_pop($tmp_arr); + $path = implode('/', $tmp_arr).'/'; + + // include 시도 + $output = sprintf( + 'compile(\'%s\',\'%s\');%s'. + '?>%s', + + "\n", + + "\n", + + $path, $filename, "\n", + + "\n" + ); + + return $output; + } + + /** + * @brief 의 확장자를 봐서 js filter/ css/ js 파일을 include하도록 수정 + **/ + function _compileImportCode($matches) { + // 현재 tpl 파일의 위치를 구해서 $base_path에 저장하여 적용하려는 xml file을 찾음 + //$base_path = dirname($this->tpl_file).'/'; + $base_path = $this->tpl_path; + $given_file = trim($matches[1]); + if(!$given_file) return; + + // given_file이 lang으로 끝나게 되면 언어팩을 읽도록 함 + if(ereg('lang$', $given_file)) { + if(substr($given_file,0,2)=='./') $given_file = substr($given_file, 2); + $lang_dir = sprintf('%s%s', $this->tpl_path, $given_file); + if(is_dir($lang_dir)) $output = sprintf('', $lang_dir); + + // load lang이 아니라면 xml, css, js파일을 읽도록 시도 + } else { + $filename = sprintf("%s%s",$base_path, $given_file); + + // path와 파일이름을 구함 + $tmp_arr = explode("/",$filename); + $filename = array_pop($tmp_arr); + + $base_path = implode("/",$tmp_arr)."/"; + + // 확장자를 구함 + $tmp_arr = explode(".",$filename); + $ext = strtolower(array_pop($tmp_arr)); + + // 확장자에 따라서 파일 import를 별도로 + switch($ext) { + // xml js filter + case 'xml' : + // XmlJSFilter 클래스의 객체 생성후 js파일을 만들고 Context::addJsFile처리 + $output = sprintf( + 'compile();%s'. + '?>%s', + "\n", + "\n", + $base_path, + $filename, + "\n", + "\n", + "\n" + ); + break; + // css file + case 'css' : + $meta_file = sprintf('%s%s', $base_path, $filename); + $output = sprintf('', $base_path, $filename); + break; + // js file + case 'js' : + $meta_file = sprintf('%s%s', $base_path, $filename); + $output = sprintf('', $base_path, $filename); + break; + } + } + + $output = ''.$output; + return $output; + } + + /** + * @brief $tpl_file로 compiled_tpl_file이름을 return + **/ + function _getCompiledFileName($tpl_file) { + return sprintf('%s%s.compiled.php',$this->compiled_path, md5($tpl_file)); + } + + /** + * @brief ob_* 함수를 이용하여 fetch... + **/ + function _fetch($compiled_tpl_file, $buff = NULL, $tpl_path = '') { + $__Context = &$GLOBALS['__Context__']; + $__Context->tpl_path = $tpl_path; + + if($_SESSION['is_logged']) $__Context->logged_info = $_SESSION['logged_info']; + + // ob_start를 시킨후 컴파일된 tpl파일을 include하고 결과를 return + ob_start(); + + // tpl파일을 compile하지 못할 경우 $buff로 넘어온 값을 eval시킴 (미설치시에나..) + if($buff) { + $eval_str = "?>".$buff; + eval($eval_str); + } else { + @include($compiled_tpl_file); + } + + $output = ob_get_contents(); + ob_end_clean(); + + return $output; + } + } +?> diff --git a/classes/widget/WidgetHandler.class.php b/classes/widget/WidgetHandler.class.php new file mode 100644 index 000000000..c079ef8b6 --- /dev/null +++ b/classes/widget/WidgetHandler.class.php @@ -0,0 +1,132 @@ + 태그 사용 templateHandler에서 WidgetHandler::execute()를 실행하는 코드로 대체하게 된다 + **/ + function execute($widget, $args) { + // 디버그를 위한 위젯 실행 시간 저장 + if(__DEBUG__==3) $start = getMicroTime(); + + // $widget의 객체를 받음 + $oWidget = WidgetHandler::getObject($widget); + + // 위젯 실행 + if($oWidget) { + $output = $oWidget->proc($args); + } + + if($args->widget_fix_width == 'Y') { + $widget_width_type = strtolower($args->widget_width_type); + if(!$widget_width_type||!in_array($widget_width_type,array("px","%"))) $widget_width_type = "px"; + + + if($widget_width_type == "px") { + + $style = "overflow:hidden;"; + $style .= sprintf("%s:%s%s;", "width", $args->widget_width - $args->widget_margin_right - $args->widget_margin_left, $widget_width_type); + $style .= sprintf("margin-top:%dpx;margin-bottom:%dpx;", $args->widget_margin_top, $args->widget_margin_bottom); + $inner_style = sprintf("margin-left:%dpx;margin-right:%dpx;", $args->widget_margin_left, $args->widget_margin_right); + + if($args->widget_position) { + $style .= sprintf("%s:%s;", "float", $args->widget_position); + $output = sprintf('
%s
',$style, $inner_style, $output); + } else { + $style .= "float:left;"; + $output = sprintf('
%s
',$style, $inner_style, $output); + } + + } else { + + $style = sprintf("padding:0;overflow:hidden;%s:%s%s;", "width", $args->widget_width, $widget_width_type); + + $output = sprintf('
%s
', $args->widget_margin_top, $args->widget_margin_right,$args->widget_margin_bottom,$args->widget_margin_left, $output); + + if($args->widget_position) { + $style .= sprintf("%s:%s;", "float", $args->widget_position); + $output = sprintf('
%s
',$style, $output); + } else { + $style .= "float:left;"; + $output = sprintf('
%s
',$style, $output); + } + } + + } else { + $output = sprintf('
%s
', $args->widget_margin_top, $args->widget_margin_right,$args->widget_margin_bottom,$args->widget_margin_left, $output); + } + + if(__DEBUG__==3) $GLOBALS['__widget_excute_elapsed__'] += getMicroTime() - $start; + + if($args->widget_sequence && $args->widget_cache) { + $cache_path = './files/cache/widget_cache/'; + $cache_file = sprintf('%s%d.%s.cache', $cache_path, $args->widget_sequence, Context::getLangType()); + + FileHandler::writeFile($cache_file, $output); + } + + return $output; + } + + /** + * @brief 위젯 객체를 return + **/ + function getObject($widget) { + if(!$GLOBALS['_xe_loaded_widgets_'][$widget]) { + // 일단 위젯의 위치를 찾음 + $oWidgetModel = &getModel('widget'); + $path = $oWidgetModel->getWidgetPath($widget); + + // 위젯 클래스 파일을 찾고 없으면 에러 출력 (html output) + $class_file = sprintf('%s%s.class.php', $path, $widget); + if(!file_exists($class_file)) return sprintf(Context::getLang('msg_widget_is_not_exists'), $widget); + + // 위젯 클래스를 include + require_once($class_file); + + // 객체 생성 + $eval_str = sprintf('$oWidget = new %s();', $widget); + @eval($eval_str); + if(!is_object($oWidget)) return sprintf(Context::getLang('msg_widget_object_is_null'), $widget); + + if(!method_exists($oWidget, 'proc')) return sprintf(Context::getLang('msg_widget_proc_is_null'), $widget); + + $oWidget->widget_path = $path; + + $GLOBALS['_xe_loaded_widgets_'][$widget] = $oWidget; + } + return $GLOBALS['_xe_loaded_widgets_'][$widget]; + } + + } +?> diff --git a/classes/xml/XmlJsFilter.class.php b/classes/xml/XmlJsFilter.class.php new file mode 100644 index 000000000..c01a5f9c5 --- /dev/null +++ b/classes/xml/XmlJsFilter.class.php @@ -0,0 +1,268 @@ + + *
<-- 폼 항목의 체크 + * + * + * <-- 폼 항목을 조합하여 key=val 의 js array로 return, act는 필수 + * + * + * <-- 서버에 ajax로 전송하여 받을 결과값 + * <-- error이름의 결과값을 받겠다는 것 + * + * + * + * - form - node + * target = 폼 element의 이름 + * required = true/ false 꼭 있어야 하는지에 대한 체크 + * minlength, maxlength = 최소/최대 길이 + * filter = javascript로 체크하기 위한 체크 필터 + * email : email의 형식 ( aaa.aaa@aaa.com) + * userid : 영문+숫자+_, 첫 글자는 영문, 소문자 + * alpha : 영문값만 허용 + * number : 숫자만 허용 + * equalto = target , 현재 폼과 지정 target의 값이 동일해야 함 + * + * - parameter - param + * name = key : key를 이름으로 가지고 value의 값을 가지는 array 값 생성 + * target = target_name : target form element의 값을 가져옴 + * + * - response + * tag = key : return받을 결과값의 변수명 + **/ + + class XmlJsFilter extends XmlParser { + var $compiled_path = './files/cache/js_filter_compiled/'; ///< 컴파일된 캐시 파일이 놓일 위치 + var $xml_file = NULL; ///< 대상 xml 파일 + var $js_file = NULL; ///< 컴파일된 js 파일 + + /** + * @brief constructor + **/ + function XmlJsFilter($path, $xml_file) { + $this->xml_file = sprintf("%s%s",$path, $xml_file); + $this->js_file = $this->_getCompiledFileName($this->xml_file); + } + + /** + * @brief 원 xml파일과 compiled된js파일의 시간 비교 및 유무 비교등을 처리 + **/ + function compile() { + if(!file_exists($this->xml_file)) return; + if(!file_exists($this->js_file)) $this->_compile(); + else if(filectime($this->xml_file)>filectime($this->js_file)) $this->_compile(); + Context::addJsFile($this->js_file); + } + + /** + * @brief 실제 xml_file을 컴파일하여 js_file을 생성 + **/ + function _compile() { + global $lang; + + // xml 파일을 읽음 + $buff = FileHandler::readFile($this->xml_file); + + // xml parsing + $xml_obj = parent::parse($buff); + + // XmlJsFilter는 filter_name, field, parameter 3개의 데이터를 핸들링 + $filter_name = $xml_obj->filter->attrs->name; + $confirm_msg_code = $xml_obj->filter->attrs->confirm_msg_code; + $module = $xml_obj->filter->attrs->module; + $act = $xml_obj->filter->attrs->act; + $extend_filter = $xml_obj->filter->attrs->extend_filter; + + $field_node = $xml_obj->filter->form->node; + if($field_node && !is_array($field_node)) $field_node = array($field_node); + + $parameter_param = $xml_obj->filter->parameter->param; + if($parameter_param && !is_array($parameter_param)) $parameter_param = array($parameter_param); + + $response_tag = $xml_obj->filter->response->tag; + if($response_tag && !is_array($response_tag)) $response_tag = array($response_tag); + + // extend_filter가 있을 경우 해당 method를 호출하여 결과를 받음 + if($extend_filter) { + + // extend_filter가 있을 경우 캐시 사용을 못하도록 js 캐시 파일명을 변경 + $this->js_file .= '.nocache.js'; + + // extend_filter는 module.method 로 지칭되어 이를 분리 + list($module_name, $method) = explode('.',$extend_filter); + + // 모듈 이름과 method가 있을 경우 진행 + if($module_name&&$method) { + // 해당 module의 model 객체를 받음 + $oExtendFilter = &getModel($module_name); + + // method가 존재하면 실행 + if(method_exists($oExtendFilter, $method)) { + // 결과를 받음 + //$extend_filter_list = call_user_method($method, $oExtendFilter, true); + //$extend_filter_list = call_user_func(array($oExtendFilter, $method)); + $extend_filter_list = $oExtendFilter->{$method}(true); + $extend_filter_count = count($extend_filter_list); + + // 결과에서 lang값을 이용 문서 변수에 적용 + for($i=0;$i<$extend_filter_count;$i++) { + $name = $extend_filter_list[$i]->name; + $lang_value = $extend_filter_list[$i]->lang; + if($lang_value) $lang->{$name} = $lang_value; + } + } + + } + } + + $callback_func = $xml_obj->filter->response->attrs->callback_func; + if(!$callback_func) $callback_func = "filterAlertMessage"; + + // 언어 입력을 위한 사용되는 필드 조사 + $target_list = array(); + $target_type_list = array(); + + // js function 을 만들기 시작 + $js_doc = sprintf("function %s(fo_obj) {\n", $filter_name); + $js_doc .= sprintf("\tvar oFilter = new XmlJsFilter(fo_obj, \"%s\", \"%s\", %s);\n", $module, $act, $callback_func); + + // field, 즉 체크항목의 script 생성 + $node_count = count($field_node); + if($node_count) { + foreach($field_node as $key =>$node) { + $attrs = $node->attrs; + $target = trim($attrs->target); + if(!$target) continue; + $required = $attrs->required=='true'?'true':'false'; + $minlength = $attrs->minlength>0?$attrs->minlength:'0'; + $maxlength = $attrs->maxlength>0?$attrs->maxlength:'0'; + $equalto = trim($attrs->equalto); + $filter = $attrs->filter; + + $js_doc .= sprintf( + "\toFilter.addFieldItem(\"%s\",%s,%s,%s,\"%s\",\"%s\");\n", + $target, $required, $minlength, $maxlength, $equalto, $filter + ); + + if(!in_array($target, $target_list)) $target_list[] = $target; + if(!$target_type_list[$target]) $target_type_list[$target] = $filter; + } + } + + // extend_filter_item 체크 + for($i=0;$i<$extend_filter_count;$i++) { + $filter_item = $extend_filter_list[$i]; + $target = trim($filter_item->name); + if(!$target) continue; + $type = $filter_item->type; + $required = $filter_item->required?'true':'false'; + + // extend filter item의 type으로 filter를 구함 + switch($type) { + case 'homepage' : + $filter = 'homepage'; + break; + case 'email_address' : + $filter = 'email'; + break; + default : + $filter = ''; + break; + } + + $js_doc .= sprintf( + "\toFilter.addFieldItem(\"%s\",%s,%s,%s,\"%s\",\"%s\");\n", + $target, $required, 0, 0, '', $filter + ); + + if(!in_array($target, $target_list)) $target_list[] = $target; + if(!$target_type_list[$target]) $target_type_list[$target] = $type; + + } + + // 데이터를 만들기 위한 parameter script 생성 + $parameter_count = count($parameter_param); + if($parameter_count) { + // 기본 필터 내용의 parameter로 구성 + foreach($parameter_param as $key =>$param) { + $attrs = $param->attrs; + $name = trim($attrs->name); + $target = trim($attrs->target); + if(!$name || !$target) continue; + $target = htmlentities($target,ENT_QUOTES); + + $js_doc .= sprintf( + "\toFilter.addParameterItem(\"%s\",\"%s\");\n", + $name, $target + ); + if(!in_array($name, $target_list)) $target_list[] = $name; + } + + // extend_filter_item 체크 + for($i=0;$i<$extend_filter_count;$i++) { + $filter_item = $extend_filter_list[$i]; + $target = $name = trim($filter_item->name); + if(!$name || !$target) continue; + $target = htmlentities($target,ENT_QUOTES); + + $js_doc .= sprintf( + "\toFilter.addParameterItem(\"%s\",\"%s\");\n", + $name, $target + ); + if(!in_array($name, $target_list)) $target_list[] = $name; + } + } + + // response script 생성 + $response_count = count($response_tag); + for($i=0;$i<$response_count;$i++) { + $attrs = $response_tag[$i]->attrs; + $name = $attrs->name; + $js_doc .= sprintf("\toFilter.addResponseItem(\"%s\");\n", $name); + } + + if($confirm_msg_code) $js_doc .= sprintf("\treturn oFilter.proc(\"%s\");\n",str_replace('"','\"',$lang->{$confirm_msg_code})); + else $js_doc .= sprintf("\treturn oFilter.proc();\n"); + $js_doc .= "}\n"; + + // form 필드 lang 값을 기록 + $target_count = count($target_list); + for($i=0;$i<$target_count;$i++) { + $target = $target_list[$i]; + if(!$lang->{$target}) $lang->{$target} = $target; + $js_doc .= sprintf("alertMsg[\"%s\"] = \"%s\";\n", $target, str_replace("\"","\\\"",$lang->{$target})); + } + + // target type을 기록 + $target_type_count = count($target_type_list); + if($target_type_count) { + foreach($target_type_list as $target => $type) { + $js_doc .= sprintf("target_type_list[\"%s\"] = \"%s\";\n", $target, $type); + } + } + + // 에러 메세지를 기록 + foreach($lang->filter as $key => $val) { + if(!$val) $val = $key; + $js_doc .= sprintf("alertMsg[\"%s\"] = \"%s\";\n", $key, str_replace("\"","\\\"",$val)); + } + + // js파일 생성 + FileHandler::writeFile($this->js_file, $js_doc); + } + + /** + * @brief $xml_file로 compiled_xml_file이름을 return + **/ + function _getCompiledFileName($xml_file) { + return sprintf('%s%s.%s.compiled.js',$this->compiled_path, md5($xml_file),Context::getLangType()); + } + } +?> diff --git a/classes/xml/XmlParser.class.php b/classes/xml/XmlParser.class.php new file mode 100644 index 000000000..9303ae96a --- /dev/null +++ b/classes/xml/XmlParser.class.php @@ -0,0 +1,134 @@ +parse($buff); + } + + /** + * @brief xml 파싱 + **/ + function parse($input = '') { + // 디버그를 위한 컴파일 시작 시간 저장 + if(__DEBUG__==3) $start = getMicroTime(); + + $this->lang = Context::getLangType(); + + $this->input = $input?$input:$GLOBALS['HTTP_RAW_POST_DATA']; + + // 지원언어 종류를 뽑음 + preg_match_all("/xml:lang=\"([^\"].+)\"/i", $this->input, $matches); + + // xml:lang이 쓰였을 경우 지원하는 언어종류를 뽑음 + if(count($matches[1]) && $supported_lang = array_unique($matches[1])) { + // supported_lang에 현재 접속자의 lang이 없으면 en이 있는지 확인하여 en이 있으면 en을 기본, 아니면 첫번째것을.. + if(!in_array($this->lang, $supported_lang)) { + if(in_array('en', $supported_lang)) { + $this->lang = 'en'; + } else { + $this->lang = array_shift($supported_lang); + } + } + // 특별한 언어가 지정되지 않았다면 언어체크를 하지 않음 + } else { + unset($this->lang); + } + + $this->oParser = xml_parser_create(); + + xml_set_object($this->oParser, $this); + xml_set_element_handler($this->oParser, "_tagOpen", "_tagClosed"); + xml_set_character_data_handler($this->oParser, "_tagBody"); + + xml_parse($this->oParser, $this->input); + xml_parser_free($this->oParser); + + if(!count($this->output)) return; + + $output = array_shift($this->output); + + // 디버그를 위한 컴파일 시작 시간 저장 + if(__DEBUG__==3) $GLOBALS['__xmlparse_elapsed__'] += getMicroTime() - $start; + + return $output; + } + + /** + * @brief 태그 오픈 + **/ + function _tagOpen($parser, $node_name, $attrs) { + $obj->node_name = strtolower($node_name); + $obj->attrs = $this->_arrToObj($attrs); + + array_push($this->output, $obj); + } + + /** + * @brief body 내용 + **/ + function _tagBody($parser, $body) { + if(!trim($body)) return; + $this->output[count($this->output)-1]->body .= $body; + } + + /** + * @brief 태그 닫음 + **/ + function _tagClosed($parser, $node_name) { + $node_name = strtolower($node_name); + $cur_obj = array_pop($this->output); + $parent_obj = &$this->output[count($this->output)-1]; + if($this->lang&&$cur_obj->attrs->{'xml:lang'}&&$cur_obj->attrs->{'xml:lang'}!=$this->lang) return; + if($this->lang&&$parent_obj->{$node_name}->attrs->{'xml:lang'}&&$parent_obj->{$node_name}->attrs->{'xml:lang'}!=$this->lang) return; + + if($parent_obj->{$node_name}) { + $tmp_obj = $parent_obj->{$node_name}; + if(is_array($tmp_obj)) { + array_push($parent_obj->{$node_name}, $cur_obj); + } else { + $parent_obj->{$node_name} = array(); + array_push($parent_obj->{$node_name}, $tmp_obj); + array_push($parent_obj->{$node_name}, $cur_obj); + } + } else { + $parent_obj->{$node_name} = $cur_obj; + } + } + + /** + * @brief 파싱한 결과를 object vars에 담기 위한 method + **/ + function _arrToObj($arr) { + if(!count($arr)) return; + foreach($arr as $key => $val) { + $key = strtolower($key); + $output->{$key} = $val; + } + return $output; + } + } +?> diff --git a/classes/xml/XmlQueryParser.class.php b/classes/xml/XmlQueryParser.class.php new file mode 100644 index 000000000..145252e2b --- /dev/null +++ b/classes/xml/XmlQueryParser.class.php @@ -0,0 +1,337 @@ +query->attrs->action); + if(!$action) return; + + // 테이블 정리 (배열코드로 변환) + $tables = $xml_obj->query->tables->table; + if(!$tables) return; + if(!is_array($tables)) $tables = array($tables); + foreach($tables as $key => $val) { + // 테이블과 alias의 이름을 구함 + $table_name = $val->attrs->name; + $alias = $val->attrs->alias; + if(!$alias) $alias = $table_name; + + $output->tables[$table_name] = $alias; + + // 테이블을 찾아서 컬럼의 속성을 구함 + $table_file = sprintf('./modules/%s/schemas/%s.xml', $module, $table_name); + if(!file_exists($table_file)) { + $searched_list = FileHandler::readDir('./modules'); + $searched_count = count($searched_list); + for($i=0;$i<$searched_count;$i++) { + $table_file = sprintf('./modules/%s/schemas/%s.xml', $searched_list[$i], $table_name); + if(file_exists($table_file)) break; + } + } + + if(file_exists($table_file)) { + $table_xml = FileHandler::readFile($table_file); + $table_obj = parent::parse($table_xml); + if($table_obj->table) { + foreach($table_obj->table->column as $k => $v) { + $buff .= sprintf('$output->column_type["%s"] = "%s";%s', $v->attrs->name, $v->attrs->type, "\n"); + } + } + } + } + + // 컬럼 정리 + $columns = $xml_obj->query->columns->column; + if(!$columns) { + $output->column[] = array("*" => "*"); + } else { + if(!is_array($columns)) $columns = array($columns); + foreach($columns as $key => $val) { + $name = $val->attrs->name; + /* + if(strpos('.',$name)===false && count($output->tables)==1) { + $tmp = array_values($output->tables); + $name = sprintf('%s.%s', $tmp[0], $val->attrs->name); + } + */ + + $output->columns[] = array( + "name" => $name, + "var" => $val->attrs->var, + "default" => $val->attrs->default, + "notnull" => $val->attrs->notnull, + "filter" => $val->attrs->filter, + "minlength" => $val->attrs->minlength, + "maxlength" => $val->attrs->maxlength, + "alias" => $val->attrs->alias, + ); + } + } + + // 조건절 정리 + $conditions = $xml_obj->query->conditions; + + $condition = $conditions->condition; + if($condition) { + $obj->condition = $condition; + unset($condition); + $condition = array($obj); + } + + $condition_group = $conditions->group; + if($condition_group && !is_array($condition_group)) $condition_group = array($condition_group); + + if($condition && $condition_group) $cond = array_merge($condition, $condition_group); + elseif($condition_group) $cond = $condition_group; + else $cond = $condition; + + if($cond) { + foreach($cond as $key => $val) { + unset($cond_output); + + if($val->attrs->pipe) $cond_output->pipe = $val->attrs->pipe; + else $cond_output->pipe = null; + + if(!$val->condition) continue; + if(!is_array($val->condition)) $val->condition = array($val->condition); + + foreach($val->condition as $k => $v) { + $obj = $v->attrs; + if(!$obj->alias) $obj->alias = $obj->column; + $cond_output->condition[] = $obj; + } + + $output->conditions[] = $cond_output; + } + } + + // group 정리 + $group_list = $xml_obj->query->groups->group; + if($group_list) { + if(!is_array($group_list)) $group_list = array($group_list); + for($i=0;$iattrs->column); + if(!$column) continue; + $group_column_list[] = $column; + } + if(count($group_column_list)) $output->groups = $group_column_list; + } + + // 네비게이션 정리 + $navigation = $xml_obj->query->navigation; + if($navigation) { + $order = $navigation->index; + if($order) { + if(!is_array($order)) $order = array($order); + foreach($order as $order_info) { + $output->order[] = $order_info->attrs; + } + } + + $list_count = $navigation->list_count->attrs; + $output->list_count = $list_count; + + $page_count = $navigation->page_count->attrs; + $output->page_count = $page_count; + + $page = $navigation->page->attrs; + $output->page = $page ; + } + + $column_count = count($output->columns); + $condition_count = count($output->conditions); + + // php script 생성 + + // table 정리 + $buff .= '$output->tables = array( '; + foreach($output->tables as $key => $val) { + $buff .= sprintf('"%s"=>"%s",', $key, $val); + } + $buff .= ' );'."\n"; + + // column 정리 + if($column_count) { + $buff .= '$output->columns = array ( '; + foreach($output->columns as $key => $val) { + $val['default'] = $this->getDefault($val['name'], $val['default']); + if($val['var'] && strpos($val['var'],'.')===false) { + + if($val['default']) $buff .= sprintf('array("name"=>"%s", "alias"=>"%s", "value"=>$args->%s?$args->%s:%s),%s', $val['name'], $val['alias'], $val['var'], $val['var'], $val['default'] ,"\n"); + else $buff .= sprintf('array("name"=>"%s", "alias"=>"%s", "value"=>$args->%s),%s', $val['name'], $val['alias'], $val['var'], "\n"); + + if($val['default']) $default_list[$val['var']] = $val['default']; + if($val['notnull']) $notnull_list[] = $val['var']; + if($val['minlength']) $minlength_list[$val['var']] = $val['minlength']; + if($val['maxlength']) $maxlength_list[$val['var']] = $val['maxlength']; + } else { + if($val['default']) $buff .= sprintf('array("name"=>"%s", "alias"=>"%s", "value"=>%s),%s', $val['name'], $val['alias'], $val['default'] ,"\n"); + else $buff .= sprintf('array("name"=>"%s", "alias"=>"%s",),%s', $val['name'], $val['alias'], "\n"); + } + } + $buff .= ' );'."\n"; + } + + // conditions 정리 + if($condition_count) { + $buff .= '$output->conditions = array ( '; + foreach($output->conditions as $key => $val) { + $buff .= sprintf('array("pipe"=>"%s",%s"condition"=>array(', $val->pipe,"\n"); + foreach($val->condition as $k => $v) { + $v->default = $this->getDefault($v->column, $v->default); + if($v->var) { + if(strpos($v->var,".")===false) { + if($v->default) $default_list[$v->var] = $v->default; + if($v->filter) $filter_list[] = $v; + if($v->default) $buff .= sprintf('array("column"=>"%s", "value"=>$args->%s?$args->%s:%s,"pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->var, $v->var, $v->default, $v->pipe, $v->operation, "\n"); + else $buff .= sprintf('array("column"=>"%s", "value"=>$args->%s,"pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->var, $v->pipe, $v->operation, "\n"); + } else { + $buff .= sprintf('array("column"=>"%s", "value"=>"%s","pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->var, $v->pipe, $v->operation, "\n"); + } + } else { + if($v->default) $buff .= sprintf('array("column"=>"%s", "value"=>%s,"pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->default ,$v->pipe, $v->operation,"\n"); + else $buff .= sprintf('array("column"=>"%s", "pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->pipe, $v->operation,"\n"); + } + } + $buff .= ')),'."\n"; + } + + $buff .= ' );'."\n"; + } + + // order 정리 + if($output->order) { + $buff .= '$output->order = array('; + foreach($output->order as $key => $val) { + $buff .= sprintf('array($args->%s?$args->%s:"%s",in_array($args->%s,array("asc","desc"))?$args->%s:("%s"?"%s":"asc")),', $val->var, $val->var, $val->default, $val->order, $val->order, $val->order, $val->order); + } + $buff .= ');'."\n"; + } + + // list_count 정리 + if($output->list_count) { + $buff .= sprintf('$output->list_count = array("var"=>"%s", "value"=>$args->%s?$args->%s:"%s");%s', $output->list_count->var, $output->list_count->var, $output->list_count->var, $output->list_count->default,"\n"); + } + + // page_count 정리 + if($output->page_count) { + $buff .= sprintf('$output->page_count = array("var"=>"%s", "value"=>$args->%s?$args->%s:"%s");%s', $output->page_count->var, $output->page_count->var, $output->page_count->var, $output->list_count->default,"\n"); + } + + // page 정리 + if($output->page) { + $buff .= sprintf('$output->page = array("var"=>"%s", "value"=>$args->%s?$args->%s:"%s");%s', $output->page->var, $output->page->var, $output->page->var, $output->list->default,"\n"); + } + + // group by 정리 + if($output->groups) { + $buff .= sprintf('$output->groups = array("%s");%s', implode('","',$output->groups),"\n"); + } + + // default check + if(count($default_list)) { + foreach($default_list as $key => $val) { + $pre_buff .= 'if(!isset($args->'.$key.')) $args->'.$key.' = '.$val.';'."\n"; + } + } + + // not null check + if(count($notnull_list)) { + foreach($notnull_list as $key => $val) { + $pre_buff .= 'if(!isset($args->'.$val.')) return new Object(-1, sprintf($lang->filter->isnull, $lang->'.$val.'?$lang->'.$val.':\''.$val.'\'));'."\n"; + } + } + + // minlength check + if(count($minlength_list)) { + foreach($minlength_list as $key => $val) { + $pre_buff .= 'if($args->'.$key.'&&strlen($args->'.$key.')<'.$val.') return new Object(-1, sprintf($lang->filter->outofrange, $lang->'.$key.'?$lang->'.$key.':\''.$key.'\'));'."\n"; + } + } + + // maxlength check + if(count($maxlength_list)) { + foreach($maxlength_list as $key => $val) { + $pre_buff .= 'if($args->'.$key.'&&strlen($args->'.$key.')>'.$val.') return new Object(-1, sprintf($lang->filter->outofrange, $lang->'.$key.'?$lang->'.$key.':\''.$key.'\'));'."\n"; + } + } + + // filter check + if(count($filter_list)) { + foreach($filter_list as $key => $val) { + if(!$notnull_list[$key]) continue; + $pre_buff .= sprintf('unset($_output); $_output = $this->checkFilter("%s",$args->%s,"%s"); if(!$_output->toBool()) return $_output;%s',$val->var,$val->var,$val->filter,"\n"); + } + } + + $buff = "query_id = "%s";%s', $query_id, "\n") + . sprintf('$output->action = "%s";%s', $action, "\n") + . $pre_buff + . $buff + . 'return $output; ?>'; + + // 저장 + FileHandler::writeFile($cache_file, $buff); + } + + /** + * @brief column, condition등의 key에 default 값을 세팅 + **/ + function getDefault($name, $value) { + if(!$value) return; + $str_pos = strpos($value, '('); + if($str_pos===false) return '"'.$value.'"'; + + $func_name = substr($value, 0, $str_pos); + $args = substr($value, $str_pos+1, strlen($value)-1); + + switch($func_name) { + case 'ipaddress' : + $val = '$_SERVER[\'REMOTE_ADDR\']'; + break; + case 'unixtime' : + $val = 'time()'; + break; + case 'curdate' : + $val = 'date("YmdHis")'; + break; + case 'sequence' : + $val = '$this->getNextSequence()'; + break; + case 'plus' : + $args = abs($args); + $val = sprintf('"%s+%d"', $name, $args); + break; + case 'minus' : + $args = abs($args); + $val = sprintf('"%s-%d"', $name, $args); + break; + } + + return $val; + } + + } +?> diff --git a/common/css/button.css b/common/css/button.css new file mode 100644 index 000000000..a89a8fb93 --- /dev/null +++ b/common/css/button.css @@ -0,0 +1,167 @@ +/* + 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; + 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; + + padding-top:-2px; + position:relative; + _width:10px; + _overflow-y:hidden; +} + +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; + color:#222; + display:-moz-inline-box; + display:inline-block; + line-height:1; + letter-spacing:0 !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; +} + +*: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*/ +} + +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 a.button:focus, html.safari span.button button:focus { + outline:none; +} + +del.button{ + /* cursor:not-allowed; */ + background-position:0 -123px; + +} + +del.button span { + cursor:default; + color:#aaa !important; + background-position:100% -123px; +} + +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*/ +} + +/** optional **/ +/* +a.button:visited{ + 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:active, a.button:focus span { + color:#444; +} + +del.button-behavior-hover, del.button:hover { + background-position:0 -183px; + /* cursor:not-allowed; */ +} + +del.button-behavior-hover span, del.button:hover span { + background-position:100% -183px; + /* 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(); + }; + + 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 new file mode 100644 index 000000000..0bdffec0d --- /dev/null +++ b/common/css/default.css @@ -0,0 +1,79 @@ +@charset "utf-8"; + +/* +Used Hack +IE6 & Below +{ property:value; _property:value; } +IE7 Only +*:first-child+html #selector +IE7 & IE6 & Below +*:first-child+html #selector, +* html #selector {} +*/ + +/* Special Class Selector */ +.fr { float:right; } +.fl { float:left; } +.clear { clear:both; } +.fwB { font-weight:bold;} +.tCenter { text-align:center; } +.tRight { text-align:right; } +.tLeft { text-align:left; } +.gap1 { margin-top:.8em; } + +/* default.css - Type Selector Definition */ +* { margin:0; padding:0; } +html { width:100%; position:relative;} +body { margin:0; font-size:.75em; font-family:sans-serif;} +img { border:none; } +label { cursor:pointer; } +form { margin:0; padding:0; } + +.iePngFix { behavior:url(./common/js/iePngFix.htc); } +.zbxe_info { vertical-align:middle; behavior:url(./common/js/iePngFix.htc); } + +/* Input Style Definition */ +.inputTypeText { border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; height:1.4em; padding:.2em 0 0 .3em; background:#ffffff; font-size:1em; } +.inputTypeText:hover, +.inputTypeText:focus { background:#f4f4f4; } +.inputTypeTextArea { border:1px solid !important; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6 !important; background:#ffffff; font-size:1em;} + +.w40 { width:40px; } +.w60 { width:60px; } +.w80 { width:80px; } +.w100 { width:100px; } +.w120 { width:120px; } +.w140 { width:140px; } +.w200 { width:200px; } +.w300 { width:300px; } +.w400 { width:400px; } + + +/* editor style */ +a.bold { font-weight:bold; } + +.editor_blue_text { color: #145ff9; text-decoration:underline; } +.editor_blue_text a { color: #145ff9; text-decoration:underline; } +.editor_red_text { color: #f42126; text-decoration:underline; } +.editor_red_text a { color: #f42126; text-decoration:underline; } +.editor_yellow_text { color: #c9bd00; text-decoration:underline; } +.editor_yellow_text a { color: #c9bd00; text-decoration:underline; } +.editor_green_text { color: #08830B; text-decoration:underline; } +.editor_green_text a { color: #08830B; text-decoration:underline; } + +.folder_opener { display: block; } +.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; } + +#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;} diff --git a/common/js/common.js b/common/js/common.js new file mode 100644 index 000000000..f88bea73b --- /dev/null +++ b/common/js/common.js @@ -0,0 +1,614 @@ +/** + * @file common.js + * @author zero (zero@nzeo.com) + * @brief 몇가지 유용한 & 기본적으로 자주 사용되는 자바스크립트 함수들 모음 + **/ + +/** + * @brief location.href에서 특정 key의 값을 return + **/ +String.prototype.getQuery = function(key) { + var idx = this.indexOf('?'); + if(idx == -1) return null; + var query_string = this.substr(idx+1, this.length); + var args = {} + query_string.replace(/([^=]+)=([^&]*)(&|$)/g, function() { args[arguments[1]] = arguments[2]; }); + + var q = args[key]; + if(typeof(q)=="undefined") q = ""; + + return q; +} + +/** + * @brief location.href에서 특정 key의 값을 return + **/ +String.prototype.setQuery = function(key, val) { + var idx = this.indexOf('?'); + var uri = this; + uri = uri.replace(/#$/,''); + if(idx != -1) { + uri = this.substr(0, idx); + var query_string = this.substr(idx+1, this.length); + var args = new Array(); + query_string.replace(/([^=]+)=([^&]*)(&|$)/g, function() { args[arguments[1]] = arguments[2]; }); + + args[key] = val; + + var q_list = new Array(); + for(var i in args) { + var arg = args[i]; + if(!arg.toString().trim()) continue; + + q_list[q_list.length] = i+'='+arg; + } + return uri+"?"+q_list.join("&"); + } else { + if(val.toString().trim()) return uri+"?"+key+"="+val; + else return uri; + } +} + +/** + * @brief string prototype으로 trim 함수 추가 + **/ +String.prototype.trim = function() { + return this.replace(/(^\s*)|(\s*$)/g, ""); +} + +/** + * @brief 주어진 인자가 하나라도 defined되어 있지 않으면 false return + **/ +function isDef() { + for(var i=0; i"+ + ""+ + ""+ + ""+ + ""+ + ""+ + "<\/object>"; + } else if(/\.flv/i.test(src)) { + html = ""; + } else { + html = ""; + } + + document.writeln(html); +} + +/** + * @brief 화면내에서 상위 영역보다 이미지가 크면 리사이즈를 하고 클릭시 원본을 보여줄수 있도록 변경 + **/ +function resizeImageContents() { + var objs = xGetElementsByTagName("IMG"); + for(var i in objs) { + var obj = objs[i]; + var parent = obj.parentNode; + if(!obj||!parent) continue; + while(parent.parentNode && parent.nodeName != "TD" && parent.nodeName != "DIV") { + parent = parent.parentNode; + } + if(parent.nodeName != "TD" && parent.nodeName != "DIV") continue; + + if(obj.parentNode.nodeName =='A') continue; + if(/\/modules\//i.test(obj.src)) continue; + if(/\/layouts\//i.test(obj.src)) continue; + if(/\/widgets\//i.test(obj.src)) continue; + if(/\/classes\//i.test(obj.src)) continue; + if(/\/common\/tpl\//i.test(obj.src)) continue; + if(/\/member_extra_info\//i.test(obj.src)) continue; + + var parent_width = xWidth(parent); + var obj_width = xWidth(obj); + var orig_img = new Image(); + orig_img.src = obj.src; + + if(parent_width<1 || obj_width <1) continue; + if(parent_width>=obj_width && orig_img.width <= obj_width) continue; + + obj.style.cursor = "pointer"; + + obj.source_width = orig_img.width; + obj.source_height = orig_img.height; + + if(obj_width >= parent_width) { + var per = parent_width/obj_width; + xWidth(obj, xWidth(parent)-1); + xHeight(obj, xHeight(obj)*per); + } + + xAddEventListener(obj,"click", showOriginalImage); + } +} +xAddEventListener(window, "load", resizeImageContents); + +/** + * @brief 에디터에서 사용되는 내용 여닫는 코드 (고정, zbxe용) + **/ +function zbxe_folder_open(id) { + var open_text_obj = xGetElementById("folder_open_"+id); + var close_text_obj = xGetElementById("folder_close_"+id); + var folder_obj = xGetElementById("folder_"+id); + open_text_obj.style.display = "none"; + close_text_obj.style.display = "block"; + folder_obj.style.display = "block"; +} + +function zbxe_folder_close(id) { + var open_text_obj = xGetElementById("folder_open_"+id); + var close_text_obj = xGetElementById("folder_close_"+id); + var folder_obj = xGetElementById("folder_"+id); + open_text_obj.style.display = "block"; + close_text_obj.style.display = "none"; + folder_obj.style.display = "none"; +} + + +/** + * @brief 에디터에서 사용하되 내용 여닫는 코드 (zb5beta beta 호환용으로 남겨 놓음) + **/ +function svc_folder_open(id) { + var open_text_obj = xGetElementById("_folder_open_"+id); + var close_text_obj = xGetElementById("_folder_close_"+id); + var folder_obj = xGetElementById("_folder_"+id); + open_text_obj.style.display = "none"; + close_text_obj.style.display = "block"; + folder_obj.style.display = "block"; +} + +function svc_folder_close(id) { + var open_text_obj = xGetElementById("_folder_open_"+id); + var close_text_obj = xGetElementById("_folder_close_"+id); + var folder_obj = xGetElementById("_folder_"+id); + open_text_obj.style.display = "block"; + close_text_obj.style.display = "none"; + folder_obj.style.display = "none"; +} + +/** + * @brief 팝업의 경우 내용에 맞춰 현 윈도우의 크기를 조절해줌 + * 팝업의 내용에 맞게 크기를 늘리는 것은... 쉽게 되지는 않음.. ㅡ.ㅜ + * popup_layout 에서 window.onload 시 자동 요청됨. + **/ +function setFixedPopupSize() { + + if(xGetElementById('popBody')) { + if(xHeight('popBody')>600) { + xGetElementById('popBody').style.overflowY = 'scroll'; + xGetElementById('popBody').style.overflowX = 'hidden'; + xHeight('popBody', 600); + } + } + + var w = xWidth("popup_content"); + var h = xHeight("popup_content"); + + var obj_list = xGetElementsByTagName('div'); + for(i=0;iw) w = ww; + } + + // 윈도우에서는 브라우저 상관없이 가로 픽셀이 조금 더 늘어나야 한다. + if(xUA.indexOf('windows')>0) { + if(xOp7Up) w += 10; + else if(xIE4Up) w += 10; + else w += 6; + } + window.resizeTo(w,h); + + var h1 = xHeight(window.document.body); + window.resizeBy(0,h-h1); + + window.scrollTo(0,0); +} + +/** + * @brief 본문내에서 컨텐츠 영역보다 큰 이미지의 경우 원본 크기를 보여줌 + **/ +function showOriginalImage(evt) { + var e = new xEvent(evt); + var obj = e.target; + var src = obj.src; + + var orig_image = xGetElementById("fororiginalimage"); + var tmp_image = new Image(); + tmp_image.src = src; + var image_width = tmp_image.width; + var image_height = tmp_image.height; + + orig_image.style.margin = "0px 0px 0px 0px"; + orig_image.style.cursor = "move"; + orig_image.src = src; + + var areabg = xGetElementById("fororiginalimageareabg"); + xWidth(areabg, image_width+36); + xHeight(areabg, image_height+46); + + var area = xGetElementById("fororiginalimagearea"); + xLeft(area, xScrollLeft()); + xTop(area, xScrollTop()); + xWidth(area, xWidth(document)); + xHeight(area, xHeight(document)); + area.style.visibility = "visible"; + var area_width = xWidth(area); + var area_height = xHeight(area); + + var x = parseInt((area_width-image_width)/2,10); + var y = parseInt((area_height-image_height)/2,10); + if(x<0) x = 0; + if(y<0) y = 0; + xLeft(areabg, x); + xTop(areabg, y); + + var sel_list = xGetElementsByTagName("select"); + for (var i = 0; i < sel_list.length; ++i) sel_list[i].style.visibility = "hidden"; + + xAddEventListener(orig_image, "mousedown", origImageDragEnable); + xAddEventListener(orig_image, "dblclick", closeOriginalImage); + xAddEventListener(window, "scroll", closeOriginalImage); + xAddEventListener(window, "resize", closeOriginalImage); + + areabg.style.visibility = 'visible'; +} + +/** + * @brief 원본 이미지 보여준 후 닫는 함수 + **/ +function closeOriginalImage(evt) { + var area = xGetElementById("fororiginalimagearea"); + if(area.style.visibility != "visible") return; + area.style.visibility = "hidden"; + xGetElementById("fororiginalimageareabg").style.visibility = "hidden"; + + var sel_list = xGetElementsByTagName("select"); + for (var i = 0; i < sel_list.length; ++i) sel_list[i].style.visibility = "visible"; + + xRemoveEventListener(area, "mousedown", closeOriginalImage); + xRemoveEventListener(window, "scroll", closeOriginalImage); + xRemoveEventListener(window, "resize", closeOriginalImage); +} + +/** + * @brief 원본 이미지 드래그 + **/ +var origDragManager = {obj:null, isDrag:false} +function origImageDragEnable(evt) { + var e = new xEvent(evt); + var obj = e.target; + if(obj.id != "fororiginalimage") return; + + obj.draggable = true; + obj.startX = e.pageX; + obj.startY = e.pageY; + + if(!origDragManager.isDrag) { + origDragManager.isDrag = true; + xAddEventListener(document, "mousemove", origImageDragMouseMove, false); + } + + xAddEventListener(document, "mousedown", origImageDragMouseDown, false); +} + +function origImageDrag(obj, px, py) { + var x = px - obj.startX; + var y = py - obj.startY; + + var areabg = xGetElementById("fororiginalimageareabg"); + xLeft(areabg, xLeft(areabg)+x); + xTop(areabg, xTop(areabg)+y); + + obj.startX = px; + obj.startY = py; +} + +function origImageDragMouseDown(evt) { + var e = new xEvent(evt); + var obj = e.target; + if(obj.id != "fororiginalimage" || !obj.draggable) return; + + if(obj) { + xPreventDefault(evt); + obj.startX = e.pageX; + obj.startY = e.pageY; + origDragManager.obj = obj; + xAddEventListener(document, 'mouseup', origImageDragMouseUp, false); + origImageDrag(obj, e.pageX, e.pageY); + } +} + +function origImageDragMouseUp(evt) { + if(origDragManager.obj) { + xPreventDefault(evt); + xRemoveEventListener(document, 'mouseup', origImageDragMouseUp, false); + xRemoveEventListener(document, 'mousemove', origImageDragMouseMove, false); + xRemoveEventListener(document, 'mousemdown', origImageDragMouseDown, false); + origDragManager.obj.draggable = false; + origDragManager.obj = null; + origDragManager.isDrag = false; + } +} + +function origImageDragMouseMove(evt) { + var e = new xEvent(evt); + var obj = e.target; + if(!obj) return; + if(obj.id != "fororiginalimage") { + xPreventDefault(evt); + xRemoveEventListener(document, 'mouseup', origImageDragMouseUp, false); + xRemoveEventListener(document, 'mousemove', origImageDragMouseMove, false); + xRemoveEventListener(document, 'mousemdown', origImageDragMouseDown, false); + origDragManager.obj.draggable = false; + origDragManager.obj = null; + origDragManager.isDrag = false; + return; + } + + xPreventDefault(evt); + origDragManager.obj = obj; + xAddEventListener(document, 'mouseup', origImageDragMouseUp, false); + origImageDrag(obj, e.pageX, e.pageY); +} + +/** + * @brief 이름을 클릭하였을 경우 메뉴를 보여주는 함수 + * 이름 클릭시 MemberModel::getMemberMenu 를 호출하여 그 결과를 보여줌 (사용자의 속성에 따라 메뉴가 달라지고 애드온의 연결을 하기 위해서임) + **/ +xAddEventListener(document, 'click', chkMemberMenu); +xAddEventListener(window, 'load', function() { setMemberMenuObjCursor(xGetElementsByTagName("div")); xGetElementsByTagName("span"); } ); +var loaded_member_menu_list = new Array(); + +// className = "member_*" 일 경우의 object가 클릭되면 해당 회원의 메뉴를 출력함 +function chkMemberMenu(evt) { + var area = xGetElementById("membermenuarea"); + 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; + obj = obj.parentNode; + } + if(!obj || !obj.className || obj.className.search("member_")==-1) return; + + if(obj.className.indexOf('member_-1')>=0) 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; + + // 서버에 메뉴를 요청 + var params = new Array(); + params["member_srl"] = member_srl; + params["cur_mid"] = mid; + params["cur_act"] = current_url.getQuery('act'); + 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); + return; + } + show_waiting_message = false; + exec_xml("member", "getMemberMenu", params, displayMemberMenu, response_tags, params); + show_waiting_message = true; +} + +function displayMemberMenu(ret_obj, response_tags, params) { + var area = xGetElementById("membermenuarea"); + var menu_list = ret_obj['menu_list']; + var member_srl = params["member_srl"]; + + var html = ""; + + if(loaded_member_menu_list[member_srl]) { + html = loaded_member_menu_list[member_srl]; + } else { + var infos = menu_list.split("\n"); + if(infos.length) { + for(var i=0;i"+str+"
"; + } + } + loaded_member_menu_list[member_srl] = html; + } + + if(html) { + xInnerHtml('membermenuarea', "
"+html+"
"); + xWidth(area, xWidth(area)); + xLeft(area, params["page_x"]); + xTop(area, params["page_y"]); + if(xWidth(area)+xLeft(area)>xClientWidth()+xScrollLeft()) xLeft(area, xClientWidth()-xWidth(area)+xScrollLeft()); + if(xHeight(area)+xTop(area)>xClientHeight()+xScrollTop()) xTop(area, xClientHeight()-xHeight(area)+xScrollTop()); + area.style.visibility = "visible"; + } +} + +// className = "member_*" 의 object의 cursor를 pointer로 본경 +function setMemberMenuObjCursor(obj) { + for (var i = 0; i < obj.length; ++i) { + var node = obj[i]; + if(node.className && node.className.search(/member_([0-9]+)/ig)!=-1) { + var member_srl = parseInt(node.className.replace(/member_([0-9]+)/ig,'$1').replace(/([^0-9]*)/ig,''),10); + if(member_srl<1) continue; + node.style.cursor = "pointer"; + } + } +} + +// 날짜 선택 (달력 열기) +function open_calendar(fo_id, day_str, callback_func) { + if(typeof(day_str)=="undefined") day_str = ""; + + var url = "./common/tpl/calendar.php?"; + if(fo_id) url+="fo_id="+fo_id; + if(day_str) url+="&day_str="+day_str; + if(callback_func) url+="&callback_func="+callback_func; + + popopen(url, 'Calendar'); +} + +// 언어코드 (lang_type) 쿠키값 변경 +function doChangeLangType(obj) { + if(typeof(obj)=="string") { + setLangType(obj); + } else { + var val = obj.options[obj.selectedIndex].value; + setLangType(val); + } + location.reload(); +} +function setLangType(lang_type) { + var expire = new Date(); + expire.setTime(expire.getTime()+ (7000 * 24 * 3600000)); + xSetCookie('lang_type', lang_type, expire); +} + +/* 미리보기 */ +function doDocumentPreview(obj) { + var fo_obj = obj; + while(fo_obj.nodeName != "FORM") { + fo_obj = fo_obj.parentNode; + } + if(fo_obj.nodeName != "FORM") return; + + var content = fo_obj.content.value; + + var win = window.open("","previewDocument","toolbars=no,width=700px;height=800px,scrollbars=yes,resizable=yes"); + + var dummy_obj = xGetElementById("previewDocument"); + + if(!dummy_obj) { + var fo_code = '
'+ + ''+ + ''+ + ''+ + '
'; + var dummy = xCreateElement("DIV"); + xInnerHtml(dummy, fo_code); + window.document.body.insertBefore(dummy,window.document.body.lastChild); + dummy_obj = xGetElementById("previewDocument"); + } + + if(dummy_obj) { + dummy_obj.content.value = content; + dummy_obj.submit(); + } +} + +/* 스킨 정보 */ +function viewSkinInfo(module, skin) { + popopen("./?module=module&act=dispModuleSkinInfo&selected_module="+module+"&skin="+skin, 'SkinInfo'); +} diff --git a/common/js/iePngFix.htc b/common/js/iePngFix.htc new file mode 100644 index 000000000..d6a4ef0e4 --- /dev/null +++ b/common/js/iePngFix.htc @@ -0,0 +1,64 @@ + + + + + diff --git a/common/js/tree_menu.js b/common/js/tree_menu.js new file mode 100644 index 000000000..ca2426694 --- /dev/null +++ b/common/js/tree_menu.js @@ -0,0 +1,636 @@ +/** + * @file tree_menu.js + * @author zero (zero@nzeo.com) + * @brief xml파일을 읽어서 트리 메뉴를 그려줌 + * + * 일단 이것 저것 꽁수가 좀 들어간 것이긴 한데 속도나 기타 면에서 쓸만함...\n + * 다만 제로보드에 좀 특화되어 있어서....\n + * GPL License 를 따릅니당~~~\n + * 언제나 그렇듯 필요하신 분은 가져가서 쓰세요.\n + * 더 좋게 개량하시면 공유해주세요~\n + **/ + +// 트리메뉴에서 사용될 아이콘의 위치 +var tree_menu_icon_path = "./common/tpl/images/"; + +// 아이콘을 미리 생성해 놓음 +var tree_folder_icon = new Image(); +tree_folder_icon.src = tree_menu_icon_path+"page.gif"; +var tree_open_folder_icon = new Image(); +tree_open_folder_icon.src = tree_menu_icon_path+"page.gif"; + +var tree_minus_icon = new Image(); +tree_minus_icon.src = tree_menu_icon_path+"minus.gif"; +var tree_minus_bottom_icon = new Image(); +tree_minus_bottom_icon.src = tree_menu_icon_path+"minusbottom.gif"; +var tree_plus_icon = new Image(); +tree_plus_icon.src = tree_menu_icon_path+"plus.gif"; +var tree_plus_bottom_icon = new Image(); +tree_plus_bottom_icon.src = tree_menu_icon_path+"plusbottom.gif"; + +// 폴더를 모두 열고/닫기 위한 변수 설정 +var tree_menu_folder_list = new Array(); + +// 노드의 정보를 가지고 있을 변수 +var node_info_list = new Array(); + +// menu_id별로 요청된 클릭시 실행 될 callback_func +var node_callback_func = new Array(); + +// menu_id별로 요청된 드래그시 실행될 callback_func +var node_move_callback_func = new Array(); + +// 트리메뉴의 정보를 담고 있는 xml파일을 읽고 drawTreeMenu()를 호출하는 함수 +function loadTreeMenu(url, menu_id, zone_id, title, index_url , callback_func, manual_select_node_srl, callback_move_func) { + // 일단 그릴 곳을 찾아서 사전 작업을 함 (그릴 곳이 없다면 아예 시도를 안함) + var zone = xGetElementById(zone_id); + if(typeof(zone)=="undefined") return; + + // 관리가 아닌 사용일경우는 menu_id를 변경 + if(typeof(callback_func)=='undefined') menu_id = 'display_'+menu_id; + + // 노드 정보들을 담을 변수 세팅 + node_info_list[menu_id] = new Array(); + + if(typeof(title)=='undefined') title = ''; + + // 사용자 정의 함수가 없다면 moveTreeMenu()라는 기본적인 동작을 하는 함수를 대입 + if(typeof(callback_func)=='undefined') { + callback_func = moveTreeMenu; + } + + if(typeof(callback_move_func)=='undefined') { + callback_move_func = null; + } + + // 한 페이지에 다수의 menu_id가 있을 수 있으므로 menu_id별로 함수를 저장 + node_callback_func[menu_id] = callback_func; + node_move_callback_func[menu_id] = callback_move_func; + + // 직접 선택시키려는 메뉴 인자값이 없으면 초기화 + if(typeof(manual_select_node_srl)=='undefined') manual_select_node_srl = ''; + + // xml_handler를 이용해서 직접 메뉴 xml파일(layout module에서 생성)을 읽음 + if(!url) return; + + var oXml = new xml_handler(); + oXml.reset(); + oXml.xml_path = url; + + if(!index_url) index_url= "#"; + + // menu_id, zone_id는 계속 달고 다녀야함 + var param = {"menu_id":menu_id, "zone_id":zone_id, "title":title, "index_url":index_url, "manual_select_node_srl":manual_select_node_srl} + + // 요청후 drawTreeMenu()함수를 호출 (xml_handler.js에서 request method를 직접 이용) + oXml.request(drawTreeMenu, oXml, null, null, null, param); +} + +// 트리메뉴 XML정보를 이용해서 정해진 zone에 출력 +var manual_select_node_srl = ''; +function drawTreeMenu(oXml, callback_func, resopnse_tags, null_func, param) { + // 그리기 위한 object를 찾아 놓음 + var menu_id = param.menu_id; + var zone_id = param.zone_id; + var title = param.title; + var index_url = param.index_url; + if(param.manual_select_node_srl) manual_select_node_srl = param.manual_select_node_srl; + var zone = xGetElementById(zone_id); + var html = ""; + + if(title) html = '
'+title+'
'; + + var xmlDoc = oXml.getResponseXml(); + if(!xmlDoc) { + xInnerHtml(zone, html); + return null; + } + + tree_menu_folder_list[menu_id] = new Array(); + + // node 태그에 해당하는 값들을 가져와서 html을 작성 + var node_list = xmlDoc.getElementsByTagName("node"); + if(node_list.length>0) { + var root = xmlDoc.getElementsByTagName("root")[0]; + var output = drawNode(root, menu_id); + html += output.html; + } + + // 출력하려는 zone이 없다면 load후에 출력하도록 함 + if(!zone) { + xAddEventListener(window, 'load', function() { drawTeeMenu(zone_id, menu_id, html); }); + + // 출력하려는 zone을 찾아졌다면 바로 출력 + } else { + xInnerHtml(zone, html); + if(manual_select_node_srl) manualSelectNode(menu_id, manual_select_node_srl); + } + + return null; +} + +// 페이지 랜더링 중에 메뉴의 html이 완성되었을때 window.onload event 후에 그리기 재시도를 하게 될 함수 +function drawTeeMenu(zone_id, menu_id, html) { + xInnerHtml(zone_id, html); + if(manual_select_node_srl) manualSelectNode(menu_id, manual_select_node_srl); +} + +// root부터 시작해서 recursive하게 노드를 표혐 +function drawNode(parent_node, menu_id) { + var output = {html:"", expand:"N"} + + for (var i=0; i< parent_node.childNodes.length; i++) { + var html = ""; + + // nodeName이 node가 아니면 패스~ + var node = parent_node.childNodes.item(i); + if(node.nodeName!="node") continue; + + // node의 기본 변수들 체크 + var node_srl = node.getAttribute("node_srl"); + var text = node.getAttribute("text"); + var url = node.getAttribute("url"); + var expand = node.getAttribute("expand"); + + if(!text) continue; + + // 자식 노드가 있는지 확인 + var hasChild = false; + if(node.hasChildNodes()) hasChild = true; + + // nextSibling가 있는지 확인 + var hasNextSibling = false; + if(i==parent_node.childNodes.length-1) hasNextSibling = true; + + // 후에 사용하기 위해 node_info_list에 node_srl을 값으로 하여 node object 추가 + node_info_list[menu_id][node_srl] = node; + + // zone_id 값을 세팅 + var zone_id = "menu_"+menu_id+"_"+node_srl; + tree_menu_folder_list[menu_id][tree_menu_folder_list[menu_id].length] = zone_id; + + // url을 확인하여 현재의 url과 동일하다고 판단되면 manual_select_node_srl 에 값을 추가 (관리자페이지일 경우는 무시함) + if(node_callback_func[menu_id] == moveTreeMenu && url && current_url.getQuery('mid') == url) manual_select_node_srl = node_srl; + + // manual_select_node_srl이 node_srl과 같으면 펼침으로 처리 + if(manual_select_node_srl == node_srl) expand = "Y"; + + // 아이콘 설정 + var line_icon = null; + var folder_icon = null; + + // 자식 노드가 있을 경우 자식 노드의 html을 구해옴 + var child_output = null; + var child_html = ""; + if(hasChild) { + // 자식 노드의 zone id를 세팅 + var child_zone_id = zone_id+"_child"; + tree_menu_folder_list[menu_id][tree_menu_folder_list[menu_id].length] = child_zone_id; + + // html을 받아옴 + child_output = drawNode(node, menu_id); + var chtml = child_output.html; + var cexpand = child_output.expand; + if(cexpand == "Y") expand = "Y"; + + // 무조건 펼침이 아닐 경우 + if(expand!="Y") { + if(!hasNextSibling) child_html += ''; + else child_html += ''; + // 무조건 펼침일 경우 + } else { + if(!hasNextSibling) child_html += '
'+chtml+'
'; + else child_html += '
'+chtml+'
'; + } + } + + // 자식 노드가 있는지 확인하여 있으면 아이콘을 바꿈 + if(hasChild) { + // 무조건 펼침이 아닐 경우 + if(expand != "Y") { + if(!hasNextSibling) { + line_icon = "plus"; + folder_icon = "page"; + } else { + line_icon = "plusbottom"; + folder_icon = "page"; + } + // 무조건 펼침일 경우 + } else { + if(!hasNextSibling) { + line_icon = "minus"; + folder_icon = "page"; + } else { + line_icon = "minusbottom"; + folder_icon = "page"; + } + } + + // 자식 노드가 없을 경우 + } else { + if(hasNextSibling) { + line_icon = "joinbottom"; + folder_icon = "page"; + } else { + line_icon = "join"; + folder_icon = "page"; + } + } + + + // html 작성 + html += '
'; + + if(hasChild) html+= ''; + else html+= ''; + + html += 'linefolder'; + + var chk_enable = xGetElementById(menu_id+"_enable_move"); + if(chk_enable) { + html += ''; + } else { + html += ''; + } + + html += text+''; + + html += child_html; + + html += '
'; + + output.html += html; + + if(expand=="Y") output.expand = "Y"; + } + return output; +} + +// 관리자 모드일 경우 *_enable_move 의 값에 따라 메뉴 이동을 시키거나 정보를 보여주도록 변경 +function doNodeFunc(obj, menu_id, node_srl, zone_id) { + var chk_enable = xGetElementById(menu_id+"_enable_move"); + if(!chk_enable || chk_enable.checked!=true || !obj) { + selectNode(menu_id,node_srl,zone_id); + return; + } + + deSelectNode(); + tree_drag_enable(obj,tree_drag_start,tree_drag,tree_drag_end); +} + +// 수동으로 메뉴를 선택하도록 함 +function manualSelectNode(menu_id, node_srl) { + var zone_id = "menu_"+menu_id+"_"+node_srl; + selectNode(menu_id,node_srl,zone_id,false); + return; +} + +// 노드의 폴더 아이콘 클릭시 +function toggleFolder(zone_id) { + // 아이콘을 클릭한 대상을 찾아봄 + var child_zone = xGetElementById(zone_id+"_child"); + if(!child_zone) return; + + // 대상의 아이콘들 찾음 + var line_icon = xGetElementById(zone_id+'_line_icon'); + var folder_icon = xGetElementById(zone_id+'_folder_icon'); + + var height = 0; + + // 대상의 자식 노드들이 숨겨져 있다면 열고 아니면 닫기 + if(child_zone.style.display == "block") { + height = xHeight(child_zone)*-1; + child_zone.style.display = "none"; + if(line_icon.src.indexOf('bottom')>0) line_icon.src = tree_plus_bottom_icon.src; + else line_icon.src = tree_plus_icon.src; + folder_icon.src = tree_folder_icon.src; + } else { + if(line_icon.src.indexOf('bottom')>0) line_icon.src = tree_minus_bottom_icon.src; + else line_icon.src = tree_minus_icon.src; + folder_icon.src = tree_open_folder_icon.src; + child_zone.style.display = "block"; + height = xHeight(child_zone); + } + if(typeof(fixAdminLayoutFooter)=='function') fixAdminLayoutFooter( height ); +} + +// 노드의 글자 선택시 +var prev_selected_node = null; +function selectNode(menu_id, node_srl, zone_id, move_url) { + // 선택된 노드를 찾아봄 + var node_zone = xGetElementById(zone_id+'_node'); + if(!node_zone) return; + + // 이전에 선택된 노드가 있었다면 원래데로 돌림 + if(prev_selected_node) { + var prev_zone = xGetElementById(prev_selected_node.id); + if(prev_zone) { + prev_zone.style.backgroundColor = "#ffffff"; + prev_zone.style.fontWeight = "normal"; + prev_zone.style.color = "#000000"; + } + } + + // 선택된 노드의 글자를 변경 + prev_selected_node = node_zone; + node_zone.style.backgroundColor = "#0e078f"; + node_zone.style.fontWeight = "bold"; + node_zone.style.color = "#FFFFFF"; + + // 함수 실행 + if(typeof(move_url)=="undefined"||move_url==true) { + var func = node_callback_func[menu_id]; + func(menu_id, node_info_list[menu_id][node_srl]); + //toggleFolder(zone_id); + } +} + +// 선택된 노드의 표시를 없앰 +function deSelectNode() { + // 이전에 선택된 노드가 있었다면 원래데로 돌림 + if(!prev_selected_node) return; + prev_selected_node.style.backgroundColor = "#ffffff"; + prev_selected_node.style.fontWeight = "normal"; + prev_selected_node.style.color = "#000000"; +} + + +// 모두 닫기 +function closeAllTreeMenu(menu_id) { + for(var i in tree_menu_folder_list[menu_id]) { + var zone_id = tree_menu_folder_list[menu_id][i]; + var zone = xGetElementById(zone_id); + if(!zone) continue; + var child_zone = xGetElementById(zone_id+"_child"); + if(!child_zone) continue; + + child_zone.style.display = "block"; + toggleFolder(zone_id); + } +} + +// 모두 열기 +function openAllTreeMenu(menu_id) { + for(var i in tree_menu_folder_list[menu_id]) { + var zone_id = tree_menu_folder_list[menu_id][i]; + var zone = xGetElementById(zone_id); + if(!zone) continue; + var child_zone = xGetElementById(zone_id+"_child"); + if(!child_zone) continue; + + child_zone.style.display = "none"; + toggleFolder(zone_id); + } +} + +// 메뉴 클릭시 기본으로 동작할 함수 (사용자 임의 함수로 대체될 수 있음) +function moveTreeMenu(menu_id, node) { + // url과 open_window값을 구함 + var node_srl = node.getAttribute("node_srl"); + var url = node.getAttribute("url"); + var open_window = node.getAttribute("open_window"); + var hasChild = false; + if(node.hasChildNodes()) hasChild = true; + + // url이 없고 child가 있으면 해당 폴더 토글한다 + if(!url && hasChild) { + var zone_id = "menu_"+menu_id+"_"+node_srl; + toggleFolder(zone_id); + return; + } + + // url이 있으면 url을 분석한다 (제로보드 특화된 부분. url이 http나 ftp등으로 시작하면 그냥 해당 url 열기) + if(url) { + // http, ftp등의 연결이 아닌 경우 제로보드용으로 처리 + if(url.indexOf('://')==-1) url = "./?"+url; + + // open_window에 따라서 처리 + if(open_window != "Y") location.href=url; + else { + var win = window.open(url); + win.focus(); + } + } +} + +// 메뉴 드래그 중이라는 상황을 간직할 변수 +var tree_drag_manager = {obj:null, isDrag:false} +var tree_tmp_object = new Array(); +var tree_disappear = 0; + +/** + * 메뉴 드래깅을 위한 함수들 + **/ +// 드래깅시 보여줄 임시 object를 생성하는 함수 +function tree_create_tmp_object(obj) { + var tmp_obj = tree_tmp_object[obj.id]; + if(tmp_obj) return tmp_obj; + + tmp_obj = xCreateElement('DIV'); + tmp_obj.id = obj.id + '_tmp'; + tmp_obj.style.display = 'none'; + tmp_obj.style.position = 'absolute'; + tmp_obj.style.backgroundColor = obj.style.backgroundColor; + tmp_obj.style.fontSize = obj.style.fontSize; + tmp_obj.style.fontFamlily = obj.style.fontFamlily; + tmp_obj.style.color = "#5277ff"; + tmp_obj.style.opacity = 1; + tmp_obj.style.filter = 'alpha(opacity=100)'; + + document.body.appendChild(tmp_obj); + tree_tmp_object[obj.id] = tmp_obj; + return tmp_obj; +} + +// 기생성된 임시 object를 찾아서 return, 없으면 만들어서 return +function tree_get_tmp_object(obj) { + var tmp_obj = tree_tmp_object[obj.id]; + if(!tmp_obj) tmp_obj = tree_create_tmp_object(obj); + return tmp_obj; +} + +// 메뉴에 마우스 클릭이 일어난 시점에 드래그를 위한 제일 첫 동작 (해당 object에 각종 함수나 상태변수 설정) +function tree_drag_enable(child_obj, funcDragStart, funcDrag, funcDragEnd) { + // 클릭이 일어난 메뉴의 상위 object를 찾음 + var obj = child_obj.parentNode.parentNode; + + // 상위 object에 드래그 가능하다는 상태와 각 드래그 관련 함수를 설정 + obj.draggable = true; + obj.drag_start = funcDragStart; + obj.drag = funcDrag; + obj.drag_end = funcDragEnd; + obj.target_id = null; + + // 드래그 가능하지 않다면 드래그 가능하도록 상태 지정하고 mousemove이벤트 등록 + if (!tree_drag_manager.isDrag) { + tree_drag_manager.isDrag = true; + xAddEventListener(document, 'mousemove', tree_drag_mouse_move, false); + } + + // mousedown이벤트 값을 지정 + xAddEventListener(obj, 'mousedown', tree_mouse_down, false); +} + +// 드래그를 시작할때 호출되는 함수 (이동되는 형태를 보여주기 위한 작업을 함) +function tree_drag_start(tobj, px, py) { + var obj = tree_get_tmp_object(tobj); + + xInnerHtml(obj, xInnerHtml(tobj)); + + tobj.source_color = tobj.style.color; + tobj.style.color = "#BBBBBB"; + + xLeft(obj, xPageX(tobj)); + xTop(obj, xPageY(tobj)); + xWidth(obj, xWidth(tobj)); + xHeight(obj, xHeight(tobj)); + + xDisplay(obj, 'block'); +} + +// 드래그 시작후 마우스를 이동할때 발생되는 이벤트에 의해 실행되는 함수 +function tree_drag(tobj, dx, dy) { + var obj = tree_get_tmp_object(tobj); + xLeft(obj, parseInt(xPageX(obj),10) + parseInt(dx,10)); + xTop(obj, parseInt(xPageY(obj),10) + parseInt(dy,10)); + + var menu_id = tobj.id.replace(/menu_/,''); + menu_id = menu_id.replace(/_([0-9]+)$/,''); + if(!menu_id) return; + + for(var node_srl in node_info_list[menu_id]) { + var zone_id = "menu_"+menu_id+"_"+node_srl; + var target_obj = xGetElementById(zone_id); + + var hh = parseInt(xHeight(target_obj),10); + var h = parseInt(parseInt(xHeight(target_obj),10)/2,10); + + var l = xPageX(target_obj); + var t = xPageY(target_obj); + var ll = parseInt(l,10) + parseInt(xWidth(target_obj),10); + var tt = parseInt(t,10) + hh; + + if( tobj != target_obj && tobj.xDPX >= l && tobj.xDPX <= ll) { + if(tobj.xDPY >= t && tobj.xDPY < tt-h) { + try { + target_obj.parentNode.insertBefore(tobj, target_obj); + tobj.target_id = target_obj.id; + } catch(e) { + } + } + } + } +} + +// 드래그 종료 (이동되는 object가 이동할 곳에 서서히 이동되는 것처럼 보이는 효과) +function tree_drag_end(tobj, px, py) { + var obj = tree_get_tmp_object(tobj); + tree_disappear = tree_disapear_object(obj, tobj); + tree_drag_disable(tobj.id); +} + +// 스르르 사라지게 함;; +function tree_disapear_object(obj, tobj) { + var it = 150; + var ib = 15; + + var x = parseInt(xPageX(obj),10); + var y = parseInt(xPageY(obj),10); + var ldt = (x - parseInt(xPageX(tobj),10)) / ib; + var tdt = (y - parseInt(xPageY(tobj),10)) / ib; + + return setInterval(function() { + if(ib < 1) { + clearInterval(tree_disappear); + xInnerHtml(tobj,xInnerHtml(obj)); + xInnerHtml(obj,''); + xDisplay(obj, 'none'); + return; + } + ib -= 5; + x-=ldt; + y-=tdt; + xLeft(obj, x); + xTop(obj, y); + }, it/ib); +} + +// 마우스다운 이벤트 발생시 호출됨 +function tree_mouse_down(e) { + var evt = new xEvent(e); + var obj = evt.target; + + while(obj && !obj.draggable) { + obj = xParent(obj, true); + } + + if(obj) { + xPreventDefault(e); + obj.xDPX = evt.pageX; + obj.xDPY = evt.pageY; + tree_drag_manager.obj = obj; + xAddEventListener(document, 'mouseup', tree_mouse_up, false); + if (obj.drag_start) obj.drag_start(obj, evt.pageX, evt.pageY); + } +} + +// 마우스 버튼을 놓았을때 동작될 함수 (각종 이벤트 해제 및 변수 설정 초기화) +function tree_mouse_up(e) { + if (tree_drag_manager.obj) { + xPreventDefault(e); + xRemoveEventListener(document, 'mouseup', tree_mouse_up, false); + + if (tree_drag_manager.obj.drag_end) { + var evt = new xEvent(e); + tree_drag_manager.obj.drag_end(tree_drag_manager.obj, evt.pageX, evt.pageY); + } + + tree_drag_manager.obj = null; + tree_drag_manager.isDrag = false; + } +} + +// 드래그할때의 object이동등을 담당 +function tree_drag_mouse_move(e) { + var evt = new xEvent(e); + + if (tree_drag_manager.obj) { + xPreventDefault(e); + + var obj = tree_drag_manager.obj; + var dx = evt.pageX - obj.xDPX; + var dy = evt.pageY - obj.xDPY; + + obj.xDPX = evt.pageX; + obj.xDPY = evt.pageY; + + if (obj.drag) { + obj.drag(obj, dx, dy); + } else { + xMoveTo(obj, xLeft(obj) + dx, xTop(obj) + dy); + } + } +} + +// 해당 object 에 더 이상 drag가 되지 않도록 설정 +function tree_drag_disable(id) { + if (!tree_drag_manager) return; + var obj = xGetElementById(id); + obj.draggable = false; + obj.drag_start = null; + obj.drag = null; + obj.drag_end = null; + obj.style.color = obj.source_color; + + xRemoveEventListener(obj, 'mousedown', tree_mouse_down, false); + + if(obj.id && obj.target_id && obj.id!=obj.target_id) { + var menu_id = obj.id.replace(/menu_/,''); + menu_id = menu_id.replace(/_([0-9]+)$/,''); + if(menu_id) { + var callback_move_func = node_move_callback_func[menu_id]; + if(callback_move_func) callback_move_func(menu_id, obj.id, obj.target_id); + } + } + obj.target_id = null; +} diff --git a/common/js/x.js b/common/js/x.js new file mode 100644 index 000000000..dc2f90356 --- /dev/null +++ b/common/js/x.js @@ -0,0 +1,621 @@ +/** + * x.js compiled from X 4.0 with XC 0.27b. + * Distributed by GNU LGPL. For copyrights, license, documentation and more visit Cross-Browser.com + * Copyright 2001-2005 Michael Foster (Cross-Browser.com) + **/ + +var xOp7Up,xOp6Dn,xIE4Up,xIE4,xIE5,xIE6,xNN4,xUA=navigator.userAgent.toLowerCase(); +if(window.opera){ + var i=xUA.indexOf('opera'); + if(i!=-1){ + var v=parseInt(xUA.charAt(i+6)); + xOp7Up=v>=7; + xOp6Dn=v<7; + } +} +else if(navigator.vendor!='KDE' && document.all && xUA.indexOf('msie')!=-1){ + xIE4Up=parseFloat(navigator.appVersion)>=4; + xIE4=xUA.indexOf('msie 4')!=-1; + xIE5=xUA.indexOf('msie 5')!=-1; + xIE6=xUA.indexOf('msie 6')!=-1; +} +else if(document.layers){xNN4=true;} +var xMac=xUA.indexOf('mac')!=-1; + +// (element, event(without 'on'), event listener(function name)[, caption]) +function xAddEventListener(e,eT,eL,cap) +{ + if(!(e=xGetElementById(e))) return; + eT=eT.toLowerCase(); + if((!xIE4Up && !xOp7Up) && e==window) { + if(eT=='resize') { window.xPCW=xClientWidth(); window.xPCH=xClientHeight(); window.xREL=eL; xResizeEvent(); return; } + if(eT=='scroll') { window.xPSL=xScrollLeft(); window.xPST=xScrollTop(); window.xSEL=eL; xScrollEvent(); return; } + } + var eh='e.on'+eT+'=eL'; + if(e.addEventListener) e.addEventListener(eT,eL,cap); + else if(e.attachEvent) e.attachEvent('on'+eT,eL); + else eval(eh); +} +// called only from the above +function xResizeEvent() +{ + if (window.xREL) setTimeout('xResizeEvent()', 250); + var cw = xClientWidth(), ch = xClientHeight(); + if (window.xPCW != cw || window.xPCH != ch) { window.xPCW = cw; window.xPCH = ch; if (window.xREL) window.xREL(); } +} + +function xScrollEvent() +{ + if (window.xSEL) setTimeout('xScrollEvent()', 250); + var sl = xScrollLeft(), st = xScrollTop(); + if (window.xPSL != sl || window.xPST != st) { window.xPSL = sl; window.xPST = st; if (window.xSEL) window.xSEL(); } +} + +function xAppendChild(oParent, oChild) +{ + if (oParent.appendChild) return oParent.appendChild(oChild); + else return null; +} + +function xClientHeight() +{ + var h=0; + if(xOp6Dn) h=window.innerHeight; + else if(document.compatMode == 'CSS1Compat' && !window.opera && document.documentElement && document.documentElement.clientHeight) + h=document.documentElement.clientHeight; + else if(document.body && document.body.clientHeight) + h=document.body.clientHeight; + else if(xDef(window.innerWidth,window.innerHeight,document.width)) { + h=window.innerHeight; + if(document.width>window.innerWidth) h-=16; + } + return h; +} + +function xClientWidth() +{ + var w=0; + if(xOp6Dn) w=window.innerWidth; + else if(document.compatMode == 'CSS1Compat' && !window.opera && document.documentElement && document.documentElement.clientWidth) + w=document.documentElement.clientWidth; + else if(document.body && document.body.clientWidth) + w=document.body.clientWidth; + else if(xDef(window.innerWidth,window.innerHeight,document.height)) { + w=window.innerWidth; + if(document.height>window.innerHeight) w-=16; + } + return w; +} + +function xCreateElement(sTag) +{ + if (document.createElement) return document.createElement(sTag); + else return null; +} + +function xDef() +{ + for(var i=0; i 0) { + var offset = document.cookie.indexOf(search); + if (offset != -1) { + offset += search.length; + var end = document.cookie.indexOf(";", offset); + if (end == -1) end = document.cookie.length; + value = unescape(document.cookie.substring(offset, end)); + } + } + return value; +} + +function xGetElementById(e) +{ + if(typeof(e)!='string') return e; + if(document.getElementById) e=document.getElementById(e); + else if(document.all) e=document.all[e]; + else e=null; + return e; +} + +function xGetElementsByAttribute(sTag, sAtt, sRE, fn) +{ + var a, list, found = new Array(), re = new RegExp(sRE, 'i'); + list = xGetElementsByTagName(sTag); + for (var i = 0; i < list.length; ++i) { + a = list[i].getAttribute(sAtt); + if (!a) {a = list[i][sAtt];} + if (typeof(a)=='string' && a.search(re) != -1) { + found[found.length] = list[i]; + if (fn) fn(list[i]); + } + } + return found; +} + +function xGetElementsByClassName(c,p,t,f) +{ + var found = new Array(); + var re = new RegExp('\\b'+c+'\\b', 'i'); + var list = xGetElementsByTagName(t, p); + for (var i = 0; i < list.length; ++i) { + if (list[i].className && list[i].className.search(re) != -1) { + found[found.length] = list[i]; + if (f) f(list[i]); + } + } + return found; +} + +function xGetElementsByTagName(t,p) +{ + var list = null; + t = t || '*'; + p = p || document; + if (xIE4 || xIE5) { + if (t == '*') list = p.all; + else list = p.all.tags(t); + } + else if (p.getElementsByTagName) list = p.getElementsByTagName(t); + return list || new Array(); +} + +function xGetURLArguments() +{ + var idx = location.href.indexOf('?'); + var params = new Array(); + if (idx != -1) { + var pairs = location.href.substring(idx+1, location.href.length).split('&'); + for (var i=0; i=0) { + var pt=0,pb=0,bt=0,bb=0; + if (document.compatMode=='CSS1Compat') { + var gcs = xGetComputedStyle; + pt=gcs(e,'padding-top',1); + if (pt !== null) { + pb=gcs(e,'padding-bottom',1); + bt=gcs(e,'border-top-width',1); + bb=gcs(e,'border-bottom-width',1); + } + // Should we try this as a last resort? + // At this point getComputedStyle and currentStyle do not exist. + else if(xDef(e.offsetHeight,e.style.height)){ + e.style.height=h+'px'; + pt=e.offsetHeight-h; + } + } + h-=(pt+pb+bt+bb); + if(isNaN(h)||h<0) return null; + else e.style.height=h+'px'; + } + h=e.offsetHeight; + } + else if(css && xDef(e.style.pixelHeight)) { + if(h>=0) e.style.pixelHeight=h; + h=e.style.pixelHeight; + } + return h; +} + +function xHex(sn, digits, prefix) +{ + var p = ''; + var n = Math.ceil(sn); + if (prefix) p = prefix; + n = n.toString(16); + for (var i=0; i < digits - n.length; ++i) { + p += '0'; + } + return p + n; +} + +function xHide(e){return xVisibility(e,0);} + +function xInnerHtml(e,h) +{ + if(!(e=xGetElementById(e)) || !xStr(e.innerHTML)) return null; + var s = e.innerHTML; + if (xStr(h)) {e.innerHTML = h;} + return s; +} + +function xLeft(e, iX) +{ + if(!(e=xGetElementById(e))) return 0; + var css=xDef(e.style); + if (css && xStr(e.style.left)) { + if(xNum(iX)) e.style.left=iX+'px'; + else { + iX=parseInt(e.style.left); + if(isNaN(iX)) iX=0; + } + } + else if(css && xDef(e.style.pixelLeft)) { + if(xNum(iX)) e.style.pixelLeft=iX; + else iX=e.style.pixelLeft; + } + return iX; +} + +function xMoveTo(e,x,y) +{ + xLeft(e,x); + xTop(e,y); +} + +function xName(e) +{ + if (!e) return e; + else if (e.id && e.id != "") return e.id; + else if (e.name && e.name != "") return e.name; + else if (e.nodeName && e.nodeName != "") return e.nodeName; + else if (e.tagName && e.tagName != "") return e.tagName; + else return e; +} + +function xNextSib(e,t) +{ + var s = e ? e.nextSibling : null; + if (t) while (s && s.nodeName != t) { s = s.nextSibling; } + else while (s && s.nodeType != 1) { s = s.nextSibling; } + return s; +} + +function xNum() +{ + for(var i=0; i=0) { + var pl=0,pr=0,bl=0,br=0; + if (document.compatMode=='CSS1Compat') { + var gcs = xGetComputedStyle; + pl=gcs(e,'padding-left',1); + if (pl !== null) { + pr=gcs(e,'padding-right',1); + bl=gcs(e,'border-left-width',1); + br=gcs(e,'border-right-width',1); + } + // Should we try this as a last resort? + // At this point getComputedStyle and currentStyle do not exist. + else if(xDef(e.offsetWidth,e.style.width)){ + e.style.width=w+'px'; + pl=e.offsetWidth-w; + } + } + w-=(pl+pr+bl+br); + if(isNaN(w)||w<0) return null; + else e.style.width=w+'px'; + } + w=e.offsetWidth; + } + else if(css && xDef(e.style.pixelWidth)) { + if(w>=0) e.style.pixelWidth=w; + w=e.style.pixelWidth; + } + return w; +} + +function xZIndex(e,uZ) +{ + if(!(e=xGetElementById(e))) return 0; + if(e.style && xDef(e.style.zIndex)) { + if(xNum(uZ)) e.style.zIndex=uZ; + uZ=parseInt(e.style.zIndex); + } + return uZ; +} + +function xStopPropagation(evt) +{ + if (evt && evt.stopPropagation) evt.stopPropagation(); + else if (window.event) window.event.cancelBubble = true; +} + diff --git a/common/js/xml_handler.js b/common/js/xml_handler.js new file mode 100644 index 000000000..3c628cf00 --- /dev/null +++ b/common/js/xml_handler.js @@ -0,0 +1,147 @@ +/** + * @file common/js/xml_handler.js + * @author zero + * @brief zbxe내에서 ajax기능을 이용함에 있어 module, act를 잘 사용하기 위한 자바스크립트 + **/ + +// xml handler을 이용하는 user function +var show_waiting_message = true; +function exec_xml(module, act, params, callback_func, response_tags, callback_func_arg, fo_obj) { + var oXml = new xml_handler(); + oXml.reset(); + for(var key in params) { + var val = params[key]; + oXml.addParam(key, val); + } + oXml.addParam("module", module); + oXml.addParam("act", act); + + if(typeof(response_tags)=="undefined" || response_tags.length<1) response_tags = new Array('error','message'); + + var waiting_obj = xGetElementById("waitingforserverresponse"); + if(show_waiting_message && waiting_obj) { + xInnerHtml(waiting_obj, wating_message); + xTop(waiting_obj, xScrollTop()+20); + xLeft(waiting_obj, xScrollLeft()+20); + waiting_obj.style.visibility = "visible"; + } + oXml.request(xml_response_filter, oXml, callback_func, response_tags, callback_func_arg, fo_obj); +} + +// 결과 처리 후 callback_func에 넘겨줌 +function xml_response_filter(oXml, callback_func, response_tags, callback_func_arg, fo_obj) { + var xmlDoc = oXml.getResponseXml(); + if(!xmlDoc) return null; + + var waiting_obj = xGetElementById("waitingforserverresponse"); + waiting_obj.style.visibility = "hidden"; + xInnerHtml(waiting_obj, ''); + + var ret_obj = oXml.toZMsgObject(xmlDoc, response_tags); + if(ret_obj["error"]!=0) { + alert(ret_obj["message"]); + return null; + } + + if(!callback_func) return null; + + callback_func(ret_obj, response_tags, callback_func_arg, fo_obj); + + return null; +} + +// xml handler +function xml_handler() { + this.obj_xmlHttp = null; + this.method_name = null; + this.xml_path = request_uri+"index.php"; + + this.params = new Array(); + + this.reset = xml_handlerReset; + this.getXmlHttp = zGetXmlHttp; + this.request = xml_handlerRequest; + this.setPath = xml_handlerSetPath; + this.addParam = xml_handlerAddParam; + this.getResponseXml = xml_handlerGetResponseXML; + this.toZMsgObject = xml_handlerToZMsgObject; + + this.obj_xmlHttp = this.getXmlHttp(); +} + +function zGetXmlHttp() { + if (window.XMLHttpRequest) return new XMLHttpRequest(); + else if (window.ActiveXObject) { + try { + return new ActiveXObject("Msxml2.XMLHTTP"); + } catch (e) { + return new ActiveXObject("Microsoft.XMLHTTP"); + } + } + return null; +} + +function xml_handlerRequest(callBackFunc, xmlObj, callBackFunc2, response_tags, callback_func_arg, fo_obj) { + var rd = ""; + rd += "\n" + + "\n" + + "\n" + + for (var key in this.params) { + var val = this.params[key]; + rd += "<"+key+">\n"; + } + + rd += "\n" + + "\n"; + + if(this.obj_xmlHttp.readyState!=0) { + this.obj_xmlHttp.abort(); + this.obj_xmlHttp = this.getXmlHttp(); + } + this.obj_xmlHttp.onreadystatechange = function () {callBackFunc(xmlObj, callBackFunc2, response_tags, callback_func_arg, fo_obj)}; + this.obj_xmlHttp.open("POST", this.xml_path, true); + this.obj_xmlHttp.send(rd); +} + +function xml_handlerSetPath(path) { + this.xml_path = "./"+path; +} + + +function xml_handlerReset() { + this.obj_xmlHttp = this.getXmlHttp(); + this.params = new Array(); +} + +function xml_handlerAddParam(key, val) { + this.params[key] = val; +} + +function xml_handlerGetResponseXML() { + if(this.obj_xmlHttp && this.obj_xmlHttp.readyState == 4 && isDef(this.obj_xmlHttp.responseXML)) { + var xmlDoc = this.obj_xmlHttp.responseXML; + this.reset(); + return xmlDoc; + } + return null; +} + +function xml_handlerToZMsgObject(xmlDoc, tags) { + if(!xmlDoc) return null; + if(!tags) tags = new Array("error","message"); + tags[tags.length] = "redirect_url"; + tags[tags.length] = "act"; + + var obj_ret = new Array(); + for(var i=0; i0) type = obj[0].type; + else length = 0; + + switch(type) { + case 'checkbox' : + if(length>0) { + var value_list = new Array(); + for(var i=0;i0) { + for(var i=0;i=0) value = obj.options[obj.selectedIndex].value; + break; + default : + if(length>0 && target_type_list[target_name]) { + switch(target_type_list[target_name]) { + case 'kr_zip' : + var val1 = obj[0].value; + var val2 = obj[1].value; + if(val1&&val2) { + value = val1+'|@|'+val2; + } + break; + case 'tel' : + var val1 = obj[0].value; + var val2 = obj[1].value; + var val3 = obj[2].value; + if(val1&&val2&&val3) { + value = val1+'|@|'+val2+'|@|'+val3; + } + break; + } + + } else { + value = obj.value; + } + break; + } + + if(typeof(value)=='undefined'||!value) return ''; + return value.trim(); +} + +function XmlJsFilterExecuteFilter(filter, value) { + switch(filter) { + case "email" : + case "email_address" : + var regx = /^[_0-9a-zA-Z-]+(\.[_0-9a-zA-Z-]+)*@[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*$/; + return regx.test(value); + break; + case "userid" : + case "user_id" : + var regx = /^[a-zA-Z]+([_0-9a-zA-Z]+)*$/; + return regx.test(value); + break; + case "homepage" : + var regx = /^(http|https|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-\/\~]+)+(:[0-9]{2,4})*$/; + return regx.test(value); + break; + case "korean" : + var regx = /^[가-힣]*$/; + return regx.test(value); + break; + case "korean_number" : + var regx = /^[가-힣0-9]*$/; + return regx.test(value); + break; + case "alpha" : + var regx = /^[a-zA-Z]*$/; + return regx.test(value); + break; + case "alpha_number" : + var regx = /^[a-zA-Z0-9\_]*$/; + return regx.test(value); + break; + case "number" : + return !isNaN(value); + break; + } + + return null; +} + +function XmlJsFilterAlertMsg(target, msg_code, minlength, maxlength) { + var target_msg = ""; + + if(alertMsg[target]!='undefined') target_msg = alertMsg[target]; + else target_msg = target; + + var msg = ""; + if(typeof(alertMsg[msg_code])!='undefined') { + if(alertMsg[msg_code].indexOf('%s')>=0) msg = alertMsg[msg_code].replace('%s',target_msg); + else msg = target_msg+alertMsg[msg_code]; + } else { + msg = msg_code; + } + + if(typeof(minlength)!='undefined' && typeof(maxlength)!='undefined') msg += "("+minlength+"~"+maxlength+")"; + + alert(msg); + this.setFocus(target); + + return false; +} + +function XmlJsFilterCheckFieldItem() { + for(var i=0; i0 && maxlength>0 && (value.length < minlength || value.length > maxlength)) return this.alertMsg(target, 'outofrange', minlength, maxlength); + + if(equalto) { + var equalto_value = this.getValue(equalto); + if(equalto_value != value) return this.alertMsg(target, 'equalto'); + } + + if(filter.length && filter[0]) { + for(var j=0;jcmd_write = 'Write'; + $lang->cmd_reply = 'Reply'; + $lang->cmd_delete = 'Delete'; + $lang->cmd_modify = 'Modify'; + $lang->cmd_edit = 'Edit'; + $lang->cmd_view = 'View'; + $lang->cmd_view_all = 'View All'; + $lang->cmd_list = 'List'; + $lang->cmd_prev = 'Prev'; + $lang->cmd_next = 'Next'; + $lang->cmd_send_trackback = 'Send Trackback'; + $lang->cmd_registration = $lang->cmd_submit = 'Submit'; + $lang->cmd_comment_registration = 'Add Comment'; + $lang->cmd_insert = 'Insert'; + $lang->cmd_save = 'Save'; + $lang->cmd_input = 'Input'; + $lang->cmd_search = 'Search'; + $lang->cmd_cancel = 'Cancel'; + $lang->cmd_back = 'Go Back'; + $lang->cmd_vote = 'Vote'; + $lang->cmd_move = 'Move'; + $lang->cmd_move_up = 'Up'; + $lang->cmd_move_down = 'Down'; + $lang->cmd_add_indent = 'Indent'; + $lang->cmd_remove_indent = 'Outdent'; + $lang->cmd_management = 'Manage'; + $lang->cmd_make = 'Create'; + $lang->cmd_select = 'Select'; + $lang->cmd_select_all = 'Select All'; + $lang->cmd_unselect_all = 'Deselect All'; + $lang->cmd_close_all = 'Close All'; + $lang->cmd_open_all = 'Open All'; + $lang->cmd_reload = 'Reload'; + $lang->cmd_close = 'Close'; + $lang->cmd_open = 'Open'; + $lang->cmd_setup = 'Configure'; + $lang->cmd_option = 'Option'; + $lang->cmd_apply = 'Apply'; + $lang->cmd_open_calendar = 'Select a Date'; + $lang->cmd_send = 'Send'; + $lang->cmd_print = 'Print'; + $lang->cmd_scrap = 'Scrap'; + $lang->cmd_preview = 'Preview'; + $lang->cmd_reset = 'Reset'; + $lang->cmd_remake_cache = "Re-create cache file"; + + $lang->enable = 'Enable'; + $lang->disable = 'Disable'; + + // Essential Words + $lang->no = 'No.'; + $lang->notice = 'Notice'; + $lang->secret = 'Secret'; + $lang->category = 'Category'; + $lang->document_srl = 'Doc. No.'; + $lang->user_id = 'User ID'; + $lang->author = 'Developer'; + $lang->password = 'Password'; + $lang->password1 = 'Password'; + $lang->password2 = 'Confirm Password'; + $lang->admin_id = 'Admin ID'; + $lang->writer = 'Author'; + $lang->user_name = 'User Name'; + $lang->nick_name = 'Nick Name'; + $lang->email_address = 'Email'; + $lang->homepage = 'Homepage'; + $lang->blog = 'Blog'; + $lang->birthday = 'Birthdate'; + $lang->browser_title = 'Browser Title'; + $lang->title = 'Subject'; + $lang->title_content = 'Title+Content'; + $lang->content = 'Content'; + $lang->document = 'Article'; + $lang->comment = 'Comment'; + $lang->description = 'Description'; + $lang->trackback = 'Trackback'; + $lang->tag = 'Tag'; + $lang->allow_comment = 'Allow Comment'; + $lang->lock_comment = 'Block Comment'; + $lang->allow_trackback = 'Allow Trackback'; + $lang->uploaded_file = 'Attachment'; + $lang->grant = 'Permission'; + $lang->target = 'Target'; + $lang->total = 'Total'; + $lang->total_count = 'Count Total'; + $lang->ipaddress = 'IP Address'; + $lang->path = 'Path'; + $lang->cart = 'Selected Item'; + $lang->friend = 'Friends'; + $lang->notify = 'Notification'; + + $lang->mid = 'Module Name'; + $lang->layout = 'Layout'; + $lang->widget = 'Widget'; + $lang->module = 'Module'; + $lang->skin = 'Theme'; + $lang->colorset = 'Colorset'; + $lang->extra_vars = 'Extra Vars'; + + $lang->document_url = 'Entry URL'; + $lang->trackback_url = 'Trackback URL'; + $lang->blog_name = 'Blog Title'; + $lang->excerpt = 'Quotation'; + + $lang->document_count = 'Total Articles'; + $lang->page_count = 'Page Count'; + $lang->list_count = 'List Count'; + $lang->readed_count = 'Hit'; + $lang->voted_count = 'Votes'; + $lang->member_count = 'Member Count'; + $lang->date = 'Date'; + $lang->regdate = 'Registered Date'; + $lang->last_update = 'Latest Update'; + $lang->signup_date = 'Join Date'; + $lang->last_login = 'Latest Login'; + $lang->first_page = 'First Page'; + $lang->last_page = 'Last Page'; + $lang->search_target = 'Searching Target'; + $lang->search_keyword = 'Searching Keyword'; + $lang->is_default = 'Default'; + + $lang->no_documents = 'No Articles'; + + $lang->board_manager = 'Board Settings'; + $lang->member_manager = 'Member Settings'; + $lang->layout_manager = 'Layout Settings'; + + $lang->use = 'Use'; + $lang->notuse = 'Disuse'; + $lang->not_exists = "Does not exist"; + + $lang->unit_sec = 'sec'; + $lang->unit_min = 'min'; + $lang->unit_hour = 'hr'; + $lang->unit_day = 'day'; + $lang->unit_week = 'week'; + $lang->unit_month = 'month'; + $lang->unit_year = 'year'; + + // Descriptions + $lang->about_tag = 'You can submit multiple tags by inserting comma(,) between each tags'; + $lang->about_layout = 'Layouts decorate an appearance of your module. you could configure it from Layout menu on the top'; + + // Messages + $lang->msg_call_server = 'Requesting to the server, please wait'; + $lang->msg_db_not_setted = 'DB configuration has not been set'; + $lang->msg_invalid_queryid = 'Specified query ID value is invalid'; + $lang->msg_not_permitted = 'You are not permitted to continue'; + $lang->msg_input_password = 'Please enter your password'; + $lang->msg_invalid_document = 'Invalid Article Number'; + $lang->msg_invalid_request = 'Invalid Request'; + $lang->msg_invalid_password = 'Invalid Password'; + $lang->msg_error_occured = 'Error has occured'; + $lang->msg_not_founded = 'Target could not be found'; + $lang->msg_no_result = 'Nothing found'; + + $lang->msg_not_permitted_act = 'You are not permitted to execute requested action'; + $lang->msg_module_is_not_exists = 'Requested module could not be found'; + $lang->msg_module_is_not_standalone = 'Requested module cannot be executed independently'; + + $lang->success_registed = 'Registered successfully'; + $lang->success_updated = 'Updated successfully'; + $lang->success_deleted = 'Deleted successfully'; + $lang->success_voted = 'Voted successfully'; + $lang->success_moved = 'Moved successfully'; + $lang->success_sended = 'Sent successfully'; + $lang->success_reset = 'Reset successfully'; + $lang->success_leaved = 'Seceded successfully'; + + $lang->fail_to_delete = 'Could not be deleted'; + $lang->fail_to_move = 'Could not be moved'; + + $lang->failed_voted = 'Could not be voted'; + $lang->fail_to_delete_have_children = 'Please try again after removing replies first'; + + $lang->confirm_submit = 'Are you sure to submit?'; + $lang->confirm_logout = 'Are you sure to logout?'; + $lang->confirm_vote = 'Are you sure to vote?'; + $lang->confirm_delete = 'Are you sure to delete?'; + $lang->confirm_move = 'Are you sure to move?'; + $lang->confirm_reset = 'Are you sure to reset?'; + $lang->confirm_leave = 'Are you sure to leave?'; + + $lang->column_type = 'Column Type'; + $lang->column_type_list['text'] = 'one-line text'; + $lang->column_type_list['homepage'] = 'url'; + $lang->column_type_list['email_address'] = 'email'; + $lang->column_type_list['tel'] = 'phone number'; + $lang->column_type_list['textarea'] = 'multi-line textarea'; + $lang->column_type_list['checkbox'] = 'checkbox (multiple selection)'; + $lang->column_type_list['select'] = 'select box (single selection)'; + $lang->column_type_list['kr_zip'] = 'zip code (Korean)'; + $lang->column_type_list['date'] = 'date (yyyy/mm/dd)'; + //$lang->column_type_list['jp_zip'] = 'zip code (Japanese)'; + $lang->column_name = 'Column Name'; + $lang->column_title = 'Column Title'; + $lang->default_value = 'Default Value'; + $lang->is_active = 'Active'; + $lang->is_required = 'Required Field'; + + // Alert messages for Javascript using by XML filter + $lang->filter->isnull = 'Please input a value for %s'; + $lang->filter->outofrange = 'Please align the text length of %s'; + $lang->filter->equalto = "%s's value is invalid"; + $lang->filter->invalid_email = "%s's format is invalid. ex) zbxe@zeroboard.com"; + $lang->filter->invalid_user_id = $lang->filter->invalid_userid = "%s's format is invalid.\\nAll values should consist of alphabets, numbers or underscore(_) and the first letter should be English alphabet"; + $lang->filter->invalid_homepage = "%s's format is invalid. ex) http://www.zeroboard.com"; + $lang->filter->invalid_korean = "%s's format is invalid. Please input only Korean"; + $lang->filter->invalid_korean_number = "%s's format is invalid. Please input Korean or numbers"; + $lang->filter->invalid_alpha = "%s's format is invalid. Please input only alphabets"; + $lang->filter->invalid_alpha_number = "%s's format is invalid. Please input alphabets or numbers"; + $lang->filter->invalid_number = "%s's format is invalid. Please input only numbers"; +?> diff --git a/common/lang/es.lang.php b/common/lang/es.lang.php new file mode 100644 index 000000000..65e4023da --- /dev/null +++ b/common/lang/es.lang.php @@ -0,0 +1,220 @@ +cmd_write = 'Escribir'; + $lang->cmd_reply = 'Contestación'; + $lang->cmd_delete = 'Cancelación'; + $lang->cmd_modify = 'Modificar'; + $lang->cmd_edit = 'Corregir'; + $lang->cmd_view = 'Ver'; + $lang->cmd_view_all = 'Ver Toda'; + $lang->cmd_list = 'List'; + $lang->cmd_prev = 'Prev'; + $lang->cmd_next = 'Adelante'; + $lang->cmd_send_trackback = 'Enviar Trackback'; + $lang->cmd_registration = $lang->cmd_submit = 'Someter'; + $lang->cmd_comment_registration = 'Agregar El Commentario'; + $lang->cmd_insert = 'Insertar'; + $lang->cmd_save = 'Guardar'; + $lang->cmd_input = 'Entrdada'; + $lang->cmd_search = 'Búsqueda'; + $lang->cmd_cancel = 'Cancelar'; + $lang->cmd_back = 'Ir Detrás'; + $lang->cmd_vote = 'Votar'; + $lang->cmd_move = 'Mover'; + $lang->cmd_move_up = 'Arriba'; + $lang->cmd_move_down = 'Abajo'; + $lang->cmd_add_indent = 'Agregar Pedido'; + $lang->cmd_remove_indent = 'Eliminar Pedido'; + $lang->cmd_management = 'Manejar'; + $lang->cmd_make = 'Crear'; + $lang->cmd_select = 'Seleccionar'; + $lang->cmd_select_all = 'Seleccionar Todos'; + $lang->cmd_unselect_all = 'Deseleccionar Todos'; + $lang->cmd_close_all = 'Cerrar Todos'; + $lang->cmd_open_all = 'Abrir Todos'; + $lang->cmd_reload = 'Actualizar'; + $lang->cmd_close = 'Cerrar'; + $lang->cmd_open = 'Abrir'; + $lang->cmd_setup = 'Configuración'; + $lang->cmd_option = 'Opción'; + $lang->cmd_apply = 'Applicar'; + $lang->cmd_open_calendar = 'Seleccionar la fecha'; + $lang->cmd_send = 'Enviar'; + $lang->cmd_print = 'Print'; + $lang->cmd_scrap = 'Scrap'; + $lang->cmd_preview = 'Preview'; + $lang->cmd_reset = 'Reset'; + + $lang->enable = 'Enable'; + $lang->disable = 'Disable'; + + // Essencial Words + $lang->no = 'No'; + $lang->notice = 'Aviso'; + $lang->secret = 'Secreto'; + $lang->category = 'Categoría'; + $lang->document_srl = 'Doc.Num'; + $lang->user_id = 'Usuario'; + $lang->author = 'Autor'; + $lang->password = 'Contraseña'; + $lang->password1 = 'Contraseña'; + $lang->password2 = 'Confirmar la Contraseña'; + $lang->admin_id = 'Identificación Del Admin'; + $lang->writer = 'Escritor'; + $lang->user_name = 'Nombre Del Usuario'; + $lang->nick_name = 'Nombre De la Mella'; + $lang->email_address = 'Correo Electrónico'; + $lang->homepage = 'Página web'; + $lang->blog = 'Blog'; + $lang->birthday = 'Fecha de Nacimiento'; + $lang->browser_title = 'Título del navegador'; + $lang->title = 'Título'; + $lang->title_content = 'Título+Contenido'; + $lang->content = 'Contenido'; + $lang->document = 'Entrada'; + $lang->comment = 'Commentario'; + $lang->description = 'Descripción'; + $lang->trackback = 'Trackback'; + $lang->tag = 'Etiqueta'; + $lang->allow_comment = 'Permitir Commentarios'; + $lang->lock_comment = 'Cerrar Commentarios'; + $lang->allow_trackback = 'Permitir Trackback'; + $lang->uploaded_file = 'Ajuntos'; + $lang->grant = 'Autoridad'; + $lang->target = 'Objetivo'; + $lang->total = 'Total'; + $lang->total_count = 'Visitos en Total'; + $lang->ipaddress = 'Dirección IP'; + $lang->path = 'Paso'; + $lang->cart = 'Artículo Selecciónado'; + $lang->friend = 'Amigos'; + $lang->notify = 'Notify'; + + $lang->mid = 'Module Name'; + $lang->layout = 'Layout'; + $lang->widget = 'Widget'; + $lang->module = 'Módulo'; + $lang->skin = 'Tema'; + $lang->colorset = 'Colección de colores'; + $lang->extra_vars = 'Variables Extra'; + + $lang->document_url = 'Entrada URL'; + $lang->trackback_url = 'Trackback URL'; + $lang->blog_name = 'Titulo del Blog'; + $lang->excerpt = 'Quotación'; + + $lang->document_count = 'Numeros de la Entradas'; + $lang->page_count = 'Cuentas de las Pagínas'; + $lang->list_count = 'Cuentas del Listos'; + $lang->readed_count = 'Cuentas Referidos'; + $lang->voted_count = 'Cuentas Votadas'; + $lang->member_count = 'Cuentas de Miembros'; + $lang->date = 'Fecha'; + $lang->regdate = 'Fecha Publicado'; + $lang->last_update = 'Última actualización'; + $lang->signup_date = 'Fecha Inscribido'; + $lang->last_login = 'Último Entrada'; + $lang->first_page = 'Primera Pagína'; + $lang->last_page = 'Última Pagína'; + $lang->search_target = 'Buscando Objectivo'; + $lang->search_keyword = 'Buscando Palabra Clave'; + $lang->is_default = 'Prefijado'; + + $lang->no_documents = 'No Entradas!'; + + $lang->board_manager = 'Configuración Tablón'; + $lang->member_manager = 'Configuración Miembros'; + $lang->layout_manager = 'Configuración Diseño'; + + $lang->use = 'Usar'; + $lang->notuse = 'Desusar'; + $lang->not_exists = 'No existe'; + + $lang->unit_sec = 'sec'; + $lang->unit_min = 'min'; + $lang->unit_hour = 'hr'; + $lang->unit_day = 'dia'; + $lang->unit_week = 'semana'; + $lang->unit_month = 'mes'; + $lang->unit_year = 'año'; + + // Related to Description + $lang->about_tag = 'cuando mecanografiar las etiquetas, insertando un comma() entre cada etiqueta permite que usted entre las etiquetas múltiples'; + $lang->about_layout = 'disposición adorna un aspecto de su módulo que usted podría configurarlo de menú de la disposición en la tapa'; + + // Related to Message + $lang->msg_call_server = 'Solicitando al servidor, espere por favor'; + $lang->msg_db_not_setted = 'No tiene la Configuración del DB'; + $lang->msg_invalid_queryid = 'El valor de Query ID especificado mal'; + $lang->msg_not_permitted = 'Usted no tiene permiso'; + $lang->msg_input_password = 'Por favor escribe sus contraseña'; + $lang->msg_invalid_document = 'Numero de entrada invalido'; + $lang->msg_invalid_request = 'Requesta Invalido'; + $lang->msg_invalid_password = 'Contraseñn Invalido'; + $lang->msg_error_occured = 'Occurrido Errores'; + $lang->msg_not_founded = 'Objetivo no encontrado'; + $lang->msg_no_result = 'Esta búsqueda no hay resultado'; + + $lang->msg_not_permitted_act = 'Usted no tiene permiso para ejecutar la action'; + $lang->msg_module_is_not_exists = 'No podía encontrar el modulo que usted solicitado'; + $lang->msg_module_is_not_standalone = 'El modulo usted solicitado no puede ejecutado independientemente'; + + $lang->success_registed = 'Registrado con Éxito'; + $lang->success_updated = 'Actualizado con Éxito'; + $lang->success_deleted = 'Boarrado con Éxito'; + $lang->success_voted = 'Votado con Éxito'; + $lang->success_moved = 'Movido con Éxito'; + $lang->success_sended = 'Enviado con Éxito'; + $lang->success_reset = 'Reajustado con Éxito'; + $lang->success_leaved = 'Abandonó con Éxito'; + + $lang->fail_to_delete = 'Supresión Fallada'; + $lang->fail_to_move = 'Mover Fallada'; + + $lang->failed_voted = 'No podía ser votado'; + $lang->fail_to_delete_have_children = 'Supresión Fallda. Hay unas o más contestaciones'; + + $lang->confirm_submit = 'Confirmar para someter?'; + $lang->confirm_logout = 'Confirmar para salir?'; + $lang->confirm_vote = 'Confirmar para voto?'; + $lang->confirm_delete = 'Confirmar de supresión?'; + $lang->confirm_move = 'Confirmar para Movido?'; + $lang->confirm_reset = 'Confirmar para reajustar?'; + $lang->confirm_leave = 'Confirmar para Éxito?'; + + $lang->column_type = 'Tipo de la Columna'; + $lang->column_type_list['text'] = 'Texto una linea'; + $lang->column_type_list['homepage'] = 'url'; + $lang->column_type_list['email_address'] = 'Correo Electrónico'; + $lang->column_type_list['tel'] = 'Numero de fono'; + $lang->column_type_list['textarea'] = 'Texto multi-linea'; + $lang->column_type_list['checkbox'] = 'checkbox (selecciónes multiples)'; + $lang->column_type_list['select'] = 'select box (selección singlar)'; + //$lang->column_type_list['kr_zip'] = 'zip code (Korean)'; + $lang->column_type_list['date'] = 'fecha (dd/mm/aaaa)'; + //$lang->column_type_list['jp_zip'] = 'zip code (Japanese)'; + $lang->column_name = 'Nombre de la Columna'; + $lang->column_title = 'Título de la Columna'; + $lang->default_value = 'Valor Prefijado'; + $lang->is_active = 'Activado'; + $lang->is_required = 'Entrada Necesario'; + + // Alert messages for Javascript using by XML filter + $lang->filter->isnull = 'Entrar un valor para %s'; + $lang->filter->outofrange = 'Alinear el lenghth del texto de %s'; + $lang->filter->equalto = 'Valor inválido asignado para %s'; + $lang->filter->invalid_email = '%s es formateo inválido (eg. zbxe@zeroboard.com)'; + $lang->filter->invalid_user_id = $lang->filter->invalid_userid = "%s es formeto inválido.\\nTomas letras, números, y el underbar(ingleses _) de cuál debe comenzar con las letras Alfabeto"; + $lang->filter->invalid_homepage = '%s es formateo inválido. (?: http://www.zeroboard.com)'; + $lang->filter->invalid_korean = '%s got an invalid format. Solo aceptan las letras Coreanas'; + $lang->filter->invalid_korean_number = '%s es formateo inválido. Solamente combinación de letras y de números coreanos se acepta'; + $lang->filter->invalid_alpha = '%s es formateo inválido. Solamente se aceptan las alfabeto'; + $lang->filter->invalid_alpha_number = '%s es formateo inválido. Solamente se aceptan las alfabeto y números'; + $lang->filter->invalid_number = '%s es formateo inválido. Solo aceptan los números.'; +?> diff --git a/common/lang/fr.lang.php b/common/lang/fr.lang.php new file mode 100644 index 000000000..6bbd45d8b --- /dev/null +++ b/common/lang/fr.lang.php @@ -0,0 +1,216 @@ +cmd_write = 'Ecrire'; + $lang->cmd_reply = 'Répondre'; + $lang->cmd_delete = 'Supprimer'; + $lang->cmd_modify = 'Modifier'; + $lang->cmd_edit = 'Editer'; + $lang->cmd_view = 'Regarder'; + $lang->cmd_view_all = 'Regarder Tous'; + $lang->cmd_list = 'Liste'; + $lang->cmd_prev = 'Précédent '; + $lang->cmd_next = 'Après'; + $lang->cmd_send_trackback = 'Envoyer Trackback'; + $lang->cmd_registration = $lang->cmd_submit = 'Soumettre'; + $lang->cmd_comment_registration = 'Ajouter le Commentaire'; + $lang->cmd_insert = 'Insérer'; + $lang->cmd_save = 'Economiser'; + $lang->cmd_input = 'Entrer'; + $lang->cmd_search = 'Rechercher'; + $lang->cmd_cancel = 'Decommander'; + $lang->cmd_back = 'Retour'; + $lang->cmd_vote = 'Voter'; + $lang->cmd_move = 'Deplacer'; + $lang->cmd_move_up = 'Relever'; + $lang->cmd_move_down = 'Abaisser'; + $lang->cmd_add_indent = 'Ajouter le Creux'; + $lang->cmd_remove_indent = 'Enlever le Creux'; + $lang->cmd_management = 'Gestion'; + $lang->cmd_make = 'Creer'; + $lang->cmd_select = 'Choisir'; + $lang->cmd_select_all = 'Choisir Tous'; + $lang->cmd_unselect_all = 'Ne pas Selectionner Tous'; + $lang->cmd_close_all = 'Cloturer Tous'; + $lang->cmd_open_all = 'Ouvrir Tous'; + $lang->cmd_reload = 'Recharger'; + $lang->cmd_close = 'Fermer'; + $lang->cmd_open = 'Cloturer'; + $lang->cmd_setup = 'Configurer'; + $lang->cmd_option = 'Option'; + $lang->cmd_apply = 'Appliquer'; + $lang->cmd_open_calendar = 'Choisir la Date'; + $lang->cmd_send = 'Envoyer'; + $lang->cmd_print = 'Imprimer'; + + $lang->enable = 'Permettre'; + $lang->disable = 'Neutraliser'; + + // Mots essentiels + $lang->no = 'numéro'; + $lang->notice = 'Notification'; + $lang->secret = 'Secret'; + $lang->category = 'Categorie'; + $lang->document_srl = 'numéro du Document'; + $lang->user_id = 'Pseudo'; + $lang->author = 'Auteur'; + $lang->password = 'Mot de Passe'; + $lang->password1 = 'Mot de Passe'; + $lang->password2 = 'Confirmer le Mot de Passe'; + $lang->admin_id = 'Pseudo d\'Administrateur'; + $lang->writer = 'Auteur'; + $lang->user_name = 'Nom d\'utilisateur'; + $lang->nick_name = 'Surnom'; + $lang->email_address = 'E-mail'; + $lang->homepage = 'Site Web'; + $lang->blog = 'Blog'; + $lang->birthday = 'Anniversaire'; + $lang->browser_title = 'Titre de Navigateur'; + $lang->title = 'Titre'; + $lang->title_content = 'Titre + Contenu'; + $lang->content = 'Contenu'; + $lang->document = 'Article'; + $lang->comment = 'Commentaire'; + $lang->description = 'Description'; + $lang->trackback = 'Trackback'; + $lang->tag = 'Tag'; + $lang->allow_comment = 'Permettre les Commentaires'; + $lang->lock_comment = 'Rejeter les Commentaires'; + $lang->allow_trackback = 'Permettre la Trackback'; + $lang->uploaded_file = 'Dossier Téléchargé'; + $lang->grant = 'Autorité'; + $lang->target = 'Cible'; + $lang->total = 'Total'; + $lang->total_count = 'Comptage Total'; + $lang->ipaddress = 'IP Address'; + $lang->path = 'Chemin'; + $lang->cart = 'Article Choisi'; + $lang->friend = 'Les Amis'; + + $lang->mid = 'Titre de Module'; + $lang->layout = 'Disposition'; + $lang->widget = 'Widget'; + $lang->module = 'Module'; + $lang->skin = 'Thème'; + $lang->colorset = 'Arrangement de couleur'; + $lang->extra_vars = 'Variables Supplementaires'; + + $lang->document_url = 'URL du Document'; + $lang->trackback_url = 'URL de la Trackback'; + $lang->blog_name = 'Nom du Blog'; + $lang->excerpt = 'Citation'; + + $lang->document_count = 'Nombre Total des Articles'; + $lang->page_count = 'Nombre de Pages'; + $lang->list_count = 'Nombre de Listes'; + $lang->readed_count = 'Nombre de Fois Lues'; + $lang->voted_count = 'Nombre de Voix'; + $lang->member_count = 'Nombre de Membres'; + $lang->date = 'Date'; + $lang->regdate = 'Date d\'Enregistrement'; + $lang->last_update = 'La Dernière Mise a Jour'; + $lang->signup_date = 'Date d\'Enregistrement'; + $lang->last_login = 'La Dernière Ouverture'; + $lang->first_page = 'Première Page'; + $lang->last_page = 'Dernière Page'; + $lang->search_target = 'Cible de Recherche'; + $lang->search_keyword = 'Mot-clé de Recherche'; + $lang->is_default = 'défaut'; + + $lang->no_documents = 'Aucunes Entrées'; + + $lang->board_manager = 'Arrangements des Conseils'; + $lang->member_manager = 'Arrangements des Membres'; + $lang->layout_manager = 'Arrangements de Dispositions'; + + $lang->use = 'Utiliser'; + $lang->notuse = 'Ne pas Utiliser'; + $lang->not_exists = 'n\'Existe Pas'; + + $lang->unit_sec = 'sec'; + $lang->unit_min = 'min'; + $lang->unit_hour = 'heur'; + $lang->unit_day = 'jour'; + $lang->unit_week = 'semaine'; + $lang->unit_month = 'mois'; + $lang->unit_year = 'année';; + + // Descriptions et information + $lang->about_tag = 'Quand l\'insertion des tags, insérent une virgule(,) entre chaque tags te permet d\'entrer les tags multiples.'; + $lang->about_layout = 'es dispositions décorent l\'aspect d\'un module. Vous pouvez les configurer du menu de disposition ci-dessus.'; + + // Messages et alertes + $lang->msg_call_server = 'En demandant le serveur pour information, attendre svp.'; + $lang->msg_db_not_setted = 'Les informations de DB n\'ont pas été placees.'; + $lang->msg_invalid_queryid = 'La valeur indiquee d\'identification de question est inadmissi.'; + $lang->msg_not_permitted = 'Vous n\'etes pas autorises a continuer.'; + $lang->msg_input_password = 'Veuillez entrer votre mot de passe.'; + $lang->msg_invalid_document = 'Vous avez demandé pour un article inadmissible.'; + $lang->msg_invalid_request = 'Votre demande est inadmissible.'; + $lang->msg_invalid_password = 'Vous avez entré un mot de passe inadmissible.'; + $lang->msg_error_occured = 'Une erreur s\'est produite.'; + $lang->msg_not_founded = 'La cible demandée n\'a pas pu être trouvée.'; + $lang->msg_no_result = 'Aucun Resultat'; + + $lang->msg_not_permitted_act = 'Vous n\'êtes pas autorisés pour exécuter l\'action priée.'; + $lang->msg_module_is_not_exists = 'Le module demandé n\'a pas pu être trouvé.'; + $lang->msg_module_is_not_standalone = 'Le module demandé ne peut pas être exécuté indépendamment.'; + + $lang->success_registed = 'L\'enregistrement a été avec succès exécuté.'; + $lang->success_updated = 'Avec succès mis a jour.'; + $lang->success_deleted = 'Avec succès supprime'; + $lang->success_voted = 'Avec succès voté'; + $lang->success_moved = 'Avec succès deplacé'; + $lang->success_sended = 'Avec succès envoyé'; + $lang->success_reset = 'Avec succès remisé'; + $lang->success_leaved = 'Avec succès fait cécession'; + + $lang->fail_to_delete = 'N\'a pas pu être supprimé.'; + $lang->fail_to_move = 'N\'a pas pu être déplacé'; + + $lang->failed_voted = 'La demande de voter a échoué'; + $lang->fail_to_delete_have_children = 'Une ou plusieurs reponses existent et ne pourraient pas être supprimees ainsi'; + + $lang->confirm_submit = 'Etes-vous sur vous voulez-vous soumettre?'; + $lang->confirm_logout = 'Etes-vous sur vous voulez-vous se deconnecter?'; + $lang->confirm_vote = 'Etes-vous sur vous voulez-vous voter?'; + $lang->confirm_delete = 'Etes-vous sur vous voulez-vous supprimer?'; + $lang->confirm_move = 'Etes-vous sur vous voulez-vous deplacer ceci?'; + $lang->confirm_reset = 'Etes-vous sur vous voulez-vous remettre a zero ceci?'; + $lang->confirm_leave = 'Etes-vous sur vous voulez-vous partir?'; + + $lang->column_type = 'Type de Colonne'; + $lang->column_type_list['text'] = 'un-ligne texte'; + $lang->column_type_list['homepage'] = 'url'; + $lang->column_type_list['email_address'] = 'e-mail'; + $lang->column_type_list['tel'] = 'numéro de telephone'; + $lang->column_type_list['textarea'] = 'secteur multiligne des textes'; + $lang->column_type_list['checkbox'] = 'boite de controle (choix multiple)'; + $lang->column_type_list['select'] = 'boite choisie (choix simple)'; + $lang->column_type_list['kr_zip'] = 'code postal (coréen)'; + $lang->column_type_list['date'] = 'date (yyyy/mm/dd)'; + //$lang->column_type_list['jp_zip'] = 'code postal (japonais)'; + $lang->column_name = 'Nom de colonne'; + $lang->column_title = 'Titre de colonne'; + $lang->default_value = 'Valeur par défaut'; + $lang->is_active = 'Actif'; + $lang->is_required = 'Champ requis'; + + // Messages alertes pour le Javascript a l'aide des filtres de XML + $lang->filter->isnull = 'Entrer une valeur pour %s'; + $lang->filter->outofrange = 'Aligner la longueur des textes de %s'; + $lang->filter->equalto = "La valeur de %s est inadmissible."; + $lang->filter->invalid_email = "La format de %s est inadmissible. ex) zbxe@zeroboard.com"; + $lang->filter->invalid_user_id = $lang->filter->invalid_userid = "La format de %s est inadmissible.\\nToutes les valeurs devraient se composer des alphabets, des nombres ou du soulignage (_) avec la premiere lettre etant un caractere de l'alphabet."; + $lang->filter->invalid_homepage = "La format de %s est inadmissible. ex) http://www.zeroboard.com"; + $lang->filter->invalid_korean = "La format de %s est inadmissible. On permet seulement le coréen"; + $lang->filter->invalid_korean_number = "La format de %s est inadmissible. Svp caracteres ou nombres coréens d'entrée seulement."; + $lang->filter->invalid_alpha = "La format de %s est inadmissible. Svp alphabets d'entrée seulement."; + $lang->filter->invalid_alpha_number = "La format de %s est inadmissible. Svp alphabets ou nombres d'entrée seulement."; + $lang->filter->invalid_number = "La format de %s est inadmissible. Svp l'entrée numérote seulement."; +?> diff --git a/common/lang/jp.lang.php b/common/lang/jp.lang.php new file mode 100644 index 000000000..e8259d999 --- /dev/null +++ b/common/lang/jp.lang.php @@ -0,0 +1,221 @@ +cmd_write = '書き込む'; + $lang->cmd_reply = '返信'; + $lang->cmd_delete = '削除'; + $lang->cmd_modify = '修正'; + $lang->cmd_edit = '編集'; + $lang->cmd_view = '表示'; + $lang->cmd_view_all = 'すべて表示'; + $lang->cmd_list = 'リスト'; + $lang->cmd_prev = '前へ'; + $lang->cmd_next = '次へ'; + $lang->cmd_send_trackback = 'TB送信'; + $lang->cmd_registration = $lang->cmd_submit = '登録'; + $lang->cmd_comment_registration = 'コメント登録'; + $lang->cmd_insert = '挿入'; + $lang->cmd_save = '保存'; + $lang->cmd_input = '入力'; + $lang->cmd_search = '検索'; + $lang->cmd_cancel = 'キャンセル'; + $lang->cmd_back = '戻る'; + $lang->cmd_vote = '推薦'; + $lang->cmd_move = '移動'; + $lang->cmd_move_up = '上へ'; + $lang->cmd_move_down = '下へ'; + $lang->cmd_add_indent = '字下げ'; + $lang->cmd_remove_indent = '字下げ解除'; + $lang->cmd_management = '管理'; + $lang->cmd_make = '作成'; + $lang->cmd_select = '選択'; + $lang->cmd_select_all = 'すべて選択'; + $lang->cmd_unselect_all = 'すべて解除'; + $lang->cmd_close_all = 'すべて閉じる'; + $lang->cmd_open_all = 'すべて開く'; + $lang->cmd_reload = 'リロード'; + $lang->cmd_close = '閉じる'; + $lang->cmd_open = '開く'; + $lang->cmd_setup = '設定'; + $lang->cmd_apply = '適用'; + $lang->cmd_option = 'オプション'; + $lang->cmd_open_calendar = 'カレンダーを開く'; + $lang->cmd_send = '送信'; + $lang->cmd_print = '印刷'; + $lang->cmd_scrap = 'スクラップ'; + $lang->cmd_preview = 'プレビュー'; + $lang->cmd_reset = '初期化'; + $lang->cmd_remake_cache = "キャッシュファイル再生成"; + + $lang->enable = '可能'; + $lang->disable = '不可'; + + // 基本用語 + $lang->no = '番号'; + $lang->notice = 'お知らせ'; + $lang->secret = '非公開'; + $lang->category = 'カテゴリ'; + $lang->document_srl = '書き込み番号'; + $lang->user_id = 'ユーザID'; + $lang->author = '作者'; + $lang->password = 'パスワード'; + $lang->password1 = 'パスワード'; + $lang->password2 = 'パスワード確認'; + $lang->admin_id = '管理者ID'; + $lang->writer = '投稿者'; + $lang->user_name = '名前'; + $lang->nick_name = 'ニックネーム'; + $lang->email_address = 'メールアドレス'; + $lang->homepage = 'ホームページ'; + $lang->blog = 'ブログ'; + $lang->birthday = '誕生日'; + $lang->browser_title = 'ブラウザタイトル'; + $lang->title = 'タイトル'; + $lang->title_content = 'タイトル+内容'; + $lang->content = '内容'; + $lang->document = '書き込み'; + $lang->comment = 'コメント'; + $lang->description = '説明'; + $lang->trackback = 'トラックバック'; + $lang->tag = 'タグ'; + $lang->allow_comment = 'コメント許可'; + $lang->lock_comment = 'コメントロック'; + $lang->allow_trackback = 'トラックバック許可'; + $lang->uploaded_file = '添付'; + $lang->grant = '権限'; + $lang->target = '対象'; + $lang->total = 'すべて'; + $lang->total_count = 'トータル数'; + $lang->ipaddress = 'IPアドレス'; + $lang->path = 'パス'; + $lang->cart = '選択項目'; + $lang->friend = '友達'; + $lang->notify = 'お知らせ'; + + $lang->mid = 'モジュール名'; + $lang->layout = 'レイアウト'; + $lang->widget = 'ウィジェット'; + $lang->module = 'モジュール'; + $lang->skin = 'スキン'; + $lang->colorset = 'カラーセット'; + $lang->extra_vars = '拡張変数'; + + $lang->document_url = '書き込みURL'; + $lang->trackback_url = 'トラックバックURL'; + $lang->blog_name = 'ブログ名'; + $lang->excerpt = '要約'; + + $lang->document_count = '書き込み数'; + $lang->page_count = 'ページ数'; + $lang->list_count = 'リスト数'; + $lang->readed_count = '照合数'; + $lang->voted_count = '推薦数'; + $lang->member_count = '会員数'; + $lang->date = '年月日'; + $lang->regdate = '登録日'; + $lang->last_update = '最近修正日'; + $lang->signup_date = '加入日'; + $lang->last_login = '最近ログイン'; + $lang->first_page = '最初のページ'; + $lang->last_page = '最後のページ'; + $lang->search_target = '検索対象'; + $lang->search_keyword = 'キーワード'; + $lang->is_default = 'デフォルト'; + + $lang->no_documents = '書き込みがありません。'; + + $lang->board_manager = '掲示板管理'; + $lang->member_manager = '会員管理'; + $lang->layout_manager = 'レイアウト'; + + $lang->use = '使用'; + $lang->notuse = '未使用'; + $lang->not_exists = 'なし'; + + $lang->unit_sec = '秒'; + $lang->unit_min = '分'; + $lang->unit_hour = '時'; + $lang->unit_day = '日'; + $lang->unit_week = '週'; + $lang->unit_month = '月'; + $lang->unit_year = '年'; + + // 説明関連 + $lang->about_tag = 'タグを入力する時、「,」を使うと複数登録できます。'; + $lang->about_layout = 'レイアウトでモジュールの枠をデザインします。上のレイアウトメニューで管理できます。'; + + // メッセージ関連 + $lang->msg_call_server = 'サーバへ問合わせ中です。しばらくお待ちください。'; + $lang->msg_db_not_setted = 'DBが設定されていません。'; + $lang->msg_invalid_queryid = 'クエリIDの値が無効です。'; + $lang->msg_not_permitted = '権限がありません。'; + $lang->msg_input_password = 'パスワードを入力してください。'; + $lang->msg_invalid_document = '無効な書き込み番号です。'; + $lang->msg_invalid_request = '無効なリクエストです。'; + $lang->msg_invalid_password = 'パスワードが正しくありません。'; + $lang->msg_error_occured = 'エラーが発生しました。'; + $lang->msg_not_founded = '見つかりません。'; + $lang->msg_no_result = '検索結果がありません。'; + + $lang->msg_not_permitted_act = '現在の操作は実行する権限がありません。'; + $lang->msg_module_is_not_exists = 'モジュールが見つかりません。'; + $lang->msg_module_is_not_standalone = 'このモジュールはスタンドアローンでは作動しません。'; + + $lang->success_registed = '登録しました。'; + $lang->success_updated = '修正しました。'; + $lang->success_deleted = '削除しました。'; + $lang->success_voted = '推薦しました。'; + $lang->success_moved = '移動しました。'; + $lang->success_sended = '送信しました。'; + $lang->success_reset = '初期化しました。'; + $lang->success_leaved = '脱会しました。'; + + $lang->fail_to_delete = '削除に失敗しました。'; + $lang->fail_to_move = '移動に失敗しました。'; + + $lang->failed_voted = '推薦できません。'; + $lang->fail_to_delete_have_children = '返信の書き込みがあり、削除できません。'; + + $lang->confirm_submit = '登録しますか?'; + $lang->confirm_logout = 'ログアウトしますか?'; + $lang->confirm_vote = '推薦しますか?'; + $lang->confirm_delete = '削除しますか?'; + $lang->confirm_move = '移動しますか?'; + $lang->confirm_reset = '初期化しますか?'; + $lang->confirm_leave = '脱会しますか?'; + + $lang->column_type = 'タイプ'; + $lang->column_type_list['text'] = '入力フィールド(text)'; + $lang->column_type_list['homepage'] = 'ホームページタイプ(url)'; + $lang->column_type_list['email_address'] = 'メールタイプ(email)'; + $lang->column_type_list['tel'] = '電話番号タイプ(phone)'; + $lang->column_type_list['textarea'] = 'テキストエリア(textarea)'; + $lang->column_type_list['checkbox'] = 'チェックボックス(checkbox)'; + $lang->column_type_list['select'] = '選択(select)'; + $lang->column_type_list['kr_zip'] = '韓国住所(zip)'; + $lang->column_type_list['date'] = '年月日'; + //$lang->column_type_list['jp_zip'] = '日本住所(zip)'; + $lang->column_name = 'コラム名'; + $lang->column_title = 'コラムタイトル'; + $lang->default_value = 'デフォルト値'; + $lang->is_active = '活性化'; + $lang->is_required = '必須項目'; + + // xml filterで用いられているjavascript用のアラートメッセージ + $lang->filter->isnull = '%sを入力してください'; + $lang->filter->outofrange = '%sの文字の長さを合わせてください'; + $lang->filter->equalto = '%sが正しくありません'; + $lang->filter->invalid_email = '%sのパターンが正しくありません (例: zbxe@zeroboard.com)'; + $lang->filter->invalid_user_id = $lang->filter->invalid_userid = "%sの形式が正しくありません。\\n半角の英数と記号「_」を組み合わせて入力してください。最初の文字は半角英数でなければなりません。"; + $lang->filter->invalid_homepage = '%sの形式が正しくありません (例: http://www.zeroboard.com)'; + $lang->filter->invalid_korean = '%sの形式が正しくありません。ハングルのみ入力してください。'; + $lang->filter->invalid_korean_number = '%sの形式が正しくありません。ハングルと半角数字で入力してください。'; + $lang->filter->invalid_alpha = '%sの形式が正しくありません。半角英文字で入力してください。'; + $lang->filter->invalid_alpha_number = '%sの形式が正しくありません。半角英数で入力してください。'; + $lang->filter->invalid_number = '%sの形式が正しくありません。半角数字で入力してください。'; +?> diff --git a/common/lang/ko.lang.php b/common/lang/ko.lang.php new file mode 100644 index 000000000..78473b3cf --- /dev/null +++ b/common/lang/ko.lang.php @@ -0,0 +1,221 @@ +cmd_write = '쓰기'; + $lang->cmd_reply = '답글'; + $lang->cmd_delete = '삭제'; + $lang->cmd_modify = '수정'; + $lang->cmd_edit = '편집'; + $lang->cmd_view = '보기'; + $lang->cmd_view_all = '전체 보기'; + $lang->cmd_list = '목록'; + $lang->cmd_prev = '이전'; + $lang->cmd_next = '다음'; + $lang->cmd_send_trackback = '엮인글발송'; + $lang->cmd_registration = $lang->cmd_submit = '등록'; + $lang->cmd_comment_registration = '댓글 등록'; + $lang->cmd_insert = '추가'; + $lang->cmd_save = '저장'; + $lang->cmd_input = '입력'; + $lang->cmd_search = '검색'; + $lang->cmd_cancel = '취소'; + $lang->cmd_back = '돌아가기'; + $lang->cmd_vote = '추천'; + $lang->cmd_move = '이동'; + $lang->cmd_move_up = '위로'; + $lang->cmd_move_down = '아래로'; + $lang->cmd_add_indent = '들이기'; + $lang->cmd_remove_indent = '빼내기'; + $lang->cmd_management = '관리'; + $lang->cmd_make = '생성'; + $lang->cmd_select = '선택'; + $lang->cmd_select_all = '모두선택'; + $lang->cmd_unselect_all = '모두해제'; + $lang->cmd_close_all = '모두닫기'; + $lang->cmd_open_all = '모두열기'; + $lang->cmd_reload = '다시읽기'; + $lang->cmd_close = '닫기'; + $lang->cmd_open = '열기'; + $lang->cmd_setup = '설정'; + $lang->cmd_option = '옵션'; + $lang->cmd_apply = '적용'; + $lang->cmd_open_calendar = '날짜 선택'; + $lang->cmd_send = '발송'; + $lang->cmd_print = '인쇄'; + $lang->cmd_scrap = '스크랩'; + $lang->cmd_preview = '미리 보기'; + $lang->cmd_reset = '초기화'; + $lang->cmd_remake_cache = "캐시파일 재생성"; + + $lang->enable = '가능'; + $lang->disable = '불가능'; + + // 기본 단어 + $lang->no = '번호'; + $lang->notice = '공지'; + $lang->secret = '비밀'; + $lang->category = '분류'; + $lang->document_srl = '문서번호'; + $lang->user_id = '아이디'; + $lang->author = '작성자'; + $lang->password = '비밀번호'; + $lang->password1 = '비밀번호'; + $lang->password2 = '비밀번호 확인'; + $lang->admin_id = '관리자ID'; + $lang->writer = '글쓴이'; + $lang->user_name = '이름'; + $lang->nick_name = '닉네임'; + $lang->email_address = '이메일 주소'; + $lang->homepage = '홈페이지'; + $lang->blog = '블로그'; + $lang->birthday = '생일'; + $lang->browser_title = '브라우저 제목'; + $lang->title = '제목'; + $lang->title_content = '제목+내용'; + $lang->content = '내용'; + $lang->document = '게시물'; + $lang->comment = '댓글'; + $lang->description = '설명'; + $lang->trackback = '엮인글'; + $lang->tag = '태그'; + $lang->allow_comment = '댓글허용'; + $lang->lock_comment = '댓글잠금'; + $lang->allow_trackback = '엮인글허용'; + $lang->uploaded_file = '첨부'; + $lang->grant = '권한'; + $lang->target = '대상'; + $lang->total = '전체'; + $lang->total_count = '전체개수'; + $lang->ipaddress = 'IP 주소'; + $lang->path = '경로'; + $lang->cart = '선택항목'; + $lang->friend = '친구'; + $lang->notify = '알림'; + + $lang->mid = '모듈이름'; + $lang->layout = '레이아웃'; + $lang->widget = '위젯 '; + $lang->module = '모듈'; + $lang->skin = '스킨'; + $lang->colorset = '컬러셋'; + $lang->extra_vars = '확장변수'; + + $lang->document_url = '게시글 주소'; + $lang->trackback_url = '엮인글 주소'; + $lang->blog_name = '블로그이름'; + $lang->excerpt = '발췌'; + + $lang->document_count = '글수'; + $lang->page_count = '페이지수'; + $lang->list_count = '목록 수'; + $lang->readed_count = '조회수'; + $lang->voted_count = '추천수'; + $lang->member_count = '회원수'; + $lang->date = '날짜'; + $lang->regdate = '등록일'; + $lang->last_update = '최근수정일'; + $lang->signup_date = '가입일'; + $lang->last_login = '최근로그인'; + $lang->first_page = '첫페이지'; + $lang->last_page = '끝페이지'; + $lang->search_target = '검색대상'; + $lang->search_keyword = '검색어'; + $lang->is_default = '기본'; + + $lang->no_documents = '등록된 글이 없습니다'; + + $lang->board_manager = '게시판 관리'; + $lang->member_manager = '회원 관리'; + $lang->layout_manager = '레이아웃 관리'; + + $lang->use = '사용'; + $lang->notuse = '미사용'; + $lang->not_exists = '없음'; + + $lang->unit_sec = '초'; + $lang->unit_min = '분'; + $lang->unit_hour = '시'; + $lang->unit_day = '일'; + $lang->unit_week = '주'; + $lang->unit_month = '월'; + $lang->unit_year = '년'; + + // 설명 관련 + $lang->about_tag = '태그 입력시 , (쉼표)를 이용하시면 복수 등록이 가능합니다'; + $lang->about_layout = '레이아웃은 모듈의 껍데기를 꾸며줍니다. 상단 레이아웃 메뉴에서 관리하실 수 있습니다'; + + // 메세지 관련 + $lang->msg_call_server = '서버에 요청중입니다. 잠시만 기다려주세요.'; + $lang->msg_db_not_setted = 'DB설정이 되어 있지 않습니다'; + $lang->msg_invalid_queryid = 'Query ID값이 잘못 지정되었습니다'; + $lang->msg_not_permitted = '권한이 없습니다'; + $lang->msg_input_password = '비밀번호를 입력하여 주세요'; + $lang->msg_invalid_document = '잘못된 문서번호입니다'; + $lang->msg_invalid_request = '잘못된 요청입니다'; + $lang->msg_invalid_password = '비밀번호가 올바르지 않습니다'; + $lang->msg_error_occured = '오류가 발생하였습니다'; + $lang->msg_not_founded = '대상을 찾을 수 없습니다'; + $lang->msg_no_result = '검색 결과가 없습니다'; + + $lang->msg_not_permitted_act = '요청하신 action을 실행할 수 있는 권한이 없습니다'; + $lang->msg_module_is_not_exists = '요청하신 모듈을 찾을 수 없습니다'; + $lang->msg_module_is_not_standalone = '요청하신 모듈은 독립적으로 동작할 수가 없습니다'; + + $lang->success_registed = '등록되었습니다'; + $lang->success_updated = '수정되었습니다'; + $lang->success_deleted = '삭제되었습니다'; + $lang->success_voted = '추천되었습니다'; + $lang->success_moved = '이동되었습니다'; + $lang->success_sended = '발송되었습니다'; + $lang->success_reset = '초기화되었습니다'; + $lang->success_leaved = '탈퇴되었습니다'; + + $lang->fail_to_delete = '삭제되었습니다'; + $lang->fail_to_move = '이동되었습니다'; + + $lang->failed_voted = '추천하실 수 없습니다'; + $lang->fail_to_delete_have_children = '답글이 있어서 삭제할 수 없습니다'; + + $lang->confirm_submit = '등록하시겠습니까?'; + $lang->confirm_logout = '로그아웃하시겠습니까?'; + $lang->confirm_vote = '추천하시겠습니까?'; + $lang->confirm_delete = '삭제하시겠습니까?'; + $lang->confirm_move = '이동하시겠습니까?'; + $lang->confirm_reset = '초기화 하시겠습니까??'; + $lang->confirm_leave = '탈퇴 하시겠습니까??'; + + $lang->column_type = '형식'; + $lang->column_type_list['text'] = '한줄 입력칸 (text)'; + $lang->column_type_list['homepage'] = '홈페이지 형식 (url)'; + $lang->column_type_list['email_address'] = '이메일 형식 (email)'; + $lang->column_type_list['tel'] = '전화번호 형식 (phone)'; + $lang->column_type_list['textarea'] = '여러줄 입력칸 (textarea)'; + $lang->column_type_list['checkbox'] = '다중 선택 (checkbox)'; + $lang->column_type_list['select'] = '단일 선택 (select)'; + $lang->column_type_list['kr_zip'] = '한국주소 (zip)'; + $lang->column_type_list['date'] = '일자 (년월일)'; + //$lang->column_type_list['jp_zip'] = '일본주소 (zip)'; + $lang->column_name = '입력항목 이름'; + $lang->column_title = '입력항목 제목'; + $lang->default_value = '기본 값'; + $lang->is_active = '활성'; + $lang->is_required = '필수항목'; + + // xml filter에서 사용되는 javascript용 alert msg + $lang->filter->isnull = '%s의 값을 입력해주세요'; + $lang->filter->outofrange = '%s의 글자 길이를 맞추어 주세요.'; + $lang->filter->equalto = '%s의 값이 잘못 되었습니다.'; + $lang->filter->invalid_email = '%s의 형식이 잘못되었습니다. (예: zbxe@zeroboard.com)'; + $lang->filter->invalid_user_id = $lang->filter->invalid_userid = "%s의 형식이 잘못되었습니다.\\n영문,숫자와 _로 만드실 수 있으며 제일 앞은 영문이어야 합니다"; + $lang->filter->invalid_homepage = '%s의 형식이 잘못되었습니다. (예: http://www.zeroboard.com)'; + $lang->filter->invalid_korean = '%s의 형식이 잘못되었습니다. 한글로만 입력해주셔야 합니다'; + $lang->filter->invalid_korean_number = '%s의 형식이 잘못되었습니다. 한글과 숫자로만 입력해주셔야 합니다'; + $lang->filter->invalid_alpha = '%s의 형식이 잘못되었습니다. 영문으로만 입력해주셔야 합니다'; + $lang->filter->invalid_alpha_number = '%s의 형식이 잘못되었습니다. 영문과 숫자로만 입력해주셔야 합니다'; + $lang->filter->invalid_number = '%s의 형식이 잘못되었습니다. 숫자로만 입력해주셔야 합니다'; +?> diff --git a/common/lang/zh-CN.lang.php b/common/lang/zh-CN.lang.php new file mode 100644 index 000000000..d0e6edb29 --- /dev/null +++ b/common/lang/zh-CN.lang.php @@ -0,0 +1,221 @@ +cmd_write = '发表新帖'; + $lang->cmd_reply = '回复'; + $lang->cmd_delete = '删除'; + $lang->cmd_modify = '修改'; + $lang->cmd_edit = '编辑'; + $lang->cmd_view = '查看'; + $lang->cmd_view_all = '全部查看'; + $lang->cmd_list = '目录'; + $lang->cmd_prev = '上一页'; + $lang->cmd_next = '下一页'; + $lang->cmd_send_trackback = '发送引用'; + $lang->cmd_registration = $lang->cmd_submit = '提交'; + $lang->cmd_comment_registration = '提交评论'; + $lang->cmd_insert = '添加'; + $lang->cmd_save = '保存'; + $lang->cmd_input = '输入'; + $lang->cmd_search = '搜索'; + $lang->cmd_cancel = '取消'; + $lang->cmd_back = '返回'; + $lang->cmd_vote = '推荐'; + $lang->cmd_move = '查看'; + $lang->cmd_move_up = '向上'; + $lang->cmd_move_down = '向下'; + $lang->cmd_add_indent = '拉长'; + $lang->cmd_remove_indent = '缩短'; + $lang->cmd_management = '管理'; + $lang->cmd_make = '生成'; + $lang->cmd_select = '选择'; + $lang->cmd_select_all = '全部选择'; + $lang->cmd_unselect_all = '全部解除'; + $lang->cmd_close_all = '全部关闭'; + $lang->cmd_open_all = '全部打开'; + $lang->cmd_reload = '从新载入'; + $lang->cmd_close = '关闭'; + $lang->cmd_open = '打开'; + $lang->cmd_setup = '设置'; + $lang->cmd_option = '选项'; + $lang->cmd_apply = '应用'; + $lang->cmd_open_calendar = '选择日期'; + $lang->cmd_send = '发送'; + $lang->cmd_print = '打印'; + $lang->cmd_scrap = '收藏'; + $lang->cmd_preview = '预览'; + $lang->cmd_reset = '初始化'; + $lang->cmd_remake_cache = "重新生成缓冲文件"; + + $lang->enable = '可用'; + $lang->disable = '禁用'; + + // 基本词语 + $lang->no = '编号'; + $lang->notice = '公告'; + $lang->secret = '密帖'; + $lang->category = '分类'; + $lang->document_srl = '文章编号'; + $lang->user_id = '用户名'; + $lang->author = '制作'; + $lang->password = '密码'; + $lang->password1 = '密码'; + $lang->password2 = '确认密码'; + $lang->admin_id = '管理员ID'; + $lang->writer = '作者'; + $lang->user_name = '姓名'; + $lang->nick_name = '昵称'; + $lang->email_address = '电子邮件'; + $lang->homepage = '主页'; + $lang->blog = '博客'; + $lang->birthday = '生日'; + $lang->browser_title = '浏览器标题'; + $lang->title = '标题'; + $lang->title_content = '标题+内容'; + $lang->content = '内容'; + $lang->document = '文章'; + $lang->comment = '评论'; + $lang->description = '说明'; + $lang->trackback = '引用'; + $lang->tag = '标签'; + $lang->allow_comment = '允许评论'; + $lang->lock_comment = '关闭评论'; + $lang->allow_trackback = '允许引用'; + $lang->uploaded_file = '附件'; + $lang->grant = '权限'; + $lang->target = '目标'; + $lang->total = '全部'; + $lang->total_count = '总数'; + $lang->ipaddress = 'IP地址'; + $lang->path = '路径'; + $lang->cart = '选择项目'; + $lang->friend = '好友'; + $lang->notify = '通告'; + + $lang->mid = '模块名称'; + $lang->layout = '布局'; + $lang->widget = '控件 '; + $lang->module = '模块'; + $lang->skin = '皮肤'; + $lang->colorset = '颜色设定'; + $lang->extra_vars = '扩展变数'; + + $lang->document_url = '文章地址'; + $lang->trackback_url = '引用地址'; + $lang->blog_name = '博客名称'; + $lang->excerpt = '载自'; + + $lang->document_count = '帖子数'; + $lang->page_count = '页数'; + $lang->list_count = '目录数'; + $lang->readed_count = '查看'; + $lang->voted_count = '推荐'; + $lang->member_count = '会员数'; + $lang->date = '日期'; + $lang->regdate = '登录日期'; + $lang->last_update = '最后更新'; + $lang->signup_date = '注册日期'; + $lang->last_login = '最近登陆'; + $lang->first_page = '第一页'; + $lang->last_page = '最后一页'; + $lang->search_target = '搜索目标'; + $lang->search_keyword = '关键字'; + $lang->is_default = '默认'; + + $lang->no_documents = '现没有主题。'; + + $lang->board_manager = '版面管理'; + $lang->member_manager = '会员管理'; + $lang->layout_manager = '布局管理'; + + $lang->use = '使用'; + $lang->notuse = '未使用'; + $lang->not_exists = '无'; + + $lang->unit_sec = '秒'; + $lang->unit_min = '分'; + $lang->unit_hour = '时'; + $lang->unit_day = '日'; + $lang->unit_week = '周'; + $lang->unit_month = '月'; + $lang->unit_year = '年'; + + // 说明 + $lang->about_tag = '用逗号分隔多个标签'; + $lang->about_layout = '布局是布置模块的外观,在上端布局菜里单可以进行管理'; + + // 信息 + $lang->msg_call_server = '系统正在链接服务器,请稍后。'; + $lang->msg_db_not_setted = '还没有设定 DB'; + $lang->msg_invalid_queryid = 'Query ID值指定错误'; + $lang->msg_not_permitted = '没有权限'; + $lang->msg_input_password = '请输入密码'; + $lang->msg_invalid_document = '出错的文章编号'; + $lang->msg_invalid_request = '出错的请求'; + $lang->msg_invalid_password = '密码错误'; + $lang->msg_error_occured = '发生错误'; + $lang->msg_not_founded = '没有找到相关内容'; + $lang->msg_no_result = '找不到和您查询的相符结果'; + + $lang->msg_not_permitted_act = '没有权限执行 action命令'; + $lang->msg_module_is_not_exists = '找不到您查询的模块'; + $lang->msg_module_is_not_standalone = '您请求的模块不能单独执行'; + + $lang->success_registed = '提交成功!'; + $lang->success_updated = '修改成功!'; + $lang->success_deleted = '删除成功!'; + $lang->success_voted = '推荐成功!'; + $lang->success_moved = '移动成功!'; + $lang->success_sended = '发送成功!'; + $lang->success_reset = '初始化成功'; + $lang->success_leaved = '注销成功!'; + + $lang->fail_to_delete = '删除成功!'; + $lang->fail_to_move = '移动成功!'; + + $lang->failed_voted = '您不能推荐!'; + $lang->fail_to_delete_have_children = '不能删除有回复的评论!'; + + $lang->confirm_submit = '确定要提交吗?'; + $lang->confirm_logout = '确定要退出吗?'; + $lang->confirm_vote = '确定要推荐吗?'; + $lang->confirm_delete = '确定要删除吗?'; + $lang->confirm_move = '确定要移动吗?'; + $lang->confirm_reset = '确定要初始化吗?'; + $lang->confirm_leave = '确定要注销吗?'; + + $lang->column_type = '格式'; + $lang->column_type_list['text'] = '单行文本输入区(text)'; + $lang->column_type_list['homepage'] = '网址格式 (url)'; + $lang->column_type_list['email_address'] = '邮件格式 (email)'; + $lang->column_type_list['tel'] = '电话号码格式 (phone)'; + $lang->column_type_list['textarea'] = '多行文本框 (textarea)'; + $lang->column_type_list['checkbox'] = '复选框 (checkbox)'; + $lang->column_type_list['select'] = '下拉列表框 (select)'; + $lang->column_type_list['kr_zip'] = '韩国地址 (zip)'; + $lang->column_type_list['date'] = '日期 (年月日)'; + //$lang->column_type_list['jp_zip'] = '日本地址 (zip)'; + $lang->column_name = '项目名'; + $lang->column_title = '项目标题'; + $lang->default_value = '缺省值'; + $lang->is_active = '激活'; + $lang->is_required = '必填'; + + // 在xml filter使用的 javascript用 alert msg + $lang->filter->isnull = '请输入%s'; + $lang->filter->outofrange = '请确认%s字数'; + $lang->filter->equalto = '%s值有误。'; + $lang->filter->invalid_email = '%s格式有误。(例:zbxe@zeroboard.com)'; + $lang->filter->invalid_user_id = $lang->filter->invalid_userid = "%s只能用英文,数字和 _,首个字符必须是英文字母。"; + $lang->filter->invalid_homepage = '%s格式有误。(例: http://www.zeroboard.com)'; + $lang->filter->invalid_korean = '%s只能输入中文'; + $lang->filter->invalid_korean_number = '%s只能输入中文或数字'; + $lang->filter->invalid_alpha = '%s只能输入英文字母'; + $lang->filter->invalid_alpha_number = '%s只能输入英文或数字'; + $lang->filter->invalid_number = '%s只能输入数字'; +?> diff --git a/common/tpl/calendar.php b/common/tpl/calendar.php new file mode 100644 index 000000000..a50c1fed0 --- /dev/null +++ b/common/tpl/calendar.php @@ -0,0 +1,189 @@ + 12) { + $month = 1; + $year ++; + } + break; + case 'next_year' : + $year = date("Y", mktime(0,0,0,12,31,$year)+60*60*24); + break; + } + + $start_week = date("w", mktime(0,0,0,$month,1,$year)); + $month_day = date("t", mktime(0,0,0,$month,1,$year)); + $before_month_month_day = date("t", mktime(0,0,0,$month,1,$year)-60*60*24); + + $next_year = date("m", mktime(0,0,0,12,31, $year)+60*60*24); + $next_month = date("m", mktime(0,0,0,$month,$month_day, $year)+60*60*24); +?> + + + + + + Calendar + + + + + + + + + + + + + + + + + + diff --git a/common/tpl/common_layout.html b/common/tpl/common_layout.html new file mode 100644 index 000000000..37ce64e7d --- /dev/null +++ b/common/tpl/common_layout.html @@ -0,0 +1,47 @@ + + + + + + + + + + + {Context::getBrowserTitle()} + + + + + + + + + + + + + {Context::getHtmlHeader()} + + + +{$zbxe_final_content} + +{Context::getHtmlFooter()} + + + +
+ + + diff --git a/common/tpl/css/calendar.css b/common/tpl/css/calendar.css new file mode 100644 index 000000000..f092f3654 --- /dev/null +++ b/common/tpl/css/calendar.css @@ -0,0 +1,33 @@ +@charset "utf-8"; + +body { margin:0; padding:0; } + +#popup_content { width:370px; overflow:hidden;} +#popHeadder { width:370px; } +#popBody { width:350px; } +#popFooter { width:370px; } + +#popBody .calendar { width:350px; border:1px solid #c1c0bd; border-left:none; border-right:none; background:#f5f5f5; overflow:hidden; position:relative;} +#popBody .calendar .yymm { width:143px; float:left;} +#popBody .calendar .yymm .yy { padding:9px 0 6px 0; text-align:center; border-bottom:1px solid #ededed; margin:0 15px; font:bold 1.2em Tahoma; color:#444444;} +#popBody .calendar .yymm .mm { margin:0 15px; border-top:1px solid #ffffff; border-bottom:1px solid #ededed; padding:10px 0 7px 0; text-align:center;} +#popBody .calendar .yymm .mm p { color:#969696; font:1.6em "Times New Roman";} +#popBody .calendar .yymm .mm span { font:4em "Times New Roman"; color:#158692; vertical-align:middle;} +#popBody .calendar .yymm .go { padding:7px 0 0 0; margin:0 15px; text-align:center; border-top:1px solid #ffffff;} +#popBody .calendar .yymm .go * { vertical-align:middle;} +#popBody .calendar .yymm .go .inputTypeY { border:1px solid #c9c9c9; text-align:center; font:.9em Tahoma; color:#282828; width:31px; height:16px;} +#popBody .calendar .yymm .go .inputTypeM { border:1px solid #c9c9c9; text-align:center; font:.9em Tahoma; color:#282828; width:20px; height:16px;} +#popBody .calendar .yymm .left { vertical-align:middle; margin-right:14px;} +#popBody .calendar .yymm .right { vertical-align:middle; margin-left:14px;} +#popBody .calendar .yymm .left img, +#popBody .calendar .yymm .right img { vertical-align:middle; position:relative; top:2px;} +#popBody .calendar .dd { float:left; width:207px; background:#ffffff; border-left:10px solid #ffffff;} +#popBody .calendar .dd td { border-bottom:1px solid #ededed; height:32px; text-align:center; color:#636363; font:.9em Tahoma;} +#popBody .calendar .dd td a { color:#636363; font:.9em Tahoma;} +#popBody .calendar .dd td strong { text-decoration:underline;} +#popBody .calendar .dd td strong a { text-decoration:underline;} +#popBody .calendar .dd td.sun { color:#c95b53;} +#popBody .calendar .dd td.sun a { color:#c95b53;} +#popBody .calendar .dd .first { height:35px;} +#popBody .calendar .dd .last td { height:35px; border-bottom:none;} +#popBody .calendar .dd td .disable a { color:#CCCCCC; } diff --git a/common/tpl/default_layout.html b/common/tpl/default_layout.html new file mode 100644 index 000000000..d9f1e44a0 --- /dev/null +++ b/common/tpl/default_layout.html @@ -0,0 +1 @@ +{$content} diff --git a/common/tpl/images/blank.gif b/common/tpl/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/common/tpl/images/blank.gif differ diff --git a/common/tpl/images/buttonGo.gif b/common/tpl/images/buttonGo.gif new file mode 100644 index 000000000..8f4a53c6e Binary files /dev/null and b/common/tpl/images/buttonGo.gif differ diff --git a/common/tpl/images/buttonLeft2.gif b/common/tpl/images/buttonLeft2.gif new file mode 100644 index 000000000..12764bd98 Binary files /dev/null and b/common/tpl/images/buttonLeft2.gif differ diff --git a/common/tpl/images/buttonRight2.gif b/common/tpl/images/buttonRight2.gif new file mode 100644 index 000000000..e4c85f1bf Binary files /dev/null and b/common/tpl/images/buttonRight2.gif differ diff --git a/common/tpl/images/calendar.gif b/common/tpl/images/calendar.gif new file mode 100644 index 000000000..96a8bd14f Binary files /dev/null and b/common/tpl/images/calendar.gif differ diff --git a/common/tpl/images/flvplayer.swf b/common/tpl/images/flvplayer.swf new file mode 100644 index 000000000..5b5412a52 Binary files /dev/null and b/common/tpl/images/flvplayer.swf differ diff --git a/common/tpl/images/folder.gif b/common/tpl/images/folder.gif new file mode 100644 index 000000000..eb129763d Binary files /dev/null and b/common/tpl/images/folder.gif differ diff --git a/common/tpl/images/form_buttons.gif b/common/tpl/images/form_buttons.gif new file mode 100755 index 000000000..b54b2694f Binary files /dev/null and b/common/tpl/images/form_buttons.gif differ diff --git a/common/tpl/images/form_buttons.png b/common/tpl/images/form_buttons.png new file mode 100755 index 000000000..4ca99a35e Binary files /dev/null and b/common/tpl/images/form_buttons.png differ diff --git a/common/tpl/images/icon_next.gif b/common/tpl/images/icon_next.gif new file mode 100644 index 000000000..511165bb4 Binary files /dev/null and b/common/tpl/images/icon_next.gif differ diff --git a/common/tpl/images/icon_nnext.gif b/common/tpl/images/icon_nnext.gif new file mode 100644 index 000000000..4d6ace35e Binary files /dev/null and b/common/tpl/images/icon_nnext.gif differ diff --git a/common/tpl/images/icon_pprev.gif b/common/tpl/images/icon_pprev.gif new file mode 100644 index 000000000..6b04fad16 Binary files /dev/null and b/common/tpl/images/icon_pprev.gif differ diff --git a/common/tpl/images/icon_prev.gif b/common/tpl/images/icon_prev.gif new file mode 100644 index 000000000..97d4531ca Binary files /dev/null and b/common/tpl/images/icon_prev.gif differ diff --git a/common/tpl/images/imgfolder.gif b/common/tpl/images/imgfolder.gif new file mode 100644 index 000000000..e6d880347 Binary files /dev/null and b/common/tpl/images/imgfolder.gif differ diff --git a/common/tpl/images/info.png b/common/tpl/images/info.png new file mode 100644 index 000000000..f253a8e34 Binary files /dev/null and b/common/tpl/images/info.png differ diff --git a/common/tpl/images/join.gif b/common/tpl/images/join.gif new file mode 100644 index 000000000..34dd47610 Binary files /dev/null and b/common/tpl/images/join.gif differ diff --git a/common/tpl/images/joinbottom.gif b/common/tpl/images/joinbottom.gif new file mode 100644 index 000000000..48b81c80a Binary files /dev/null and b/common/tpl/images/joinbottom.gif differ diff --git a/common/tpl/images/line.gif b/common/tpl/images/line.gif new file mode 100644 index 000000000..1a259eea0 Binary files /dev/null and b/common/tpl/images/line.gif differ diff --git a/common/tpl/images/minus.gif b/common/tpl/images/minus.gif new file mode 100644 index 000000000..3d212a97a Binary files /dev/null and b/common/tpl/images/minus.gif differ diff --git a/common/tpl/images/minusbottom.gif b/common/tpl/images/minusbottom.gif new file mode 100644 index 000000000..dc3198be2 Binary files /dev/null and b/common/tpl/images/minusbottom.gif differ diff --git a/common/tpl/images/original_image_box_close.gif b/common/tpl/images/original_image_box_close.gif new file mode 100644 index 000000000..b15b3b2db Binary files /dev/null and b/common/tpl/images/original_image_box_close.gif differ diff --git a/common/tpl/images/page.gif b/common/tpl/images/page.gif new file mode 100644 index 000000000..42d7318c5 Binary files /dev/null and b/common/tpl/images/page.gif differ diff --git a/common/tpl/images/plus.gif b/common/tpl/images/plus.gif new file mode 100644 index 000000000..b2c997233 Binary files /dev/null and b/common/tpl/images/plus.gif differ diff --git a/common/tpl/images/plusbottom.gif b/common/tpl/images/plusbottom.gif new file mode 100644 index 000000000..b5671d891 Binary files /dev/null and b/common/tpl/images/plusbottom.gif differ diff --git a/common/tpl/images/widget.gif b/common/tpl/images/widget.gif new file mode 100644 index 000000000..ccd3ea82c Binary files /dev/null and b/common/tpl/images/widget.gif differ diff --git a/common/tpl/images/widget_bg.jpg b/common/tpl/images/widget_bg.jpg new file mode 100755 index 000000000..62c0e5d5a Binary files /dev/null and b/common/tpl/images/widget_bg.jpg differ diff --git a/common/tpl/images/widget_text.gif b/common/tpl/images/widget_text.gif new file mode 100755 index 000000000..ad260736b Binary files /dev/null and b/common/tpl/images/widget_text.gif differ diff --git a/common/tpl/popup_layout.html b/common/tpl/popup_layout.html new file mode 100644 index 000000000..945cb232f --- /dev/null +++ b/common/tpl/popup_layout.html @@ -0,0 +1,7 @@ + + + + diff --git a/common/tpl/refresh.html b/common/tpl/refresh.html new file mode 100644 index 000000000..2f4983d1d --- /dev/null +++ b/common/tpl/refresh.html @@ -0,0 +1,3 @@ + diff --git a/config/config.inc.php b/config/config.inc.php new file mode 100644 index 000000000..bcbb68331 --- /dev/null +++ b/config/config.inc.php @@ -0,0 +1,70 @@ + diff --git a/config/func.inc.php b/config/func.inc.php new file mode 100644 index 000000000..75bb88f33 --- /dev/null +++ b/config/func.inc.php @@ -0,0 +1,361 @@ + '[GMT -12:00] Baker Island Time', + '-1100' => '[GMT -11:00] Niue Time, Samoa Standard Time', + '-1000' => '[GMT -10:00] Hawaii-Aleutian Standard Time, Cook Island Time', + '-0930' => '[GMT -09:30] Marquesas Islands Time', + '-0900' => '[GMT -09:00] Alaska Standard Time, Gambier Island Time', + '-0800' => '[GMT -08:00] Pacific Standard Time', + '-0700' => '[GMT -07:00] Mountain Standard Time', + '-0600' => '[GMT -06:00] Central Standard Time', + '-0500' => '[GMT -05:00] Eastern Standard Time', + '-0400' => '[GMT -04:00] Atlantic Standard Time', + '-0330' => '[GMT -03:30] Newfoundland Standard Time', + '-0300' => '[GMT -03:00] Amazon Standard Time, Central Greenland Time', + '-0200' => '[GMT -02:00] Fernando de Noronha Time, South Georgia & the South Sandwich Islands Time', + '-0100' => '[GMT -01:00] Azores Standard Time, Cape Verde Time, Eastern Greenland Time', + '0000' => '[GMT 00:00] Western European Time, Greenwich Mean Time', + '+0100' => '[GMT +01:00] Central European Time, West African Time', + '+0200' => '[GMT +02:00] Eastern European Time, Central African Time', + '+0300' => '[GMT +03:00] Moscow Standard Time, Eastern African Time', + '+0330' => '[GMT +03:30] Iran Standard Time', + '+0400' => '[GMT +04:00] Gulf Standard Time, Samara Standard Time', + '+0430' => '[GMT +04:30] Afghanistan Time', + '+0500' => '[GMT +05:00] Pakistan Standard Time, Yekaterinburg Standard Time', + '+0530' => '[GMT +05:30] Indian Standard Time, Sri Lanka Time', + '+0545' => '[GMT +05:45] Nepal Time', + '+0600' => '[GMT +06:00] Bangladesh Time, Bhutan Time, Novosibirsk Standard Time', + '+0630' => '[GMT +06:30] Cocos Islands Time, Myanmar Time', + '+0700' => '[GMT +07:00] Indochina Time, Krasnoyarsk Standard Time', + '+0800' => '[GMT +08:00] Chinese Standard Time, Australian Western Standard Time, Irkutsk Standard Time', + '+0845' => '[GMT +08:45] Southeastern Western Australia Standard Time', + '+0900' => '[GMT +09:00] Korea Standard Time, Japan Standard Time, China Standard Time', + '+0930' => '[GMT +09:30] Australian Central Standard Time', + '+1000' => '[GMT +10:00] Australian Eastern Standard Time, Vladivostok Standard Time', + '+1030' => '[GMT +10:30] Lord Howe Standard Time', + '+1100' => '[GMT +11:00] Solomon Island Time, Magadan Standard Time', + '+1130' => '[GMT +11:30] Norfolk Island Time', + '+1200' => '[GMT +12:00] New Zealand Time, Fiji Time, Kamchatka Standard Time', + '+1245' => '[GMT +12:45] Chatham Islands Time', + '+1300' => '[GMT +13:00] Tonga Time, Phoenix Islands Time', + '+1400' => '[GMT +14:00] Line Island Time', + ) ; + + /** + * @brief ModuleHandler::getModuleObject($module_name, $type)을 쓰기 쉽게 함수로 선언 + * @param module_name 모듈이름 + * @param type disp, proc, controller, class + * @param kind admin, null + * @return module instance + **/ + function &getModule($module_name, $type = 'view', $kind = '') { + return ModuleHandler::getModuleInstance($module_name, $type, $kind); + } + + /** + * @brief module의 controller 객체 생성용 + * @param module_name 모듈이름 + * @return module controller instance + **/ + function &getController($module_name) { + return getModule($module_name, 'controller'); + } + + /** + * @brief module의 admin controller 객체 생성용 + * @param module_name 모듈이름 + * @return module admin controller instance + **/ + function &getAdminController($module_name) { + return getModule($module_name, 'controller','admin'); + } + + /** + * @brief module의 view 객체 생성용 + * @param module_name 모듈이름 + * @return module view instance + **/ + function &getView($module_name) { + return getModule($module_name, 'view'); + } + + /** + * @brief module의 admin view 객체 생성용 + * @param module_name 모듈이름 + * @return module admin view instance + **/ + function &getAdminView($module_name) { + return getModule($module_name, 'view','admin'); + } + + /** + * @brief module의 model 객체 생성용 + * @param module_name 모듈이름 + * @return module model instance + **/ + function &getModel($module_name) { + return getModule($module_name, 'model'); + } + + /** + * @brief module의 admin model 객체 생성용 + * @param module_name 모듈이름 + * @return module admin model instance + **/ + function &getAdminModel($module_name) { + return getModule($module_name, 'model','admin'); + } + + /** + * @brief module의 상위 class 객체 생성용 + * @param module_name 모듈이름 + * @return module class instance + **/ + function &getClass($module_name) { + return getModule($module_name, 'class'); + } + + /** + * @brief DB::executeQuery() 의 alias + * @param query_id 쿼리 ID ( 모듈명.쿼리XML파일 ) + * @param args object 변수로 선언된 인자값 + * @return 처리결과 + **/ + function executeQuery($query_id, $args = null) { + $oDB = &DB::getInstance(); + return $oDB->executeQuery($query_id, $args); + } + + /** + * @brief DB::getNextSequence() 의 alias + * @return big int + **/ + function getNextSequence() { + $oDB = &DB::getInstance(); + return $oDB->getNextSequence(); + } + + /** + * @brief Context::getUrl($args_list)를 쓰기 쉽게 함수로 선언 + * @return string + * + * getUrl()은 현재 요청된 RequestURI에 주어진 인자의 값으로 변형하여 url을 리턴한다\n + * 1. 인자는 (key, value)... 의 형식으로 주어져야 한다.\n + * ex) getUrl('key1','val1', 'key2', '') : key1, key2를 val1과 '' 로 변형\n + * 2. 아무런 인자가 없으면 argument를 제외한 url을 리턴 + * 3. 첫 인자값이 '' 이면 RequestUri에다가 추가된 args_list로 url을 만듬 + **/ + function getUrl() { + $num_args = func_num_args(); + $args_list = func_get_args(); + + if(!$num_args) return Context::getRequestUri(); + + return Context::getUrl($num_args, $args_list); + } + + /** + * @brief 주어진 문자를 주어진 크기로 자르고 잘라졌을 경우 주어진 꼬리를 담 + * @param string 자를 원 문자열 + * @param cut_size 주어진 원 문자열을 자를 크기 + * @param tail 잘라졌을 경우 문자열의 제일 뒤에 붙을 꼬리 + * @return string + * + * 손쉽고 확실한 변환을 위해 2byte unicode로 변형한후 처리를 한다 + **/ + function cut_str($string, $cut_size, $tail='...') { + if(!function_exists('iconv')) return $string; + if(!$string || !$cut_size) return $string; + $unicode_str = iconv("UTF-8","UCS-2",$string); + if(strlen($unicode_str) < $cut_size*2) return $string; + + $output_str = substr($unicode_str, 0, $cut_size*2); + return iconv("UCS-2","UTF-8",$output_str).$tail; + } + + /** + * @brief YYYYMMDDHHIISS 형식의 시간값을 unix time으로 변경 + * @param str YYYYMMDDHHIISS 형식의 시간값 + * @return int + **/ + function ztime($str) { + if(!$str) return; + $hour = (int)substr($str,8,2); + $min = (int)substr($str,10,2); + $sec = (int)substr($str,12,2); + $year = (int)substr($str,0,4); + $month = (int)substr($str,4,2); + $day = (int)substr($str,6,2); + + $time_zone = $GLOBALS['_time_zone']; + if($time_zone<0) $to = -1; else $to = 1; + $t_hour = substr($time_zone,1,2)*$to; + $t_min = substr($time_zone,3,2)*$to; + + $server_time_zone = date("O"); + if($server_time_zone<0) $so = -1; else $so = 1; + $c_hour = substr($server_time_zone,1,2)*$so; + $c_min = substr($server_time_zone,3,2)*$so; + + $g_min = $t_min - $c_min; + $g_hour = $t_hour - $c_hour; + + $gap = $g_min*60 + $g_hour*60*60; + + return mktime($hour, $min, $sec, $month?$month:1, $day?$day:1, $year)+$gap; + } + + /** + * @brief YYYYMMDDHHIISS 형식의 시간값을 원하는 시간 포맷으로 변형 + * @param str YYYYMMDDHHIISS 형식의 시간값 + * @param format php date()함수의 시간 포맷 + * @return string + **/ + function zdate($str, $format = "Y-m-d H:i:s") { + if(!$str) return; + + switch(Context::getLangType()) { + case "en" : + case "es" : + if($format == "Y-m-d") $format = "M d, Y"; + elseif($format == "Y-m-d H:i:s") $format = "M d, Y H:i:s"; + elseif($format == "Y-m-d H:i") $format = "M d, Y H:i"; + break; + + } + return date($format, ztime($str)); + } + + /** + * @brief 간단한 console debugging 함수 + * @param buff 출력하고자 하는 object + * @param display_line 구분자를 출력할 것인지에 대한 플래그 (기본:true) + * @return none + * + * ./files/_debug_message.php 파일에 $buff 내용을 출력한다. + * tail -f ./files/_debug_message.php 하여 계속 살펴 볼 수 있다 + **/ + function debugPrint($buff = null, $display_line = true) { + //if(!$buff) return; + + if(__DEBUG_OUTPUT__==1) { + print sprintf("", print_r($buff,true)); + } else { + $debug_file = "./files/_debug_message.php"; + $buff = sprintf("%s\n",print_r($buff,true)); + + if($display_line) $buff = "\n====================================\n".$buff."------------------------------------\n"; + + if(@!$fp = fopen($debug_file,"a")) return; + fwrite($fp, $buff); + fclose($fp); + } + } + + /** + * @brief microtime() return + * @return float + **/ + function getMicroTime() { + list($time1, $time2) = explode(' ', microtime()); + return (float)$time1+(float)$time2; + } + + /** + * @brief 첫번째 인자로 오는 object var에서 2번째 object의 var들을 제거 + * @param target_obj 원 object + * @param del_obj 원 object의 vars에서 del_obj의 vars를 제거한다 + * @return object + **/ + function delObjectVars($target_obj, $del_obj) { + if(!is_object($target_obj)) return; + if(!is_object($del_obj)) return; + + $target_vars = get_object_vars($target_obj); + $del_vars = get_object_vars($del_obj); + + $target = array_keys($target_vars); + $del = array_keys($del_vars); + if(!count($target)||!count($del)) return $target_obj; + + $return_obj = NULL; + + $target_count = count($target); + for($i=0;$i<$target_count;$i++) { + $target_key = $target[$i]; + if(!in_array($target_key, $del)) $return_obj->{$target_key} = $target_obj->{$target_key}; + } + + return $return_obj; + } + + /** + * @brief php5 이상에서 error_handing을 debugPrint로 변경 + * @param errno + * @param errstr + * @return file + * @return line + **/ + function handleError($errno, $errstr, $file, $line) { + if(!__DEBUG__) return; + $errors = array(E_USER_ERROR, E_ERROR, E_PARSE); + if(!in_array($errno,$errors)) return; + + $output = sprintf("Fatal error : %s - %d", $file, $line); + $output .= sprintf("%d - %s", $errno, $errstr); + + debugPrint($output); + } + + /** + * @brief 주어진 숫자를 주어진 크기로 recursive하게 잘라줌 + * @param no 주어진 숫자 + * @param size 잘라낼 크기 + * + * ex) 12, 3 => 012/ + * ex) 1234, 3 => 123/004/ + **/ + function getNumberingPath($no, $size=3) { + $mod = pow(10,$size); + $output = sprintf('%0'.$size.'d/', $no%$mod); + if($no >= $mod) $output .= getNumberingPath((int)$no/$mod, $size); + return $output; + } + + /** + * @brief 한글이 들어간 url의 decode + **/ + function url_decode($str) { + return preg_replace('/%u([[:alnum:]]{4})/', '&#x\\1;',$str); + } + + /** + * @brief iframe, script코드 제거 + **/ + function removeHackTag($content) { + // iframe 제거 + $content = preg_replace("!!is","",$content); + + // script code 제거 + $content = preg_replace("!!is","",$content); + return $content; + } + +?> diff --git a/index.php b/index.php new file mode 100644 index 000000000..61e8fb861 --- /dev/null +++ b/index.php @@ -0,0 +1,50 @@ +init(); + + /** + * @brief ModuleHandler 객체를 생성/ 실행 + * + * 모듈 핸들러는 Request Argument를 바탕으로 모듈을 찾아서\n + * 객체를 생성하고 기본 정보를 setting 해준다.\n + * ModuleHandler는 이 외에도 설치가 되어 있는지에 대한 체크를\n + * 하여 미설치시 Install 모듈을 실행하도록 한다\n + * 그리고 해당 모듈을 실행후 컨텐츠를 출력한다\n + **/ + $oModuleHandler = new ModuleHandler(); + $oModuleHandler->init(); + $oModule = &$oModuleHandler->procModule(); + $oModuleHandler->displayContent($oModule); +?> diff --git a/layouts/sample_layout_js_menu/conf/info.xml b/layouts/sample_layout_js_menu/conf/info.xml new file mode 100644 index 000000000..c9c3c27c3 --- /dev/null +++ b/layouts/sample_layout_js_menu/conf/info.xml @@ -0,0 +1,108 @@ + + + 견본 레이아웃 (JS 메뉴) + 样本布局(JS 菜单) + Sample Layout (Menu in JS) + Diseño predeterminado (menú JS) + レイアウトサンプル(JS) + + 제로 + zero + zero + zero + Zero + + 가장 기본적인 기능으로 이루어진 견본 레이아웃입니다. + main_menu, bottom_menu 2개의 메뉴로 구성되어 있으며 각 메뉴의 출력은 javascript 함수를 이용해서 출력합니다. + 레이아웃을 만들때 편리하지만 자유도가 떨어집니다. + + + 此布局是最基本的功能形成的样本布局。 + 此布局由 main_menu, bottom_menu 两个菜单构成,每个菜单的呼出方式是利用 javascript 函数显示。 + 制作布局的时候方便的同时自由度相对落后。 + + + This is a sample layout consists of the most basic features. + It has two menues each named 'main_menu' and 'bottom_menu', and they are displayed by using Javascript function. + Javascript version is so convenient to create layouts, but reduces the degree of freedom though. + + + Es el diseño predeterminado para funciónes basicos. Tiene 2 menús de main_menu, bottom_menu. La salida de cada menu usa funciónes de javascript. Es facil de manejar diseño, pero falta de libertad. + + + 一番基本的な機能で構成されたレイアウトのサンプルです。「main_menu」と「bottom_menu」2つのメニューで構成されていて、各メニューは「javascript」関数を用いて 出力します。 レイアウトをデザインする際に便利ですが、自由度は制限されます。 + + + + + 컬러셋 + 颜色 + Colorset + collección de colores + カラーセット + 원하시는 컬러셋을 선택해주세요. + 请选择颜色。 + Please select a colorset you want. + Seleccióne la collección de colores. + お好みのカラーセットを選択してください。 + + 적색 + 红色 + Red + Rojo + + red + + + 청색 + 青色 + Blue + Azul + + blue + + + + 상단 제목 + 顶部标题 + Title on the top + Título + 上段タイトル + 레이아웃의 상단에 표시할 제목을 입력하세요. + 请输入布局顶部显示的标题。(网站名称) + Please input a title to be displayed on the top of the layout. + Escribe el título para la pagína de web. + レイアウトの上段に表示するタイトルを入力してください。 + + + 홈 페이지 URL + 网站 URL + Home page URL + URL de pagína de web + ホームページ URL + 로고나 제목을 클릭시에 이동할 홈 페이지 URL을 입력해 주세요. + 点击网站LOGO或标题时要移动的页面URL。 + Please input URL to the page that you want to be loaded when a logo or title is clicked. + Escribe el URL para título. + ロゴまたはタイトルをクリックした際、移動するホームページの URL を入力してください。 + + + + + 주 메뉴 + 主 菜单 + Main menu + menú principal + メインメニュー + 2 + + + 하단 메뉴 + 底部菜单 + Menu on the bottom + sub menú + 下段メニュー + 1 + + + diff --git a/layouts/sample_layout_js_menu/css/layout.css b/layouts/sample_layout_js_menu/css/layout.css new file mode 100644 index 000000000..909ce6887 --- /dev/null +++ b/layouts/sample_layout_js_menu/css/layout.css @@ -0,0 +1,188 @@ +@charset "utf-8"; + +body { + margin:0px; + padding:0px; +} + +/** + * 레이아웃 style + **/ + +/** + * 상단 로고 및 메인 1차 메뉴 + **/ +.layout_top { + margin:10px 10px 0px 10px; +} + +/* 상단 로고 부분 */ +.layout_logo A { + font-weight:bold; + font-size:16pt; + color:#888888; + text-decoration:none; +} + +/* 상단 1차 메뉴 */ +.layout_first_menu { + border-bottom:2px solid #DDDDDD; + width:100%; + text-align:right; + padding:3px 0px 3px 0px; +} + +/** + * 좌측 메뉴 및 메인 2차 메뉴, 로그인 위젯 및 기타 + **/ +.layout_left { + width:220px; + float:left; + margin-top:10px; + position:absolute; + left:10px; +} + +/* 좌측 2차 메뉴 */ +.layout_second_menu { +} + +/* 좌측 관리자 메뉴 */ +.layout_admin { + margin-top:10px; + border:3px solid #EEEEEE; + padding:5px; + text-align:center; +} + +.layout_admin A { + color:#AAAAAA; + text-decoration:none; +} + +/* 컨텐츠 */ +.layout_content { + padding:10px 10px 0px 240px; +} + +#content { +} + +/** + * 하단 메뉴 영역 + **/ +.layout_bottom { + clear:both; + margin-top:20px; +} + +/* 하단 메뉴 */ +.layout_bottom_menu { + width:100%; + text-align:center; +} + +/** + * 메뉴 style, main_menu:1~3차, bottom_menu로 구성 + **/ + +/* 1차 메뉴 */ +.first_menu { + background-color:#999999; + padding:3px 10px 3px 10px; + margin-left:5px; +} + +.first_menu A { + font-weight:normal; + color:#FFFFFF; + text-decoration:none; +} + +.first_menu_selected { + background-color:#000000; + padding:3px 10px 3px 10px; + margin-left:5px; +} + +.first_menu_selected A { + color:#FFFFFF; + font-weight:bold; + text-decoration:none; +} + +/* 2차 메뉴 */ +.second_menu { + padding:5px 0px 5px 5px; + background-color:#AAAAAA; + display:block; + border-bottom:1px solid #999999; +} + +.second_menu A { + color:#FFFFFF; + text-decoration:none; + font-weight:normal; +} + +.second_menu_selected { + padding:5px 0px 5px 5px; + background-color:#666666; + display:block; + border-bottom:1px solid #444444; +} + +.second_menu_selected A { + color:#FFFFFF; + font-weight:bold; + text-decoration:none; +} + +/* 3차 메뉴 */ +.third_menu { + padding:5px 0px 5px 20px; + border-bottom:1px solid #EEEEEE; + display:block; +} + +.third_menu A { + color:#000000; + text-decoration:none; +} + +.third_menu_selected { + padding:5px 0px 5px 20px; + border-bottom:1px solid #EEEEEE; + font-weight:bold; + display:block; + background-color:#EFEFEF; +} + +.third_menu_selected A { + color:#000000; + font-weight:bold; + text-decoration:none; +} + +/* 하단 메뉴 */ +.bottom_menu { + margin-right:5px; + font-weight:normal; +} + +.bottom_menu A { + color:#000000; + text-decoration:none; +} + +.bottom_menu_selected { + margin-right:5px; + font-weight:bold; +} + +.bottom_menu_selected A { + color:#000000; + font-weight:bold; + text-decoration:none; +} + diff --git a/layouts/sample_layout_js_menu/js/layout.js b/layouts/sample_layout_js_menu/js/layout.js new file mode 100644 index 000000000..af2acc9c6 --- /dev/null +++ b/layouts/sample_layout_js_menu/js/layout.js @@ -0,0 +1,72 @@ +/** + * @brief sample_layout 메뉴 출력용 javascript + * @author zero (zero@nzeo.com) + **/ + +/** + * 메뉴를 담을 javascript 변수 + * + * xe_layout_menu 구조 + * + * xe_layout_menu[메뉴명][depth][menu_srl] = Object + * + * Object { + * text : 메뉴 명 + * href : 연결할 주소 + * open_window : [Y|N] 새창으로 띄울 것인지에 대한 값 + * normal_btn : 이미지 버튼 + * hover_btn : 이미지 버튼일 경우 mouseover 일 경우 + * active_btn : 선택되어 있을 경우의 이미지 + * className : normal 상태의 className + * selectedClassName : 선택된 상태의 className + * selected : 선택된 메뉴라면 true, 아니면 false + * } + **/ +var xe_layout_menu = new Array(); + +/** + * @brief sample_layout에서 메뉴를 출력하는 함수 + * menu_name : 레이아웃 설정상의 메뉴 이름 + * depth : 입력된 단계 + * print_child : true로 하면 메뉴 출력중 하위 메뉴가 있을 시 출력 + **/ +function xe_print_menu(menu_name, depth, print_child) { + if(typeof(xe_layout_menu[menu_name])=='undefined' || typeof(xe_layout_menu[menu_name][depth])=='undefined') return; + if(typeof(print_child)=='undefined') print_child = false; + + var menu_list = xe_layout_menu[menu_name][depth]; + var html = ""; + + for(var menu_key in menu_list) { + var menu_obj = menu_list[menu_key]; + if(typeof(menu_obj)=='undefined'||!menu_obj) continue; + + if(!menu_obj.text && !menu_obj.normal_btn) continue; + + var className = menu_obj.className; + if(menu_obj.selected) className = menu_obj.selectedClassName; + + if(!menu_obj.href) menu_obj.href = "#"; + + // 텍스트일 경우 + if(!menu_obj.normal_btn) { + + if(menu_obj.open_window == "Y") html = ""+menu_obj.text+""; + else html = ""+menu_obj.text+""; + + // 이미지 버튼 일 경우 + } else if(menu_obj.normal_btn) { + if(!menu_obj.hover_btn) menu_obj.hover_btn = menu_obj.normal_btn; + if(!menu_obj.active_btn) menu_obj.active_btn = menu_obj.normal_btn; + + if(menu_obj.selected) menu_obj.normal_btn = menu_obj.active_btn; + + if(menu_obj.open_window == "Y") html = "\""+menu_obj.text+"\""; + else html = "\""+menu_obj.text+"\""; + } + + if(html) document.write(html); + + if(print_child && menu_obj.selected && typeof(xe_layout_menu[menu_name][depth+1])!='undefined') xe_print_menu('main_menu', depth+1, true); + } +} diff --git a/layouts/sample_layout_js_menu/layout.html b/layouts/sample_layout_js_menu/layout.html new file mode 100644 index 000000000..b209faee4 --- /dev/null +++ b/layouts/sample_layout_js_menu/layout.html @@ -0,0 +1,83 @@ + + + + + + + + + + +
+ + +
+ + + +
+ +
+ + +
+ + + + +
+ +
+ + + + + +
+ + +
+
{$content}
+ + +
+
+ +
+
+ +
diff --git a/layouts/sample_layout_php_menu/conf/info.xml b/layouts/sample_layout_php_menu/conf/info.xml new file mode 100644 index 000000000..602a1d52d --- /dev/null +++ b/layouts/sample_layout_php_menu/conf/info.xml @@ -0,0 +1,108 @@ + + + 견본 레이아웃 (PHP 메뉴) + 样本布局 (PHP 菜单) + Sample Layout (Menu in PHP) + レイアウトサンプル (PHP) + Diseño predeterminado (menú PHP) + + 제로 + zero + zero + Zero + zero + + 가장 기본적인 기능으로 이루어진 견본 레이아웃입니다. + main_menu, bottom_menu 2개의 메뉴로 구성되어 있으며 각 메뉴의 출력은 php 코드로 하게 됩니다. + 레이아웃을 만들때 js menu 보다는 복잡하지만 자유도가 높습니다. + + + 此布局是最基本的功能形成的样本布 + 此布局由 main_menu, bottom_menu 两个菜单构成,每个菜单的呼出方式是利用 PHP 显示。 + 制作布局时候复杂的同时自由度相对提高。 + + + This is a sample layout consists of the most basic features. + It has two menues each named 'main_menu' and 'bottom_menu', and they are displayed by using PHP codes. + PHP version is more complex to create layouts than with Javascript, but increases the degree of freedom though. + + + 一番基本的な機能で作られているレイアウト見本です。main_menu, bottom_menu 2個のメニューで構成され、各メニューの出力は php コードになります。 レイアウトを作る時、js menu よりは複雑ですが自由度は高いです。 + + + Es el diseño predeterminado para funciónes basicos. Tiene 2 menús de main_menu, bottom_menu. La salida de cada menu usa las funciónes de PHP. Es dificil de manejar diseño, pero mucho de libertad. + + + + + 컬러셋 + 颜色 + Colorset + カラーセット + collección de colores + 원하시는 컬러셋을 선택해주세요. + 请选择颜色。 + Please select a colorset you want. + 希望する色を選択してください。 + Seleccióne la collección de colores. + + 적색 + 红色 + Red + 赤色 + Rojo + red + + + 청색 + 青色 + Blue + 青色 + Azul + blue + + + + 상단 제목 + 顶部标题 + Title on the top + 上端タイトル + Título + 레이아웃의 상단에 표시할 제목을 입력하세요. + 请输入布局顶部显示的标题。(网站名称) + Please input a title which will be displayed on top of the layout. + レイアウトの上端に表示するタイトルを入力してください。 + Escribe el título para la pagína de web. + + + 홈 페이지 URL + 网站 URL + Homepage URL + ホームページ URL + URL de pagína de web + 로고나 제목을 클릭시에 이동할 홈 페이지 URL을 입력해 주세요. + 点击网站LOGO或标题时要移动的页面URL。 + Please input a homepage URL, which will be connected when you click. + ロゴをクリックした時に移動するホームページのURLを入力してください。 + Escribe el URL para título. + + + + + 주 메뉴 + 主菜单 + Main menu + メインメニュー + menú principal + 2 + + + 하단 메뉴 + 底部菜单 + Bottom menu + 下端メニュー + sub menú + 1 + + + diff --git a/layouts/sample_layout_php_menu/css/layout.css b/layouts/sample_layout_php_menu/css/layout.css new file mode 100644 index 000000000..909ce6887 --- /dev/null +++ b/layouts/sample_layout_php_menu/css/layout.css @@ -0,0 +1,188 @@ +@charset "utf-8"; + +body { + margin:0px; + padding:0px; +} + +/** + * 레이아웃 style + **/ + +/** + * 상단 로고 및 메인 1차 메뉴 + **/ +.layout_top { + margin:10px 10px 0px 10px; +} + +/* 상단 로고 부분 */ +.layout_logo A { + font-weight:bold; + font-size:16pt; + color:#888888; + text-decoration:none; +} + +/* 상단 1차 메뉴 */ +.layout_first_menu { + border-bottom:2px solid #DDDDDD; + width:100%; + text-align:right; + padding:3px 0px 3px 0px; +} + +/** + * 좌측 메뉴 및 메인 2차 메뉴, 로그인 위젯 및 기타 + **/ +.layout_left { + width:220px; + float:left; + margin-top:10px; + position:absolute; + left:10px; +} + +/* 좌측 2차 메뉴 */ +.layout_second_menu { +} + +/* 좌측 관리자 메뉴 */ +.layout_admin { + margin-top:10px; + border:3px solid #EEEEEE; + padding:5px; + text-align:center; +} + +.layout_admin A { + color:#AAAAAA; + text-decoration:none; +} + +/* 컨텐츠 */ +.layout_content { + padding:10px 10px 0px 240px; +} + +#content { +} + +/** + * 하단 메뉴 영역 + **/ +.layout_bottom { + clear:both; + margin-top:20px; +} + +/* 하단 메뉴 */ +.layout_bottom_menu { + width:100%; + text-align:center; +} + +/** + * 메뉴 style, main_menu:1~3차, bottom_menu로 구성 + **/ + +/* 1차 메뉴 */ +.first_menu { + background-color:#999999; + padding:3px 10px 3px 10px; + margin-left:5px; +} + +.first_menu A { + font-weight:normal; + color:#FFFFFF; + text-decoration:none; +} + +.first_menu_selected { + background-color:#000000; + padding:3px 10px 3px 10px; + margin-left:5px; +} + +.first_menu_selected A { + color:#FFFFFF; + font-weight:bold; + text-decoration:none; +} + +/* 2차 메뉴 */ +.second_menu { + padding:5px 0px 5px 5px; + background-color:#AAAAAA; + display:block; + border-bottom:1px solid #999999; +} + +.second_menu A { + color:#FFFFFF; + text-decoration:none; + font-weight:normal; +} + +.second_menu_selected { + padding:5px 0px 5px 5px; + background-color:#666666; + display:block; + border-bottom:1px solid #444444; +} + +.second_menu_selected A { + color:#FFFFFF; + font-weight:bold; + text-decoration:none; +} + +/* 3차 메뉴 */ +.third_menu { + padding:5px 0px 5px 20px; + border-bottom:1px solid #EEEEEE; + display:block; +} + +.third_menu A { + color:#000000; + text-decoration:none; +} + +.third_menu_selected { + padding:5px 0px 5px 20px; + border-bottom:1px solid #EEEEEE; + font-weight:bold; + display:block; + background-color:#EFEFEF; +} + +.third_menu_selected A { + color:#000000; + font-weight:bold; + text-decoration:none; +} + +/* 하단 메뉴 */ +.bottom_menu { + margin-right:5px; + font-weight:normal; +} + +.bottom_menu A { + color:#000000; + text-decoration:none; +} + +.bottom_menu_selected { + margin-right:5px; + font-weight:bold; +} + +.bottom_menu_selected A { + color:#000000; + font-weight:bold; + text-decoration:none; +} + diff --git a/layouts/sample_layout_php_menu/layout.html b/layouts/sample_layout_php_menu/layout.html new file mode 100644 index 000000000..eb08826c9 --- /dev/null +++ b/layouts/sample_layout_php_menu/layout.html @@ -0,0 +1,101 @@ + + + + +
+ + +
+ + + + + + {@ $class_name = 'first_menu_selected'} + {@ $second_menu_list = $val['list']} + + {@ $class_name = 'first_menu'} + + + + onclick="window.open(this.href);return false;">{$val['text']} + + + + + +
+
+ + +
+ + + + +
+ + + + {@ $class_name = 'second_menu_selected'} + + {@ $class_name = 'second_menu'} + + + + onclick="window.open(this.href);return false;">{$val['text']} + + + + + + + {@ $class_name = 'third_menu_selected'} + + {@ $class_name = 'third_menu'} + + + + onclick="window.open(this.href);return false;">{$v['text']} + + + + + + +
+ + + + + +
+ + +
+
{$content}
+ + +
+ + + + {@ $class_name = 'bottom_menu_selected'} + + {@ $class_name = 'bottom_menu'} + + + + onclick="window.open(this.href);return false;">{$val['text']} + + + +
+ +
+ diff --git a/layouts/xe_official/conf/info.xml b/layouts/xe_official/conf/info.xml new file mode 100644 index 000000000..9e7e99f4e --- /dev/null +++ b/layouts/xe_official/conf/info.xml @@ -0,0 +1,124 @@ + + + ZBXE 공식 사이트 레이아웃 + ZBXEオフィシャルレイアウト + ZBXE Official website layout + ZBXE 官方网站布局 + + zero + Zero + zero + zero + + 제로보드XE 공식 사이트 레이아웃입니다. + 디자인 : 이소라 + 퍼블리싱 : 정찬명 + 레이아웃 제작 : zero + + + ゼロボードXEのオフィシャルサイトのレイアウトです。 + デザイン:イソラ + パブリシング:ジョンチャンミョン + レイアウト作成:Zero + + + This layout is the ZeroboardXE Official website layout. + Designer : So-Ra Lee + HTML/CSS : Chan-Myung Jeong + Layout producer : zero + + + ZBXE 官方网站布局。 + 设计 : So-Ra Lee + HTML/CSS : Chan-Myung Jeong + 布局 : zero + + + + + 컬러셋 + カラーセット + 颜色 + Colorset + colecciónes de colores + 원하시는 컬러셋을 선택해주세요. + 希望する色を選択してください。 + 请选择颜色。 + Select colorset the colorset you want. + Seleccióne la colección de colores. + + 기본 + デフォルト + Basic + 默认 + default + + + 검은색 + + Black + 黑色 + black + + + 하얀색 + + white + 白色 + white + + + + 로고이미지 + ロゴのイメージ + LOGO图片 + Logo image + Imagen de logotipo + 레이아웃의 상단에 표시될 로고이미지를 입력하세요. (세로길이가 100px인 투명이미지가 가장 어울립니다) + レイアウトの上端に表示されるロゴイメージを入力してください。 (縦幅が100pxである透明イメージが最も合います。) + 请输入显示在布局顶部的LOGO图片。(高度为100px的透明图片为适。) + Please input a logo image which will be displayed on the top of layout. (Transparent image with height of 100px is recommended.) + Cargar archivo para logotipo. (Mejor imagen transparente con altura de 100px) + + + 홈 페이지 URL + ホームページ URL + 网站 URL + Homepage URL + URL de logotipo + 로고를 클릭시에 이동할 홈 페이지 URL을 입력해 주세요. + ロゴをクリックした時に移動するホームページのURLを入力してください。 + 点击网站LOGO时要移动的页面URL。 + Please input the URL to redirect when user clicks the logo + Escribe URL para mover cuando los usuarios haga clic en logotipo. + + + 배경 이미지 + 背景イメージ + 背景图片 + Background Image + 배경 이미지를 사용하시려면 등록해주세요. + 背景イメージを使う場合は、登録してください。 + 要想使用背景图片请在这里上传。 + Please input if you want to use background image. + + + + + 상단 메뉴 + 上端メニュー + 主菜单 + Top menu + Menu Principal + 3 + + + 하단 메뉴 + 下段メニュー + 底部菜单 + Bottom menu + sub menu + 1 + + + diff --git a/layouts/xe_official/css/black.css b/layouts/xe_official/css/black.css new file mode 100644 index 000000000..d4323907c --- /dev/null +++ b/layouts/xe_official/css/black.css @@ -0,0 +1,87 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +/* Black Skin - Start */ + +/* Site Layout - Body Wrap */ +body { background:#3d3d3d url(../images/black/bgBody.gif) repeat-x;} +#bodyWrap { position:relative; width:980px; margin:0 auto; padding:1.5em 0 0 0;} + +/* Site Layout - Header */ +#header { position:relative; width:980px; height:120px; background:url(../images/black/bgHeader.jpg) no-repeat right top; margin-bottom:10px; z-index:99;} +#header h1 { position:absolute; top:32px; left:25px;} +#language { position:absolute; top:18px; right:19px; z-index:100;} +#language strong { color:#ffffff; font:.75em Tahoma; margin-right:3px;} +#language a img { vertical-align:-5px;} +#language ul { position:absolute; top:15px; right:0px; display:none; border:1px solid #282827; background:#3d3d3d;} +#language ul li { list-style:none; } +#language ul li a { display:block; width:61px; padding:3px 8px; font:9px Tahoma; color:#cbcbcb; text-decoration:none;} +#language ul li a:hover { background:#373736;} + +#it_search_form { position:absolute; top:50px; right:15px;} +#it_search_form .input { border:1px solid #bc4032; height:17px; width:120px; color:#888888; font-size:.9em;} +#it_search_form .submit_button { width:1px; height:1px; visibility:hidden; } + +#gnb { position:absolute; top:82px; left:0; height:38px; overflow:hidden; white-space:nowrap; margin-bottom:10px;} +#gnb li { list-style:none; float:left; background:url(../images/black/bgGnbVr.gif) no-repeat left center; padding-left:2px; position:relative; left:-2px; white-space:nowrap;} +#gnb li a { display:block; float:left; padding:13px 15px 0 15px; height:25px; color:#a6a6a6; white-space:nowrap; text-decoration:none; font-family:"돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;} +#gnb li a:hover, +#gnb li a:focus { color:#ffffff;} +#gnb li.on a { font-weight:bold; color:#ffffff; background:url(../images/black/bgGnbOn.gif) no-repeat center top;} + +#isSearch { position:absolute; top:48px; right:15px; width:214px; text-align:right;} +#isSearch .searchOrder { display:none;} +#isSearch .checked { position:absolute; left:0; top:0; text-align:left; display:block; padding:5px 0 0 5px; width:64px; height:14px; background:url(../images/black/bgSearchTerm.gif) no-repeat; font:11px "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; color:#ffffff; line-height:normal;} +#isSearch ul { display:none; position:absolute; left:0; top:18px; padding:2px 0 3px 0; text-align:left; border:1px solid #6e8081; background:#385153;} +#isSearch ul li { width:67px; height:18px; list-style:none;} +#isSearch ul li input { display:none;} +#isSearch ul li label { display:block; padding:4px 0 0 4px; width:63px; height:15px; font:11px "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; color:#ffffff;} +#isSearch ul li label.on { background:#2f4345; } +#isSearch ul li label:hover, +#isSearch ul li label:focus { background:#2f4345;} +#isSearch .inputText { vertical-align:middle; _position:relative; _top:-1px; padding:3px 3px 1px 3px; width:94px; height:15px; color:#ffffff; border:none; background:url(../images/black/bgSearch.gif) no-repeat;} +#isSearch .inputText:hover, +#isSearch .inputText:focus { background:url(../images/black/bgSearchOn.gif) no-repeat;} +*:first-child+html #isSearch .inputText { position:relative; top:-1px;} +#isSearch .submit { vertical-align:middle; _position:relative; _top:-1px;} +*:first-child+html #isSearch .submit { position:relative; top:-1px;} + +/* Site Layout - Content Body */ +#contentBody { position:relative; width:980px; padding-bottom:30px; overflow:hidden; background:url(../images/black/bgContentBody.gif) repeat-y left top; border-bottom:1px solid #515151;} + +/* Site Layout - Column Left */ +#columnLeft { position:relative; width:201px; float:left;} +#columnLeft .mask { width:201px; height:5px; background:#3d3d3d; display:block;} +#lnb { border-top:1px solid #515151; padding:4px 5px; width:190px;} +#lnb li { list-style:none; padding-bottom:4px;} +#lnb li a { padding:6px 5px 6px 13px; width:170px; display:block; border:1px solid #565655; background:url(../images/black/bgLnbOff.gif) repeat-x; color:#c2c2c2; position:relative; z-index:99; text-decoration:none;} +#lnb li a:hover, +#lnb li a:focus { color:#ffffff; background:#e61700; border:1px solid #ff1a00;} +#lnb li.on a { color:#ffffff; background:#e61700; border:1px solid #ff1a00;} +#lnb li.on a:hover, +#lnb li.on a:focus { font-weight:bold;} +#lnb li ul { display:none; position:relative; width:184px; padding:0 3px; position:relative; border-top:1px solid #3d3d3d; overflow:hidden;} +#lnb li.on ul { display:block;} +#lnb li ul li { padding:0; border-top:1px solid #474747; position:relative; top:-1px;} +#lnb li ul li a { padding:6px 5px 6px 10px; width:169px; color:#818181 !important; border:none; background:none !important; border:none !important;} +#lnb li ul li a:hover, +#lnb li ul li a:focus { font-weight:normal !important; color:#de4332 !important;} +#lnb li.on ul li.on a { color:#ff1a00 !important; font-weight:bold !important; background:url(../images/black/bulletLnb.gif) no-repeat 175px center !important;} + +/* Site Layout - Column Right */ +#columnRight { width:770px; float:right; overflow:hidden;} +#visualArea { width:770px; height:200px; background:#151514; margin-bottom:2.5em; position:relative; left:-15px; margin-right:-15px; color:#999999;} +#content { width:100%; overflow:hidden;} + +/* Site Layout - Footer */ +#footer { border-top:3px solid #424242; text-align:center; padding:2em 0 4em; clear:both;} +#footer li { display:inline; padding:0 .6em 0 1em; background:url(../images/black/vrType1.gif) no-repeat left center;} +#footer li.first-child { background:none;} +#footer li a { color:#818181; font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;} +#footer li address { display:inline; } + +/* Black Skin - End */ + diff --git a/layouts/xe_official/css/default.css b/layouts/xe_official/css/default.css new file mode 100644 index 000000000..0fd2ffbb9 --- /dev/null +++ b/layouts/xe_official/css/default.css @@ -0,0 +1,87 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +/* Default Skin - Start */ + +/* Site Layout - Body Wrap */ +body { background:url(../images/default/bgBody.gif) repeat-x;} +#bodyWrap { position:relative; width:980px; margin:0 auto; padding:1.5em 0 0 0;} + +/* Site Layout - Header */ +#header { position:relative; width:980px; height:120px; background:url(../images/default/bgHeader.jpg) no-repeat right top; margin-bottom:10px; z-index:99;} +#header h1 { position:absolute; top:32px; left:25px;} +#language { position:absolute; top:18px; right:19px; z-index:100;} +#language strong { color:#ffffff; font:.75em Tahoma; margin-right:3px;} +#language a img { vertical-align:-5px;} +#language ul { position:absolute; top:15px; right:0px; display:none; border:1px solid #b23628; background:#de4332;} +#language ul li { list-style:none; } +#language ul li a { display:block; width:61px; padding:3px 8px; font:9px Tahoma; color:#ffffff; text-decoration:none;} +#language ul li a:hover { background:#bc4032;} + +#it_search_form { position:absolute; top:50px; right:15px;} +#it_search_form .input { border:1px solid #bc4032; height:17px; width:120px; color:#888888; font-size:.9em;} +#it_search_form .submit_button { width:1px; height:1px; visibility:hidden; } + +#gnb { position:absolute; top:82px; left:0; height:38px; overflow:hidden; white-space:nowrap; margin-bottom:10px;} +#gnb li { float:left; list-style:none; background:url(../images/default/bgGnbVr.gif) no-repeat left center; padding-left:2px; position:relative; left:-2px; white-space:nowrap;} +#gnb li a { display:block; float:left; padding:13px 15px 0 15px; height:25px; color:#e8e8e8; white-space:nowrap; text-decoration:none; font-family:"돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;} +#gnb li a:hover, +#gnb li a:focus { color:#ffffff;} +#gnb li.on a { font-weight:bold; color:#ffffff; background:url(../images/default/bgGnbOn.gif) no-repeat center top;} + +#isSearch { position:absolute; top:48px; right:15px; width:214px; text-align:right;} +#isSearch .searchOrder { display:none;} +#isSearch .checked { position:absolute; left:0; top:0; text-align:left; display:block; padding:5px 0 0 5px; width:64px; height:14px; background:url(../images/default/bgSearchTerm.gif) no-repeat; font:11px "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; color:#ffffff; line-height:normal;} +#isSearch ul { display:none; position:absolute; left:0; top:18px; padding:2px 0 3px 0; text-align:left; border:1px solid #919898; background:#536c6d;} +#isSearch ul li { width:67px; height:18px; list-style:none; } +#isSearch ul li input { display:none;} +#isSearch ul li label { display:block; padding:4px 0 0 4px; width:63px; height:15px; font:11px "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; color:#ffffff;} +#isSearch ul li label.on { background:#455a5b; } +#isSearch ul li label:hover, +#isSearch ul li label:focus { background:#455a5b;} +#isSearch .inputText { vertical-align:middle; _position:relative; _top:-1px; padding:3px 3px 1px 3px; width:94px; height:15px; color:#ffffff; border:none; background:url(../images/default/bgSearch.gif) no-repeat;} +#isSearch .inputText:hover, +#isSearch .inputText:focus { background:url(../images/default/bgSearchOn.gif) no-repeat;} +*:first-child+html body#default #isSearch .inputText { position:relative; top:-1px;} +#isSearch .submit { vertical-align:middle; _position:relative; _top:-1px;} +*:first-child+html body#default #isSearch .submit { position:relative; top:-1px;} + +/* Site Layout - Content Body */ +#contentBody { position:relative; width:980px; padding-bottom:30px; overflow:hidden; background:url(../images/default/bgContentBody.gif) repeat-y left top; border-bottom:1px solid #dddddd;} + +/* Site Layout - Column Left */ +#columnLeft { position:relative; width:201px; float:left;} +#columnLeft .mask { width:201px; height:5px; background:#ffffff; display:block;} + +#lnb { border-top:1px solid #dddddd; padding:4px 5px; width:190px;} +#lnb li { padding-bottom:4px;} +#lnb li a { padding:6px 5px 6px 13px; width:170px; display:block; border:1px solid #e8e8e8; background:url(../images/default/bgLnbOff.gif) repeat-x; color:#3e3e3e; position:relative; z-index:99; text-decoration:none;} +#lnb li a:hover, +#lnb li a:focus { color:#ffffff; background:#de4332; border:1px solid #de4332;} +#lnb li.on a { color:#ffffff; background:#de4332; border:1px solid #de4332;} +#lnb li.on a:hover, +#lnb li.on a:focus { font-weight:bold;} +#lnb li ul { display:none; position:relative; width:184px; padding:0 3px; position:relative; border-top:1px solid #ffffff; overflow:hidden;} +#lnb li.on ul { display:block;} +#lnb li ul li { padding:0; border-top:1px solid #f2f2f2; position:relative; top:-1px;} +#lnb li ul li a { padding:6px 5px 6px 10px; width:169px; color:#818181 !important; border:none; background:none !important; border:none !important;} +#lnb li ul li a:hover, +#lnb li ul li a:focus { font-weight:normal !important; color:#de4332 !important;} +#lnb li.on ul li.on a { color:#ff1a00 !important; font-weight:bold !important; background:url(../images/default/bulletLnb.gif) no-repeat 175px center !important;} + +/* Site Layout - Column Right */ +#columnRight { width:770px; float:right; overflow:hidden;} +#visualArea { width:770px; height:200px; background:#f5f5f5; margin-bottom:2.5em; position:relative; left:-15px; margin-right:-15px;} +#content { width:100%; overflow:hidden;} + +/* Site Layout - Footer */ +#footer { border-top:3px solid #f4f4f4; text-align:center; padding:2em 0 4em; clear:both;} +#footer li { display:inline; padding:0 .6em 0 1em; background:url(../images/default/vrType1.gif) no-repeat left center;} +#footer li.first-child { background:none;} +#footer li a { color:#999999; font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;} +#footer li address { display:inline; } + +/* Default Skin - End */ diff --git a/layouts/xe_official/css/white.css b/layouts/xe_official/css/white.css new file mode 100644 index 000000000..059a803e8 --- /dev/null +++ b/layouts/xe_official/css/white.css @@ -0,0 +1,87 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +/* White Skin - Start */ + +/* Site Layout - Body Wrap */ +body { background:#ffffff;} +#bodyWrap { position:relative; width:980px; margin:0 auto; padding:1.5em 0 0 0;} + +/* Site Layout - Header */ +#header { position:relative; width:978px; height:114px; border-top:6px solid #323232; border-left:1px solid #d9d9d9; border-right:1px solid #d9d9d9; background:url(../images/white/bgHeader.png) no-repeat right bottom; margin-bottom:10px; z-index:99;} +#header h1 { position:absolute; top:26px; left:25px;} +#language { position:absolute; top:12px; right:19px; z-index:100;} +#language strong { color:#5c5c5c; font:.75em Tahoma; margin-right:3px;} +#language a img { vertical-align:-5px;} +#language ul { position:absolute; top:15px; right:0px; display:none; border:1px solid #d9d9d9; background:#ffffff;} +#language ul li { list-style:none; } +#language ul li a { display:block; width:61px; padding:3px 8px; font:9px Tahoma; color:#5c5c5c; text-decoration:none;} +#language ul li a:hover { background:#f4f4f4;} + +#it_search_form { position:absolute; top:50px; right:15px;} +#it_search_form .input { border:1px solid #d9d9d9; height:17px; width:120px; color:#888888; font-size:.9em;} +#it_search_form .submit_button { width:1px; height:1px; visibility:hidden; } + +#gnb { position:absolute; top:76px; left:0; height:38px; overflow:hidden; white-space:nowrap; margin-bottom:10px;} +#gnb li { list-style:none; float:left; background:url(../images/white/bgGnbVr.gif) no-repeat left center; padding-left:2px; position:relative; left:-2px; white-space:nowrap;} +#gnb li a { display:block; float:left; padding:13px 15px 0 15px; height:25px; color:#727272; white-space:nowrap; text-decoration:none; font-family:"돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;} +#gnb li a:hover, +#gnb li a:focus { color:#000000;} +#gnb li.on a { font-weight:bold; color:#3f3f3f; background:url(../images/white/bgGnbOn.gif) no-repeat center top;} + +#isSearch { position:absolute; top:48px; right:15px; width:214px; text-align:right;} +#isSearch .searchOrder { display:none;} +#isSearch .checked { position:absolute; left:0; top:0; text-align:left; display:block; padding:5px 0 0 5px; width:64px; height:14px; background:url(../images/white/bgSearchTerm.gif) no-repeat; font:11px "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; color:#5c5c5c; line-height:normal;} +#isSearch ul { display:none; position:absolute; left:0; top:18px; padding:2px 0 3px 0; text-align:left; border:1px solid #b2b2b2; background:#ffffff; overflow:hidden;} +#isSearch ul li { width:67px; height:18px; list-style:none;} +#isSearch ul li input { display:none;} +#isSearch ul li label { display:block; padding:4px 0 0 4px; width:63px; height:15px; font:11px "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; color:#5c5c5c;} +#isSearch ul li label.on { background:#ededed; } +#isSearch ul li label:hover, +#isSearch ul li label:focus { background:#ededed;} +#isSearch .inputText { vertical-align:middle; _position:relative; _top:-1px; padding:3px 3px 1px 3px; width:94px; height:15px; color:#5c5c5c; border:none; background:url(../images/white/bgSearch.gif) no-repeat;} +#isSearch .inputText:hover, +#isSearch .inputText:focus { background:url(../images/white/bgSearchOn.gif) no-repeat;} +*:first-child+html #isSearch .inputText { position:relative; top:-1px;} +#isSearch .submit { vertical-align:middle; _position:relative; _top:-1px;} +*:first-child+html #isSearch .submit { position:relative; top:-1px;} + +/* Site Layout - Content Body */ +#contentBody { position:relative; width:980px; padding-bottom:30px; overflow:hidden; background:url(../images/white/bgContentBody.gif) repeat-y left top; border-bottom:1px solid #dddddd;} + +/* Site Layout - Column Left */ +#columnLeft { position:relative; width:201px; float:left;} +#columnLeft .mask { width:201px; height:5px; background:#ffffff; display:block;} + +#lnb { border-top:1px solid #dddddd; padding:4px 5px; width:190px;} +#lnb li { list-style:none; padding-bottom:4px;} +#lnb li a { padding:6px 5px 6px 13px; width:170px; display:block; border:1px solid #e8e8e8; background:url(../images/white/bgLnbOff.gif) repeat-x; color:#3e3e3e; position:relative; z-index:99; text-decoration:none;} +#lnb li a:hover, +#lnb li a:focus { color:#ffffff; background:#de4332; border:1px solid #de4332;} +#lnb li.on a { color:#ffffff; background:#de4332; border:1px solid #de4332;} +#lnb li.on a:hover, +#lnb li.on a:focus { font-weight:bold;} +#lnb li ul { display:none; position:relative; width:184px; padding:0 3px; position:relative; border-top:1px solid #ffffff; overflow:hidden;} +#lnb li.on ul { display:block;} +#lnb li ul li { padding:0; border-top:1px solid #f2f2f2; position:relative; top:-1px;} +#lnb li ul li a { padding:6px 5px 6px 10px; width:169px; color:#818181 !important; border:none; background:none !important; border:none !important;} +#lnb li ul li a:hover, +#lnb li ul li a:focus { font-weight:normal !important; color:#de4332 !important;} +#lnb li.on ul li.on a { color:#ff1a00 !important; font-weight:bold !important; background:url(../images/white/bulletLnb.gif) no-repeat 175px center !important;} + +/* Site Layout - Column Right */ +#columnRight { width:770px; float:right; overflow:hidden;} +#visualArea { width:770px; height:200px; background:#f5f5f5; margin-bottom:2.5em; position:relative; left:-15px; margin-right:-15px;} +#content { width:100%; overflow:hidden;} + +/* Site Layout - Footer */ +#footer { border-top:3px solid #f4f4f4; text-align:center; padding:2em 0 4em; clear:both;} +#footer li { display:inline; padding:0 .6em 0 1em; background:url(../images/white/vrType1.gif) no-repeat left center;} +#footer li.first-child { background:none;} +#footer li a { color:#999999; font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;} +#footer li address { display:inline; } + +/* White Skin - End */ diff --git a/layouts/xe_official/images/black/bgBody.gif b/layouts/xe_official/images/black/bgBody.gif new file mode 100644 index 000000000..9f6ef7a17 Binary files /dev/null and b/layouts/xe_official/images/black/bgBody.gif differ diff --git a/layouts/xe_official/images/black/bgContentBody.gif b/layouts/xe_official/images/black/bgContentBody.gif new file mode 100644 index 000000000..d60d2593d Binary files /dev/null and b/layouts/xe_official/images/black/bgContentBody.gif differ diff --git a/layouts/xe_official/images/black/bgGnbOn.gif b/layouts/xe_official/images/black/bgGnbOn.gif new file mode 100644 index 000000000..265b43dd7 Binary files /dev/null and b/layouts/xe_official/images/black/bgGnbOn.gif differ diff --git a/layouts/xe_official/images/black/bgGnbVr.gif b/layouts/xe_official/images/black/bgGnbVr.gif new file mode 100644 index 000000000..a4225744b Binary files /dev/null and b/layouts/xe_official/images/black/bgGnbVr.gif differ diff --git a/layouts/xe_official/images/black/bgHeader.jpg b/layouts/xe_official/images/black/bgHeader.jpg new file mode 100644 index 000000000..911fb24ba Binary files /dev/null and b/layouts/xe_official/images/black/bgHeader.jpg differ diff --git a/layouts/xe_official/images/black/bgLnbOff.gif b/layouts/xe_official/images/black/bgLnbOff.gif new file mode 100644 index 000000000..46414ff68 Binary files /dev/null and b/layouts/xe_official/images/black/bgLnbOff.gif differ diff --git a/layouts/xe_official/images/black/bgSearch.gif b/layouts/xe_official/images/black/bgSearch.gif new file mode 100644 index 000000000..693382a03 Binary files /dev/null and b/layouts/xe_official/images/black/bgSearch.gif differ diff --git a/layouts/xe_official/images/black/bgSearchOn.gif b/layouts/xe_official/images/black/bgSearchOn.gif new file mode 100644 index 000000000..67dce8d9a Binary files /dev/null and b/layouts/xe_official/images/black/bgSearchOn.gif differ diff --git a/layouts/xe_official/images/black/bgSearchTerm.gif b/layouts/xe_official/images/black/bgSearchTerm.gif new file mode 100644 index 000000000..7811700f0 Binary files /dev/null and b/layouts/xe_official/images/black/bgSearchTerm.gif differ diff --git a/layouts/xe_official/images/black/bulletD0.gif b/layouts/xe_official/images/black/bulletD0.gif new file mode 100644 index 000000000..e8e17d4c6 Binary files /dev/null and b/layouts/xe_official/images/black/bulletD0.gif differ diff --git a/layouts/xe_official/images/black/bulletFF1A00.gif b/layouts/xe_official/images/black/bulletFF1A00.gif new file mode 100644 index 000000000..4026f2521 Binary files /dev/null and b/layouts/xe_official/images/black/bulletFF1A00.gif differ diff --git a/layouts/xe_official/images/black/bulletLnb.gif b/layouts/xe_official/images/black/bulletLnb.gif new file mode 100644 index 000000000..6674d3765 Binary files /dev/null and b/layouts/xe_official/images/black/bulletLnb.gif differ diff --git a/layouts/xe_official/images/black/buttonLang.gif b/layouts/xe_official/images/black/buttonLang.gif new file mode 100644 index 000000000..317e15833 Binary files /dev/null and b/layouts/xe_official/images/black/buttonLang.gif differ diff --git a/layouts/xe_official/images/black/buttonSearch.gif b/layouts/xe_official/images/black/buttonSearch.gif new file mode 100644 index 000000000..38abbd359 Binary files /dev/null and b/layouts/xe_official/images/black/buttonSearch.gif differ diff --git a/layouts/xe_official/images/black/lineNotice.gif b/layouts/xe_official/images/black/lineNotice.gif new file mode 100644 index 000000000..fa69fd4ba Binary files /dev/null and b/layouts/xe_official/images/black/lineNotice.gif differ diff --git a/layouts/xe_official/images/black/powerdByZeroboard.gif b/layouts/xe_official/images/black/powerdByZeroboard.gif new file mode 100644 index 000000000..a98a02e2f Binary files /dev/null and b/layouts/xe_official/images/black/powerdByZeroboard.gif differ diff --git a/layouts/xe_official/images/black/vrType1.gif b/layouts/xe_official/images/black/vrType1.gif new file mode 100644 index 000000000..65772afee Binary files /dev/null and b/layouts/xe_official/images/black/vrType1.gif differ diff --git a/layouts/xe_official/images/black/zeroBoardXE.png b/layouts/xe_official/images/black/zeroBoardXE.png new file mode 100644 index 000000000..705d43e03 Binary files /dev/null and b/layouts/xe_official/images/black/zeroBoardXE.png differ diff --git a/layouts/xe_official/images/blank.gif b/layouts/xe_official/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/layouts/xe_official/images/blank.gif differ diff --git a/layouts/xe_official/images/default/bgBody.gif b/layouts/xe_official/images/default/bgBody.gif new file mode 100644 index 000000000..bb0aacf94 Binary files /dev/null and b/layouts/xe_official/images/default/bgBody.gif differ diff --git a/layouts/xe_official/images/default/bgContentBody.gif b/layouts/xe_official/images/default/bgContentBody.gif new file mode 100644 index 000000000..b2cc35fc0 Binary files /dev/null and b/layouts/xe_official/images/default/bgContentBody.gif differ diff --git a/layouts/xe_official/images/default/bgGnbOn.gif b/layouts/xe_official/images/default/bgGnbOn.gif new file mode 100644 index 000000000..265b43dd7 Binary files /dev/null and b/layouts/xe_official/images/default/bgGnbOn.gif differ diff --git a/layouts/xe_official/images/default/bgGnbVr.gif b/layouts/xe_official/images/default/bgGnbVr.gif new file mode 100644 index 000000000..a4225744b Binary files /dev/null and b/layouts/xe_official/images/default/bgGnbVr.gif differ diff --git a/layouts/xe_official/images/default/bgHeader.jpg b/layouts/xe_official/images/default/bgHeader.jpg new file mode 100644 index 000000000..83396cd7e Binary files /dev/null and b/layouts/xe_official/images/default/bgHeader.jpg differ diff --git a/layouts/xe_official/images/default/bgLnbOff.gif b/layouts/xe_official/images/default/bgLnbOff.gif new file mode 100644 index 000000000..64e2f9f57 Binary files /dev/null and b/layouts/xe_official/images/default/bgLnbOff.gif differ diff --git a/layouts/xe_official/images/default/bgSearch.gif b/layouts/xe_official/images/default/bgSearch.gif new file mode 100644 index 000000000..09953f995 Binary files /dev/null and b/layouts/xe_official/images/default/bgSearch.gif differ diff --git a/layouts/xe_official/images/default/bgSearchOn.gif b/layouts/xe_official/images/default/bgSearchOn.gif new file mode 100644 index 000000000..0b9f92295 Binary files /dev/null and b/layouts/xe_official/images/default/bgSearchOn.gif differ diff --git a/layouts/xe_official/images/default/bgSearchTerm.gif b/layouts/xe_official/images/default/bgSearchTerm.gif new file mode 100644 index 000000000..a2836640c Binary files /dev/null and b/layouts/xe_official/images/default/bgSearchTerm.gif differ diff --git a/layouts/xe_official/images/default/bulletD0.gif b/layouts/xe_official/images/default/bulletD0.gif new file mode 100644 index 000000000..e8e17d4c6 Binary files /dev/null and b/layouts/xe_official/images/default/bulletD0.gif differ diff --git a/layouts/xe_official/images/default/bulletFF1A00.gif b/layouts/xe_official/images/default/bulletFF1A00.gif new file mode 100644 index 000000000..4026f2521 Binary files /dev/null and b/layouts/xe_official/images/default/bulletFF1A00.gif differ diff --git a/layouts/xe_official/images/default/bulletLnb.gif b/layouts/xe_official/images/default/bulletLnb.gif new file mode 100644 index 000000000..6674d3765 Binary files /dev/null and b/layouts/xe_official/images/default/bulletLnb.gif differ diff --git a/layouts/xe_official/images/default/buttonLang.gif b/layouts/xe_official/images/default/buttonLang.gif new file mode 100644 index 000000000..317e15833 Binary files /dev/null and b/layouts/xe_official/images/default/buttonLang.gif differ diff --git a/layouts/xe_official/images/default/buttonSearch.gif b/layouts/xe_official/images/default/buttonSearch.gif new file mode 100644 index 000000000..9001f7884 Binary files /dev/null and b/layouts/xe_official/images/default/buttonSearch.gif differ diff --git a/layouts/xe_official/images/default/lineNotice.gif b/layouts/xe_official/images/default/lineNotice.gif new file mode 100644 index 000000000..fa69fd4ba Binary files /dev/null and b/layouts/xe_official/images/default/lineNotice.gif differ diff --git a/layouts/xe_official/images/default/powerdByZeroboard.gif b/layouts/xe_official/images/default/powerdByZeroboard.gif new file mode 100644 index 000000000..8be15c8f4 Binary files /dev/null and b/layouts/xe_official/images/default/powerdByZeroboard.gif differ diff --git a/layouts/xe_official/images/default/vrType1.gif b/layouts/xe_official/images/default/vrType1.gif new file mode 100644 index 000000000..e3766aa3b Binary files /dev/null and b/layouts/xe_official/images/default/vrType1.gif differ diff --git a/layouts/xe_official/images/default/zeroBoardXE.png b/layouts/xe_official/images/default/zeroBoardXE.png new file mode 100644 index 000000000..705d43e03 Binary files /dev/null and b/layouts/xe_official/images/default/zeroBoardXE.png differ diff --git a/layouts/xe_official/images/white/bgContentBody.gif b/layouts/xe_official/images/white/bgContentBody.gif new file mode 100644 index 000000000..b2cc35fc0 Binary files /dev/null and b/layouts/xe_official/images/white/bgContentBody.gif differ diff --git a/layouts/xe_official/images/white/bgGnbOn.gif b/layouts/xe_official/images/white/bgGnbOn.gif new file mode 100644 index 000000000..265b43dd7 Binary files /dev/null and b/layouts/xe_official/images/white/bgGnbOn.gif differ diff --git a/layouts/xe_official/images/white/bgGnbVr.gif b/layouts/xe_official/images/white/bgGnbVr.gif new file mode 100644 index 000000000..c7408fd43 Binary files /dev/null and b/layouts/xe_official/images/white/bgGnbVr.gif differ diff --git a/layouts/xe_official/images/white/bgHeader.png b/layouts/xe_official/images/white/bgHeader.png new file mode 100644 index 000000000..54c6e49fc Binary files /dev/null and b/layouts/xe_official/images/white/bgHeader.png differ diff --git a/layouts/xe_official/images/white/bgLnbOff.gif b/layouts/xe_official/images/white/bgLnbOff.gif new file mode 100644 index 000000000..64e2f9f57 Binary files /dev/null and b/layouts/xe_official/images/white/bgLnbOff.gif differ diff --git a/layouts/xe_official/images/white/bgSearch.gif b/layouts/xe_official/images/white/bgSearch.gif new file mode 100644 index 000000000..865872df3 Binary files /dev/null and b/layouts/xe_official/images/white/bgSearch.gif differ diff --git a/layouts/xe_official/images/white/bgSearchOn.gif b/layouts/xe_official/images/white/bgSearchOn.gif new file mode 100644 index 000000000..612f9613e Binary files /dev/null and b/layouts/xe_official/images/white/bgSearchOn.gif differ diff --git a/layouts/xe_official/images/white/bgSearchTerm.gif b/layouts/xe_official/images/white/bgSearchTerm.gif new file mode 100644 index 000000000..cc5dafe14 Binary files /dev/null and b/layouts/xe_official/images/white/bgSearchTerm.gif differ diff --git a/layouts/xe_official/images/white/bulletD0.gif b/layouts/xe_official/images/white/bulletD0.gif new file mode 100644 index 000000000..e8e17d4c6 Binary files /dev/null and b/layouts/xe_official/images/white/bulletD0.gif differ diff --git a/layouts/xe_official/images/white/bulletFF1A00.gif b/layouts/xe_official/images/white/bulletFF1A00.gif new file mode 100644 index 000000000..4026f2521 Binary files /dev/null and b/layouts/xe_official/images/white/bulletFF1A00.gif differ diff --git a/layouts/xe_official/images/white/bulletLnb.gif b/layouts/xe_official/images/white/bulletLnb.gif new file mode 100644 index 000000000..6674d3765 Binary files /dev/null and b/layouts/xe_official/images/white/bulletLnb.gif differ diff --git a/layouts/xe_official/images/white/buttonLang.gif b/layouts/xe_official/images/white/buttonLang.gif new file mode 100644 index 000000000..e598c8a0c Binary files /dev/null and b/layouts/xe_official/images/white/buttonLang.gif differ diff --git a/layouts/xe_official/images/white/buttonSearch.gif b/layouts/xe_official/images/white/buttonSearch.gif new file mode 100644 index 000000000..095b983e4 Binary files /dev/null and b/layouts/xe_official/images/white/buttonSearch.gif differ diff --git a/layouts/xe_official/images/white/lineNotice.gif b/layouts/xe_official/images/white/lineNotice.gif new file mode 100644 index 000000000..f3dfab9a0 Binary files /dev/null and b/layouts/xe_official/images/white/lineNotice.gif differ diff --git a/layouts/xe_official/images/white/powerdByZeroboard.gif b/layouts/xe_official/images/white/powerdByZeroboard.gif new file mode 100644 index 000000000..8be15c8f4 Binary files /dev/null and b/layouts/xe_official/images/white/powerdByZeroboard.gif differ diff --git a/layouts/xe_official/images/white/vrType1.gif b/layouts/xe_official/images/white/vrType1.gif new file mode 100644 index 000000000..e3766aa3b Binary files /dev/null and b/layouts/xe_official/images/white/vrType1.gif differ diff --git a/layouts/xe_official/images/white/zeroBoardXE.png b/layouts/xe_official/images/white/zeroBoardXE.png new file mode 100644 index 000000000..deb9098e7 Binary files /dev/null and b/layouts/xe_official/images/white/zeroBoardXE.png differ diff --git a/layouts/xe_official/images/zeroBoardXE.png b/layouts/xe_official/images/zeroBoardXE.png new file mode 100644 index 000000000..705d43e03 Binary files /dev/null and b/layouts/xe_official/images/zeroBoardXE.png differ diff --git a/layouts/xe_official/js/xe_official.js b/layouts/xe_official/js/xe_official.js new file mode 100644 index 000000000..bf49ce705 --- /dev/null +++ b/layouts/xe_official/js/xe_official.js @@ -0,0 +1,36 @@ +// Hide And Show Toggle +var cc=0 +function hideShow(id) { + if (cc==0) { + cc=1 + document.getElementById(id).style.display="none"; + } else { + cc=0 + document.getElementById(id).style.display="block"; + } +} + +// Show And Hide Toggle +var cc=0 +function showHide(id) { + if (cc==0) { + cc=1 + document.getElementById(id).style.display="block"; + } else { + cc=0 + document.getElementById(id).style.display="none"; + } +} + +// Local Navigation Toggle +function lnbToggle(id) { + for(num=1; num<=3; num++) document.getElementById('D3MG'+num).style.display='none'; //D4MG1~D4MG3 까지 숨긴 다음 + document.getElementById(id).style.display='block'; //해당 ID만 보임 +} + +// IS +function chkIsKind(key, value) { + showHide('selectOrder'); + xGetElementById('search_target'+key).checked = true; + xInnerHtml('search_target_label', value); +} diff --git a/layouts/xe_official/layout.html b/layouts/xe_official/layout.html new file mode 100644 index 000000000..b1bbcdce6 --- /dev/null +++ b/layouts/xe_official/layout.html @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + +
+ +
+
+ + + + + + + + +
    + {@ $idx = 1 } + +
  1. class="on">onclick="window.open(this.href);return false;">{$val['text']} + + + + + +
  2. + {@$idx++} + +
+ + +
+
+ + {$content} + +
+
+ +
diff --git a/modules/addon/addon.admin.controller.php b/modules/addon/addon.admin.controller.php new file mode 100644 index 000000000..7f16c131d --- /dev/null +++ b/modules/addon/addon.admin.controller.php @@ -0,0 +1,114 @@ +isActivatedAddon($addon)) $this->doDeactivate($addon); + + // 비활성화 되어 있으면 활성화 시킴 + else $this->doActivate($addon); + } + + $this->makeCacheFile(); + } + + /** + * @brief 애드온 설정 정보 입력 + **/ + function procAddonAdminSetupAddon() { + $args = Context::getRequestVars(); + $addon_name = $args->addon_name; + unset($args->module); + unset($args->act); + unset($args->addon_name); + + $this->doSetup($addon_name, $args); + + $this->makeCacheFile(); + } + + /** + * @brief 캐시 파일 생성 + **/ + function makeCacheFile() { + // 모듈에서 애드온을 사용하기 위한 캐시 파일 생성 + $buff = ""; + $oAddonModel = &getAdminModel('addon'); + $addon_list = $oAddonModel->getInsertedAddons(); + foreach($addon_list as $addon=> $val) { + if($val->is_used != 'Y') continue; + + if($val->extra_vars) { + unset($extra_vars); + $extra_vars = base64_encode($val->extra_vars); + } + + $buff .= sprintf(' if(file_exists("./addons/%s/%s.addon.php")) { unset($addon_info); $addon_info = unserialize(base64_decode("%s")); $addon_path = "./addons/%s/"; @include("./addons/%s/%s.addon.php"); }', $addon, $addon, $extra_vars, $addon, $addon, $addon); + } + + $buff = sprintf('', $buff); + + FileHandler::writeFile($this->cache_file, $buff); + } + + /** + * @brief 애드온 추가 + * DB에 애드온을 추가함 + **/ + function doInsert($addon) { + $args->addon = $addon; + $args->is_used = 'N'; + return executeQuery('addon.insertAddon', $args); + } + + /** + * @brief 애드온 활성화 + * addons라는 테이블에 애드온의 활성화 상태를 on 시켜줌 + **/ + function doActivate($addon) { + $args->addon = $addon; + $args->is_used = 'Y'; + return executeQuery('addon.updateAddon', $args); + } + + /** + * @brief 애드온 비활성화 + * + * addons라는 테이블에 애드온의 이름을 제거하는 것으로 비활성화를 시키게 된다 + **/ + function doDeactivate($addon) { + $args->addon = $addon; + $args->is_used = 'N'; + return executeQuery('addon.updateAddon', $args); + } + + /** + * @brief 애드온 설정 + **/ + function doSetup($addon, $extra_vars) { + $args->addon = $addon; + $args->extra_vars = serialize($extra_vars); + return executeQuery('addon.updateAddon', $args); + } + } +?> diff --git a/modules/addon/addon.admin.model.php b/modules/addon/addon.admin.model.php new file mode 100644 index 000000000..c16e9440c --- /dev/null +++ b/modules/addon/addon.admin.model.php @@ -0,0 +1,165 @@ +getInsertedAddons(); + + // 다운받은 애드온과 설치된 애드온의 목록을 구함 + $searched_list = FileHandler::readDir('./addons'); + $searched_count = count($searched_list); + if(!$searched_count) return; + + for($i=0;$i<$searched_count;$i++) { + // 애드온의 이름 + $addon_name = $searched_list[$i]; + + // 애드온의 경로 (files/addons가 우선) + $path = $this->getAddonPath($addon_name); + + // 해당 애드온의 정보를 구함 + unset($info); + $info = $this->getAddonInfoXml($addon_name); + + $info->addon = $addon_name; + $info->path = $path; + $info->activated = false; + + // DB에 입력되어 있는지 확인 + if(!in_array($addon_name, array_keys($inserted_addons))) { + // DB에 입력되어 있지 않으면 입력 (model에서 이런짓 하는거 싫지만 귀찮아서.. ㅡ.ㅜ) + $oAddonAdminController = &getAdminController('addon'); + $oAddonAdminController->doInsert($addon_name); + + // 활성화 되어 있는지 확인 + } else { + if($inserted_addons[$addon_name]->is_used=='Y') $info->activated = true; + } + + $list[] = $info; + } + return $list; + } + + /** + * @brief 모듈의 conf/info.xml 을 읽어서 정보를 구함 + **/ + function getAddonInfoXml($addon) { + // 요청된 모듈의 경로를 구한다. 없으면 return + $addon_path = $this->getAddonPath($addon); + if(!$addon_path) return; + + // 현재 선택된 모듈의 스킨의 정보 xml 파일을 읽음 + $xml_file = sprintf("%sconf/info.xml", $addon_path); + if(!file_exists($xml_file)) return; + + $oXmlParser = new XmlParser(); + $tmp_xml_obj = $oXmlParser->loadXmlFile($xml_file); + $xml_obj = $tmp_xml_obj->addon; + + if(!$xml_obj) return; + + $info->title = $xml_obj->title->body; + + // 작성자 정보 + $addon_info->addon_name = $addon; + $addon_info->title = $xml_obj->title->body; + $addon_info->version = $xml_obj->attrs->version; + $addon_info->author->name = $xml_obj->author->name->body; + $addon_info->author->email_address = $xml_obj->author->attrs->email_address; + $addon_info->author->homepage = $xml_obj->author->attrs->link; + $addon_info->author->date = $xml_obj->author->attrs->date; + $addon_info->author->description = trim($xml_obj->author->description->body); + + // history + if(!is_array($xml_obj->history->author)) $history[] = $xml_obj->history->author; + else $history = $xml_obj->history->author; + + foreach($history as $item) { + unset($obj); + $obj->name = $item->name->body; + $obj->email_address = $item->attrs->email_address; + $obj->homepage = $item->attrs->link; + $obj->date = $item->attrs->date; + $obj->description = $item->description->body; + $addon_info->history[] = $obj; + } + + // 확장변수 + if($xml_obj->extra_vars) { + + // DB에 설정된 내역을 가져온다 + $db_args->addon = $addon; + $output = executeQuery('addon.getAddonInfo',$db_args); + $extra_vals = unserialize($output->data->extra_vars); + + // 확장변수를 정리 + if(!is_array($xml_obj->extra_vars->var)) $extra_vars[] = $xml_obj->extra_vars->var; + else $extra_vars = $xml_obj->extra_vars->var; + + foreach($extra_vars as $key => $val) { + unset($obj); + $obj->name = $val->attrs->name; + $obj->title = $val->title->body; + $obj->description = $val->description->body; + $obj->value = $extra_vals->{$obj->name}; + $addon_info->extra_vars[] = $obj; + } + } + + return $addon_info; + } + + /** + * @brief 활성화된 애드온 목록을 구해옴 + **/ + function getInsertedAddons() { + $args->list_order = 'addon'; + $output = executeQuery('addon.getAddons', $args); + if(!$output->data) return array(); + if(!is_array($output->data)) $output->data = array($output->data); + + $activated_count = count($output->data); + for($i=0;$i<$activated_count;$i++) { + $addon = $output->data[$i]; + $addon_list[$addon->addon] = $addon; + } + return $addon_list; + } + + /** + * @brief 애드온이 활성화 되어 있는지 체크 + **/ + function isActivatedAddon($addon) { + $args->addon = $addon; + $output = executeQuery('addon.getAddonIsActivated', $args); + if($output->data->count>0) return true; + return false; + } + + } +?> diff --git a/modules/addon/addon.admin.view.php b/modules/addon/addon.admin.view.php new file mode 100644 index 000000000..e3d89f110 --- /dev/null +++ b/modules/addon/addon.admin.view.php @@ -0,0 +1,69 @@ +setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 애드온 관리 메인 페이지 (목록 보여줌) + **/ + function dispAddonAdminIndex() { + // 애드온 목록을 세팅 + $oAddonModel = &getAdminModel('addon'); + $addon_list = $oAddonModel->getAddonList(); + Context::set('addon_list', $addon_list); + + // 템플릿 패스 및 파일을 지정 + $this->setTemplateFile('addon_list'); + } + + /** + * @biref 애드온 세부 설정 팝업 출력 + **/ + function dispAddonAdminSetup() { + // 요청된 애드온을 구함 + $selected_addon = Context::get('selected_addon'); + + // 요청된 애드온의 정보를 구함 + $oAddonModel = &getAdminModel('addon'); + $addon_info = $oAddonModel->getAddonInfoXml($selected_addon); + Context::set('addon_info', $addon_info); + + // 레이아웃을 팝업으로 지정 + $this->setLayoutFile('popup_layout'); + + // 템플릿 패스 및 파일을 지정 + $this->setTemplateFile('setup_addon'); + } + + /** + * @brief 애드온의 상세 정보(conf/info.xml)를 팝업 출력 + **/ + function dispAddonAdminInfo() { + // 요청된 애드온을 구함 + $selected_addon = Context::get('selected_addon'); + + // 요청된 애드온의 정보를 구함 + $oAddonModel = &getAdminModel('addon'); + $addon_info = $oAddonModel->getAddonInfoXml($selected_addon); + Context::set('addon_info', $addon_info); + + // 레이아웃을 팝업으로 지정 + $this->setLayoutFile('popup_layout'); + + // 템플릿 패스 및 파일을 지정 + $this->setTemplateFile('addon_info'); + } + + } +?> diff --git a/modules/addon/addon.class.php b/modules/addon/addon.class.php new file mode 100644 index 000000000..b43b64514 --- /dev/null +++ b/modules/addon/addon.class.php @@ -0,0 +1,54 @@ +insertActionForward('addon', 'view', 'dispAddonAdminIndex'); + + // 몇가지 애드온을 등록 + $oAddonController = &getAdminController('addon'); + $oAddonController->doInsert('blogapi'); + $oAddonController->doInsert('counter'); + $oAddonController->doInsert('member_extra_info'); + $oAddonController->doInsert('naver_search'); + $oAddonController->doInsert('openid_delegation_id'); + $oAddonController->doInsert('rainbow_link'); + $oAddonController->doInsert('spamfilter'); + + // 몇가지 애드온을 기본 활성화 상태로 변경 + $oAddonController->doActivate('member_extra_info'); + $oAddonController->doActivate('counter'); + $oAddonController->doActivate('blogapi'); + $oAddonController->doActivate('spamfilter'); + $oAddonController->procAddonAdminToggleActivate(); + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + + } +?> diff --git a/modules/addon/conf/info.xml b/modules/addon/conf/info.xml new file mode 100644 index 000000000..299b9a9b5 --- /dev/null +++ b/modules/addon/conf/info.xml @@ -0,0 +1,23 @@ + + + 애드온 + Addon + Addon + 插件 + アドオン + Additions + + 제로 + zero + zero + zero + Zero + Zero + 애드온을 등록하거나 사용/미사용을 설정하는 애드온 관리 모듈입니다. + This module is for maintaining addons which can toggle use and disuse states. + La Modula para applicar o desapplicar addionales + 登录插件或设置启用/禁用插件的管理模块。 + アドオンの「登録、使用、未使用」などを設定するための管理モジュールです。 + Ce module est pour les Additions de maintien qui peuvent basculer des états d'utilisation et de désuétude. + + diff --git a/modules/addon/conf/module.xml b/modules/addon/conf/module.xml new file mode 100644 index 000000000..6ab0ac336 --- /dev/null +++ b/modules/addon/conf/module.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/modules/addon/lang/en.lang.php b/modules/addon/lang/en.lang.php new file mode 100644 index 000000000..42ad03c52 --- /dev/null +++ b/modules/addon/lang/en.lang.php @@ -0,0 +1,15 @@ +addon = "Addon"; + + $lang->addon_info = 'Summary of this Addon'; + $lang->addon_maker = 'Author of this Addon'; + $lang->addon_history = 'Addon History'; + + $lang->about_addon = 'Addon is for controling actions rather than displaying the HTML results.
Simply by toggling any addons you want on or off, you can use very useful functions to administer your website'; +?> diff --git a/modules/addon/lang/es.lang.php b/modules/addon/lang/es.lang.php new file mode 100644 index 000000000..d920e7843 --- /dev/null +++ b/modules/addon/lang/es.lang.php @@ -0,0 +1,15 @@ +addon = "Adiciónales"; + + $lang->addon_info = 'Información de Adiciónales'; + $lang->addon_maker = 'Autor'; + $lang->addon_history = 'Historia de modificación '; + + $lang->about_addon = 'Adiciónales más coltrola acciónes que salida de HTML.
Solo encendir o apagar los adiciónales puede utilizar los funciónes útiles de manejar el sitio.'; +?> diff --git a/modules/addon/lang/fr.lang.php b/modules/addon/lang/fr.lang.php new file mode 100644 index 000000000..5cf0ede9b --- /dev/null +++ b/modules/addon/lang/fr.lang.php @@ -0,0 +1,15 @@ +addon = "Additions"; + + $lang->addon_info = 'Un resume de ce additions'; + $lang->addon_maker = 'Le createur de ce additions'; + $lang->addon_history = 'L\'histoire de ce additions'; + + $lang->about_addon = 'Les operations de service de additions plutot que le HTML reel results.
Simply basculant n\'importe quel additions te permet en marche et en arret d\'employer les dispositifs utiles.'; +?> diff --git a/modules/addon/lang/jp.lang.php b/modules/addon/lang/jp.lang.php new file mode 100644 index 000000000..203d3cd99 --- /dev/null +++ b/modules/addon/lang/jp.lang.php @@ -0,0 +1,15 @@ +addon = "アドオン"; + + $lang->addon_info = 'アドオン情報'; + $lang->addon_maker = 'アドオン作者'; + $lang->addon_history = '変更内容'; + + $lang->about_addon = 'アドオンは、HTMLの出力をコントロールするというより動作を制御する役割をします。お好みのアドオンを「使用/未使用」に設定するだけでサイトの運営に有用な機能が利用できます。'; +?> diff --git a/modules/addon/lang/ko.lang.php b/modules/addon/lang/ko.lang.php new file mode 100644 index 000000000..7f7908380 --- /dev/null +++ b/modules/addon/lang/ko.lang.php @@ -0,0 +1,15 @@ +addon = "애드온"; + + $lang->addon_info = '애드온정보'; + $lang->addon_maker = '애드온 제작자'; + $lang->addon_history = '변경 사항 '; + + $lang->about_addon = '애드온은 html결과물을 출력하기 보다 동작을 제어하는 역할을 합니다.
원하시는 애드온을 on/ off하시는 것만으로 사이트 운영에 유용한 기능을 연동할 수 있습니다.'; +?> diff --git a/modules/addon/lang/zh-CN.lang.php b/modules/addon/lang/zh-CN.lang.php new file mode 100644 index 000000000..e228a6ec4 --- /dev/null +++ b/modules/addon/lang/zh-CN.lang.php @@ -0,0 +1,15 @@ +addon = "插件"; + + $lang->addon_info = '插件信息'; + $lang->addon_maker = '插件作者'; + $lang->addon_history = '更新纪录 '; + + $lang->about_addon = '插件是加载扩展功能的动作,而不是输出结果组件。
启用/禁用插件,为网站提供强大的功能。'; +?> diff --git a/modules/addon/queries/deleteAddon.xml b/modules/addon/queries/deleteAddon.xml new file mode 100644 index 000000000..d175fc83f --- /dev/null +++ b/modules/addon/queries/deleteAddon.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/addon/queries/getAddonInfo.xml b/modules/addon/queries/getAddonInfo.xml new file mode 100644 index 000000000..e2401fb0c --- /dev/null +++ b/modules/addon/queries/getAddonInfo.xml @@ -0,0 +1,9 @@ + + +
+ + + + + + diff --git a/modules/addon/queries/getAddonIsActivated.xml b/modules/addon/queries/getAddonIsActivated.xml new file mode 100644 index 000000000..c0394a9f3 --- /dev/null +++ b/modules/addon/queries/getAddonIsActivated.xml @@ -0,0 +1,12 @@ + + +
+ + + + + + + + + diff --git a/modules/addon/queries/getAddons.xml b/modules/addon/queries/getAddons.xml new file mode 100644 index 000000000..20ab37073 --- /dev/null +++ b/modules/addon/queries/getAddons.xml @@ -0,0 +1,8 @@ + + +
+ + + + + diff --git a/modules/addon/queries/insertAddon.xml b/modules/addon/queries/insertAddon.xml new file mode 100644 index 000000000..1b4cf2d99 --- /dev/null +++ b/modules/addon/queries/insertAddon.xml @@ -0,0 +1,10 @@ + + +
+ + + + + + + diff --git a/modules/addon/queries/updateAddon.xml b/modules/addon/queries/updateAddon.xml new file mode 100644 index 000000000..35883fabf --- /dev/null +++ b/modules/addon/queries/updateAddon.xml @@ -0,0 +1,12 @@ + + +
+ + + + + + + + + diff --git a/modules/addon/schemas/addons.xml b/modules/addon/schemas/addons.xml new file mode 100644 index 000000000..e83c7d9b7 --- /dev/null +++ b/modules/addon/schemas/addons.xml @@ -0,0 +1,6 @@ +
+ + + + +
diff --git a/modules/addon/tpl/addon_info.html b/modules/addon/tpl/addon_info.html new file mode 100644 index 000000000..422032907 --- /dev/null +++ b/modules/addon/tpl/addon_info.html @@ -0,0 +1,34 @@ +
+

{$lang->addon_maker}

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
{$addon_info->title} ver. {$addon_info->version}
{$addon_info->author->name}
{$addon_info->author->homepage}
{$addon_info->author->date} +
{$lang->description}{nl2br($addon_info->author->description)}
+
+ + diff --git a/modules/addon/tpl/addon_list.html b/modules/addon/tpl/addon_list.html new file mode 100644 index 000000000..a0ac6763b --- /dev/null +++ b/modules/addon/tpl/addon_list.html @@ -0,0 +1,60 @@ + + + +

{$lang->addon} {$lang->cmd_management}

+
{nl2br($lang->about_addon)}
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->addon_name}{$lang->version}{$lang->author}{$lang->date}{$lang->installed_path}{$lang->cmd_setup}{$lang->use}
+ {$val->title}
+ ({$val->addon}) +
{$val->version}{$val->author->name}{$val->author->date}{$val->path} + + {$lang->cmd_setup} + +   + + + + {$lang->use} + + {$lang->notuse} + +
+ {nl2br($val->author->description)} +
diff --git a/modules/addon/tpl/filter/setup_addon.xml b/modules/addon/tpl/filter/setup_addon.xml new file mode 100644 index 000000000..234dbb35a --- /dev/null +++ b/modules/addon/tpl/filter/setup_addon.xml @@ -0,0 +1,8 @@ + +
+ + + + + + diff --git a/modules/addon/tpl/filter/toggle_activate_addon.xml b/modules/addon/tpl/filter/toggle_activate_addon.xml new file mode 100644 index 000000000..3ed304fa1 --- /dev/null +++ b/modules/addon/tpl/filter/toggle_activate_addon.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/modules/addon/tpl/js/addon.js b/modules/addon/tpl/js/addon.js new file mode 100644 index 000000000..c65d1ba66 --- /dev/null +++ b/modules/addon/tpl/js/addon.js @@ -0,0 +1,9 @@ +/** + * @brief 애드온의 활성/비활성 토글용 함수 + * fo_addon이라는 id를 가지는 form에 인자로 주어진 addon값을 세팅후 실행 + **/ +function doToggleAddon(addon) { + var fo_obj = xGetElementById('fo_addon'); + fo_obj.addon.value = addon; + procFilter(fo_obj, toggle_activate_addon); +} diff --git a/modules/addon/tpl/setup_addon.html b/modules/addon/tpl/setup_addon.html new file mode 100644 index 000000000..054930db2 --- /dev/null +++ b/modules/addon/tpl/setup_addon.html @@ -0,0 +1,46 @@ + + +
+

{$lang->cmd_setup}

+
+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + +
{$addon_info->title} ver. {$addon_info->version}
{$addon_info->author->name}
{$addon_info->author->homepage}
{$val->title} + +

{$val->description}

+
+
+ +
+ +
+ +
diff --git a/modules/admin/admin.admin.controller.php b/modules/admin/admin.admin.controller.php new file mode 100644 index 000000000..cb2c10493 --- /dev/null +++ b/modules/admin/admin.admin.controller.php @@ -0,0 +1,59 @@ +insertShortCut($module); + if(!$output->toBool()) return $output; + + $this->setMessage('success_registed'); + } + + /** + * @brief 숏컷의 삭제 + **/ + function procAdminDeleteShortCut() { + $args->module = Context::get('selected_module'); + + // 삭제 불가능 바로가기의 처리 + if(in_array($args->module, array('module','addon','widget','layout'))) return new Object(-1, 'msg_manage_module_cannot_delete'); + + $output = executeQuery('admin.deleteShortCut', $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_deleted'); + } + + /** + * @brief 관리자 페이지의 단축 메뉴 추가 + **/ + function insertShortCut($module) { + // 선택된 모듈의 정보중에서 admin_index act를 구함 + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoXml($module); + + $args->module = $module; + $args->title = $module_info->title; + $args->default_act = $module_info->admin_index_act; + if(!$args->default_act) return new Object(-1, 'msg_default_act_is_null'); + + $output = executeQuery('admin.insertShortCut', $args); + return $output; + } + } +?> diff --git a/modules/admin/admin.admin.model.php b/modules/admin/admin.admin.model.php new file mode 100644 index 000000000..443dead66 --- /dev/null +++ b/modules/admin/admin.admin.model.php @@ -0,0 +1,42 @@ +toBool()) return $output; + + if(!is_array($output->data)) $list = array($output->data); + else $list = $output->data; + + foreach($list as $val) { + $shortcut_list[$val->module] = $val; + } + + // 모듈 목록을 구해와서 숏컷에 해당하는 타이틀을 추출 + $oModuleModel = &getModel('module'); + $module_list = $oModuleModel->getModulesXmlInfo(); + foreach($module_list as $key => $val) { + $module_name = $val->module; + if($shortcut_list[$module_name]) $shortcut_list[$module_name]->title = $val->title; + } + + return $shortcut_list; + } + + } +?> diff --git a/modules/admin/admin.admin.view.php b/modules/admin/admin.admin.view.php new file mode 100644 index 000000000..f8c2bab9e --- /dev/null +++ b/modules/admin/admin.admin.view.php @@ -0,0 +1,85 @@ +grant->is_admin) return; + + // template path 지정 + $this->setTemplatePath($this->module_path.'tpl'); + + // 접속 사용자에 대한 체크 + $oMemberModel = &getModel('member'); + $logged_info = $oMemberModel->getLoggedInfo(); + + // 관리자용 레이아웃으로 변경 + $this->setLayoutPath($this->getTemplatePath()); + $this->setLayoutFile('layout.html'); + + // shortcut 가져오기 + $oAdminModel = &getAdminModel('admin'); + $shortcut_list = $oAdminModel->getShortCuts(); + Context::set('shortcut_list', $shortcut_list); + + // 현재 실행중인 모듈을 구해 놓음 + $running_module = strtolower(preg_replace('/([a-z]+)([A-Z]+)([a-z]+)(.*)/', '\\2\\3', $this->act)); + Context::set('running_module', $running_module); + + $db_info = Context::getDBInfo(); + + Context::set('time_zone_list', $GLOBALS['time_zone']); + Context::set('time_zone', $GLOBALS['_time_zone']); + Context::set('use_rewrite', $db_info->use_rewrite=='Y'?'Y':'N'); + + Context::setBrowserTitle("ZeroboardXE Admin Page"); + } + + /** + * @brief 관리자 메인 페이지 출력 + **/ + function dispAdminIndex() { + // 공식사이트에서 최신 뉴스를 가져옴 + $newest_news_url = sprintf("http://news.zeroboard.com/%s/news.php", Context::getLangType()); + $cache_file = sprintf("./files/cache/newest_news.%s.cache.php", Context::getLangType()); + + // 1시간 단위로 캐싱 체크 + if(!file_exists($cache_file) || filectime($cache_file)+ 60*60 < time()) { + FileHandler::getRemoteFile($newest_news_url, $cache_file); + } + if(file_exists($cache_file)) { + $oXml = new XmlParser(); + $buff = $oXml->parse(FileHandler::readFile($cache_file)); + + $item = $buff->zbxe_news->item; + if($item) { + if(!is_array($item)) $item = array($item); + + foreach($item as $key => $val) { + $obj = null; + $obj->title = $val->body; + $obj->date = $val->attrs->date; + $obj->url = $val->attrs->url; + $news[] = $obj; + } + Context::set('news', $news); + } + } + $this->setTemplateFile('index'); + } + + /** + * @brief 관리자 메뉴 숏컷 출력 + **/ + function dispAdminShortCut() { + $this->setTemplateFile('shortcut_list'); + } + } +?> diff --git a/modules/admin/admin.class.php b/modules/admin/admin.class.php new file mode 100644 index 000000000..1c96da370 --- /dev/null +++ b/modules/admin/admin.class.php @@ -0,0 +1,45 @@ +insertShortCut('blog'); + $oAdminController->insertShortCut('board'); + $oAdminController->insertShortCut('page'); + $oAdminController->insertShortCut('menu'); + $oAdminController->insertShortCut('layout'); + $oAdminController->insertShortCut('addon'); + $oAdminController->insertShortCut('widget'); + $oAdminController->insertShortCut('member'); + $oAdminController->insertShortCut('module'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + + } +?> diff --git a/modules/admin/conf/info.xml b/modules/admin/conf/info.xml new file mode 100644 index 000000000..fc9394da9 --- /dev/null +++ b/modules/admin/conf/info.xml @@ -0,0 +1,20 @@ + + + 관리자 모듈 + Administrator Module + Modules de administración + 管理员模块 + 管理者用モジュール + + 제로 + zero + zero + zero + Zero + 각 모듈들의 기능을 나열하고 관리자용 레이아웃을 적용하여 관리 기능을 사용할 수 있도록 하는 모듈입니다. + This module shows a list of features of each module, and enables you to use a quite few of managers by applying layout for administrator. + Lista las los funciónes de modules y aplica diseño de administración para manejar sitio. + 列出各模块的功能并使用管理员布局,可以让其使用管理功能的模块。 + 各モジュールの機能を羅列し、管理者用のレイアウトを適用させ、管理機能が使用できるようにするモジュールです。 + + diff --git a/modules/admin/conf/module.xml b/modules/admin/conf/module.xml new file mode 100644 index 000000000..b9afae3b4 --- /dev/null +++ b/modules/admin/conf/module.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/modules/admin/lang/en.lang.php b/modules/admin/lang/en.lang.php new file mode 100644 index 000000000..a247ad83d --- /dev/null +++ b/modules/admin/lang/en.lang.php @@ -0,0 +1,70 @@ +newest_news = "Latest News"; + + $lang->env_setup = "Setting"; + + $lang->item_module = "Module List"; + $lang->item_addon = "Addon List"; + $lang->item_widget = "Widget List"; + $lang->item_layout = "Layout List"; + + $lang->module_name = "Module Name"; + $lang->addon_name = "Addon Name"; + $lang->version = "Version"; + $lang->author = "Developer"; + $lang->table_count = "Number of Table"; + $lang->installed_path = "Installed Path"; + + $lang->cmd_shortcut_management = "Edit Menues"; + + $lang->msg_is_not_administrator = 'Administrator only'; + $lang->msg_manage_module_cannot_delete = 'Shortcuts of module, addon, layout, widget cannot be removed'; + $lang->msg_default_act_is_null = 'Shortcut could not be registered because default admin Action is not set'; + + $lang->welcome_to_zeroboard_xe = 'Welcome to the admin page of Zeroboard XE'; + $lang->about_admin_page = "Admin page is still being developing,\nWe will add essential contents by accepting many good suggestions during Closebeta."; + + $lang->zeroboard_xe_user_links = 'Links for Users'; + $lang->zeroboard_xe_developer_links = 'Links for Developers'; + + $lang->xe_user_links = array( + 'Official Website' => 'http://www.zeroboard.com', + //'Close Beta website' => 'http://spring.zeroboard.com', + //'Module morgue' => 'http://www.zeroboard.com', + //'Addon morgue' => 'http://www.zeroboard.com', + //'Widget morgue' => 'http://www.zeroboard.com', + //'Module Skin morgue' => 'http://www.zeroboard.com', + //'Widget Skin morgue' => 'http://www.zeroboard.com', + //'Layout Skin morgue' => 'http://www.zeroboard.com', + ); + + $lang->xe_developer_links = array( + //'Manual' => 'http://www.zeroboard.com/wiki/manual', + "Developer's forum" => 'http://spring.zeroboard.com', + 'Issue Tracking' => 'http://trac.zeroboard.com', + 'SVN Repository' => 'http://svn.zeroboard.com', + 'doxygen document' => 'http://doc.zeroboard.com', + 'PDF Documentation' => 'http://doc.zeroboard.com/zeroboard_xe.pdf', + ); + + $lang->zeroboard_xe_usefulness_module = 'Useful Modules'; + $lang->xe_usefulness_modules = array( + 'dispEditorAdminIndex' => 'Editor Manager', + 'dispDocumentAdminList' => 'Article Manager', + 'dispCommentAdminList' => 'Comment Manager', + 'dispFileAdminList' => 'Attachment Manager', + 'dispPollAdminList' => 'Poll Manager', + 'dispSpamfilterAdminConfig' => 'Spam Filter Manager', + 'dispCounterAdminIndex' => 'Counter Log', + + ); + + $lang->xe_license = 'Zeroboard XE complies with the GPL'; + $lang->about_shortcut = 'You may remove shortcuts of modules which are registered on frequently using module list'; +?> diff --git a/modules/admin/lang/es.lang.php b/modules/admin/lang/es.lang.php new file mode 100644 index 000000000..5c1961e1f --- /dev/null +++ b/modules/admin/lang/es.lang.php @@ -0,0 +1,66 @@ +item_module = "Lista de Módulos"; + $lang->item_addon = "Lista de Adiciónales"; + $lang->item_widget = "Lista de Widget"; + $lang->item_layout = "Liasta de Diseño"; + + $lang->module_name = "Nombre de Módulo"; + $lang->addon_name = "Nombre de Adición"; + $lang->version = "Versión"; + $lang->author = "Autor"; + $lang->table_count = "Numero de Tablos"; + $lang->installed_path = "Paso de instalación"; + + $lang->cmd_shortcut_management = "Modificar Menú"; + + $lang->msg_is_not_administrator = 'Solo administrador puede entrar.'; + $lang->msg_manage_module_cannot_delete = 'No puede eliminar acceso directo de Módulos, Adiciónales, Diseño y Widget.'; + $lang->msg_default_act_is_null = 'No puede registrar acceso directo por acción de administrador determinado no esta registrado.'; + + $lang->welcome_to_zeroboard_xe = 'Esto es Pagina de Administrador de ZeroBoard XE'; + $lang->about_admin_page = "El pagina de Administración no esta listo."; + + $lang->zeroboard_xe_user_links = 'Enlace para usuarios '; + $lang->zeroboard_xe_developer_links = 'Enlace para desarrolladores'; + + $lang->xe_user_links = array( + 'Pagina de web oficial' => 'http://www.zeroboard.com', + //'Sitio para beta cerrado' => 'http://spring.zeroboard.com', + //'Depósitorio de Módulos´ => 'http://www.zeroboard.com', + //'Depósitorio de Adiciónales' => 'http://www.zeroboard.com', + //'Depósitorio de Widgets' => 'http://www.zeroboard.com', + //'Depósitorio de carátulas de módulos' => 'http://www.zeroboard.com', + //'Depósitorio de carátulas de widget' => 'http://www.zeroboard.com', + //'Depósitorio de carátulas de diseño' => 'http://www.zeroboard.com', + ); + + $lang->xe_developer_links = array( + //'Manuales' => 'http://www.zeroboard.com/wiki/manual', + 'Foro Abierto de desarrolladores' => 'http://spring.zeroboard.com', + 'Huellas de distribuciónes' => 'http://trac.zeroboard.com', + 'Repositor de SVN' => 'http://svn.zeroboard.com', + 'doxygen document' => 'http://doc.zeroboard.com', + 'Documentación en PDF' => 'http://doc.zeroboard.com/zeroboard_xe.pdf', + ); + + $lang->zeroboard_xe_usefulness_module = 'Módulos útiles'; + $lang->xe_usefulness_modules = array( + 'dispEditorAdminIndex' => 'Manejar Editor', + 'dispDocumentAdminList' => 'Manejar Documentos', + 'dispCommentAdminList' => 'Manejar Commentarios', + 'dispFileAdminList' => 'Manejar archivos', + 'dispPollAdminList' => 'Manejar votaciónes', + 'dispSpamfilterAdminConfig' => 'Manejar SpamFilter', + 'dispCounterAdminIndex' => 'Manejar archivo de registro de taquilla', + + ); + + $lang->xe_license = 'ZeroBoard XE esta en bajo de Licencia GPL'; + $lang->about_shortcut = 'Puede Eliminar acceso directo de módulos'; +?> diff --git a/modules/admin/lang/jp.lang.php b/modules/admin/lang/jp.lang.php new file mode 100644 index 000000000..97fdeb0fd --- /dev/null +++ b/modules/admin/lang/jp.lang.php @@ -0,0 +1,70 @@ +newest_news = "最新ニュース"; + + $lang->env_setup = "環境設定"; + + $lang->item_module = "モジュールリスト"; + $lang->item_addon = "アドオンリスト"; + $lang->item_widget = "ウィジェットリスト"; + $lang->item_layout = "レイアウトリスト"; + + $lang->module_name = "モジュール名"; + $lang->addon_name = "アドオン名"; + $lang->version = "バージョン"; + $lang->author = "作者"; + $lang->table_count = "テーブル数"; + $lang->installed_path = "インストールパス"; + + $lang->cmd_shortcut_management = "メニュー編集"; + + $lang->msg_is_not_administrator = '管理者のみ接続できます'; + $lang->msg_manage_module_cannot_delete = 'モジュール、アドオン、ウィジェットのショットカットは削除できません。'; + $lang->msg_default_act_is_null = 'デフォルトの管理者のアクションが指定されていないため、ショットカットを登録することができません。'; + + $lang->welcome_to_zeroboard_xe = 'ゼロボードXEの管理者ページです。'; + $lang->about_admin_page = "管理者ページはまだ未完成です。クローズベタバージョンの期間に、多くの方々からご意見をいただきながら、必ず必要なコンテンツを埋めていきたいと思います。"; + + $lang->zeroboard_xe_user_links = 'ユーザのためのリンク'; + $lang->zeroboard_xe_developer_links = 'デベロッパーのためのリンク'; + + $lang->xe_user_links = array( + '公式ホームページ' => 'http://www.zeroboard.com', + //'クローズベタサイト' => 'http://spring.zeroboard.com', + //'モジュルダ情報' => 'http://www.zeroboard.com', + //'アドオン情報' => 'http://www.zeroboard.com', + //'ウィジェット情報' => 'http://www.zeroboard.com', + //'モジュール・スキン情報' => 'http://www.zeroboard.com', + //'ウィジェットスキン情報' => 'http://www.zeroboard.com', + //'レイアウトスキン情報' => 'http://www.zeroboard.com', + ); + + $lang->xe_developer_links = array( + 'デベロッパーフォーラム' => 'http://spring.zeroboard.com', + //'マニュアル' => 'http://www.zeroboard.com/wiki/manual', + 'イッシュートラッキング' => 'http://trac.zeroboard.com', + 'SVN Repository' => 'http://svn.zeroboard.com', + 'Doxygen Document' => 'http://doc.zeroboard.com', + 'PDFドキュメント' => 'http://doc.zeroboard.com/zeroboard_xe.pdf', + ); + + $lang->zeroboard_xe_usefulness_module = '有用なモジュール'; + $lang->xe_usefulness_modules = array( + 'dispEditorAdminIndex' => 'エディター管理', + 'dispDocumentAdminList' => 'ドキュメント管理', + 'dispCommentAdminList' => 'コメント管理', + 'dispFileAdminList' => '添付ファイル管理', + 'dispPollAdminList' => 'アンケート管理', + 'dispSpamfilterAdminConfig' => 'スパムフィルター管理', + 'dispCounterAdminIndex' => 'カウンターログ', + + ); + + $lang->xe_license = 'ゼロボードXEのライセンスはGPLです。'; + $lang->about_shortcut = 'よく使用するモジュールに登録されたショットカットは削除できます。'; +?> diff --git a/modules/admin/lang/ko.lang.php b/modules/admin/lang/ko.lang.php new file mode 100644 index 000000000..2ed90c0a2 --- /dev/null +++ b/modules/admin/lang/ko.lang.php @@ -0,0 +1,70 @@ +newest_news = "최신 소식"; + + $lang->env_setup = "환경 설정"; + + $lang->item_module = "모듈 목록"; + $lang->item_addon = "애드온 목록"; + $lang->item_widget = "위젯 목록"; + $lang->item_layout = "레이아웃 목록"; + + $lang->module_name = "모듈 이름"; + $lang->addon_name = "애드온 이름"; + $lang->version = "버전"; + $lang->author = "제작자"; + $lang->table_count = "테이블수"; + $lang->installed_path = "설치경로"; + + $lang->cmd_shortcut_management = "메뉴 편집하기"; + + $lang->msg_is_not_administrator = '관리자만 접속이 가능합니다'; + $lang->msg_manage_module_cannot_delete = '모듈, 애드온, 레이아웃, 위젯 모듈의 바로가기는 삭제 불가능합니다'; + $lang->msg_default_act_is_null = '기본 관리자 Action이 지정되어 있지 않아 바로가기 등록을 할 수가 없습니다'; + + $lang->welcome_to_zeroboard_xe = '제로보드XE 관리자 페이지입니다'; + $lang->about_admin_page = "관리자 페이지는 아직 미완성입니다.\n클로즈 베타동안 좋은 의견 받아서 꼭 필요한 컨텐츠를 채우도록 하겠습니다."; + + $lang->zeroboard_xe_user_links = '사용자를 위한 링크'; + $lang->zeroboard_xe_developer_links = '개발자를 위한 링크'; + + $lang->xe_user_links = array( + '공식홈페이지' => 'http://www.zeroboard.com', + //'클로즈베타 사이트' => 'http://spring.zeroboard.com', + //'모듈 자료실' => 'http://www.zeroboard.com', + //'애드온 자료실' => 'http://www.zeroboard.com', + //'위젯 자료실' => 'http://www.zeroboard.com', + //'모듈 스킨 자료실' => 'http://www.zeroboard.com', + //'위젯 스킨 자료실' => 'http://www.zeroboard.com', + //'레이아웃 스킨 자료실' => 'http://www.zeroboard.com', + ); + + $lang->xe_developer_links = array( + //'매뉴얼' => 'http://www.zeroboard.com/wiki/manual', + '개발자 포럼' => 'http://spring.zeroboard.com', + '이슈트래킹' => 'http://trac.zeroboard.com', + 'SVN Repository' => 'http://svn.zeroboard.com', + 'doxygen document' => 'http://doc.zeroboard.com', + 'pdf 문서' => 'http://doc.zeroboard.com/zeroboard_xe.pdf', + ); + + $lang->zeroboard_xe_usefulness_module = '유용한 모듈들'; + $lang->xe_usefulness_modules = array( + 'dispEditorAdminIndex' => '에디터 관리', + 'dispDocumentAdminList' => '문서 관리', + 'dispCommentAdminList' => '댓글 관리', + 'dispFileAdminList' => '첨부파일 관리', + 'dispPollAdminList' => '설문조사 관리', + 'dispSpamfilterAdminConfig' => '스팸필터 관리', + 'dispCounterAdminIndex' => '카운터 로그', + + ); + + $lang->xe_license = '제로보드XE는 GPL을 따릅니다'; + $lang->about_shortcut = '자주 사용하는 모듈에 등록된 모듈의 바로가기를 삭제할 수 있습니다'; +?> diff --git a/modules/admin/lang/zh-CN.lang.php b/modules/admin/lang/zh-CN.lang.php new file mode 100644 index 000000000..b2ec56739 --- /dev/null +++ b/modules/admin/lang/zh-CN.lang.php @@ -0,0 +1,71 @@ +newest_news = "最新消息"; + + $lang->env_setup = "环境设置"; + + + $lang->item_module = "模块目录"; + $lang->item_addon = "插件目录"; + $lang->item_widget = "控件目录"; + $lang->item_layout = "布局目录"; + + $lang->module_name = "模块名称"; + $lang->addon_name = "插件名称"; + $lang->version = "版本"; + $lang->author = "作者"; + $lang->table_count = "表格数"; + $lang->installed_path = "安装路径"; + + $lang->cmd_shortcut_management = "编辑菜单"; + + $lang->msg_is_not_administrator = '只有管理员可以查看'; + $lang->msg_manage_module_cannot_delete = '模块,插件,布局,控件模块的快捷菜单是不能删除的。'; + $lang->msg_default_act_is_null = '没有指定默认管理员的动作,是不能添加到快捷菜单的。'; + + $lang->welcome_to_zeroboard_xe = 'zeroboard XE 管理页面'; + $lang->about_admin_page = "后台管理页面未完成"; + + $lang->zeroboard_xe_user_links = '为用户提供的链接'; + $lang->zeroboard_xe_developer_links = '为开发人员提供的链接'; + + $lang->xe_user_links = array( + '韩国官方主页' => 'http://www.zeroboard.com', + //'closebeta主页' => 'http://spring.zeroboard.com', + //'模块下载地址' => 'http://www.zeroboard.com', + //'插件下载地址' => 'http://www.zeroboard.com', + //'控件下载地址' => 'http://www.zeroboard.com', + //'模块皮肤下载地址' => 'http://www.zeroboard.com', + //'控件皮肤下载地址' => 'http://www.zeroboard.com', + //'布局皮肤下载地址' => 'http://www.zeroboard.com', + ); + + $lang->xe_developer_links = array( + //'使用手册' => 'http://www.zeroboard.com/wiki/manual', + 'Developer 论坛' => 'http://spring.zeroboard.com', + '问题跟踪' => 'http://trac.zeroboard.com', + 'SVN Repository' => 'http://svn.zeroboard.com', + 'doxygen document' => 'http://doc.zeroboard.com', + 'pdf 文件' => 'http://doc.zeroboard.com/zeroboard_xe.pdf', + ); + + $lang->zeroboard_xe_usefulness_module = '常用模块'; + $lang->xe_usefulness_modules = array( + 'dispEditorAdminIndex' => '编辑器管理', + 'dispDocumentAdminList' => '主题管理', + 'dispCommentAdminList' => '评论管理', + 'dispFileAdminList' => '附件管理', + 'dispPollAdminList' => '投票管理', + 'dispSpamfilterAdminConfig' => '垃圾过滤管理', + 'dispCounterAdminIndex' => '统计日志', + + ); + + $lang->xe_license = 'Zeroboard XE遵循 GPL协议'; + $lang->about_shortcut = '可以删除添加到常用模块中的快捷菜单。'; +?> diff --git a/modules/admin/queries/deleteShortCut.xml b/modules/admin/queries/deleteShortCut.xml new file mode 100644 index 000000000..7640bfb45 --- /dev/null +++ b/modules/admin/queries/deleteShortCut.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/admin/queries/getShortCutList.xml b/modules/admin/queries/getShortCutList.xml new file mode 100644 index 000000000..797abbdc4 --- /dev/null +++ b/modules/admin/queries/getShortCutList.xml @@ -0,0 +1,8 @@ + + +
+ + + + + diff --git a/modules/admin/queries/insertShortCut.xml b/modules/admin/queries/insertShortCut.xml new file mode 100644 index 000000000..29133f77c --- /dev/null +++ b/modules/admin/queries/insertShortCut.xml @@ -0,0 +1,13 @@ + + +
+ + + + + + + + + + diff --git a/modules/admin/schemas/admin_shortcut.xml b/modules/admin/schemas/admin_shortcut.xml new file mode 100644 index 000000000..7494ef01d --- /dev/null +++ b/modules/admin/schemas/admin_shortcut.xml @@ -0,0 +1,8 @@ +
+ + + + + + +
diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css new file mode 100644 index 000000000..e884be66a --- /dev/null +++ b/modules/admin/tpl/css/admin.css @@ -0,0 +1,211 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +/* +Used Hack + +IE6 & Below +{ property:value; _property:value;} + +IE7 Only +*:first-child+html #selector + +*/ + +body { margin:0; } +li { list-style:none; } +a { text-decoration:none;} +a:hover { text-decoration:underline;} +address { font-style:normal;} + +/* Special Class Selector */ +.fr { float:right;} +.fl { float:left;} +.fwB { font-weight:bold;} +.gl3 { padding-left:2em; } + +/* ----- cBody | Start ----- */ + +h3 { padding:22px 0 7px 0; border-bottom:2px solid #f2250d; background:url(../images/h3.gif) no-repeat 1px 24px; font-size:1.4em; margin-bottom:10px; text-indent:24px; z-index:99;} +h3 .gray { color:#9d9d9d;} +.pass { background:url(../images/h4.gif) no-repeat .5em center; padding-left:1em; color:#606060; font-size:1em;} +.header4 { overflow:hidden;} +h4 { font-size:1em; color:#f2250d; float:left; padding:.5em 0 1.2em 2em;} +h4 .bracket { font-weight:normal; color:#9d9d9d;} +h4 .vr { font-weight:normal; color:#d1d1d1;} +h4 .view { color:#158692; padding-right:.6em; font:bold .9em Tahoma; background:url(../images/iconView.gif) no-repeat right center;} +.header4 div.summary { font:.9em Tahoma; color:#636363; float:left; padding:.5em 0 1.2em 2em;} +.header4 div.summary .vr { font-weight:normal; color:#d1d1d1; margin:0 .5em;} +.header4 div.summary em { color:#ff1d00; font-style:normal;} +.header4 table.summary { border-right:1px solid #f2f2f2; width:100%; height:35px; margin-bottom:15px;} +.header4 table.summary th { background:#969693; color:#ffffff;} +.header4 table.summary th img { vertical-align:middle;} +.header4 table.summary th .vr { color:#a3a39f; margin:0 4px; font-weight:normal;} +.header4 table.summary td { border-top:1px solid #f2f2f2; border-bottom:1px solid #f2f2f2; font:.9em Tahoma; padding-left:17px;} + +select.time_zone { width:70%; position:relative; top:4px; } + +/* ----- cBody | End ----- */ + +/* ----- Content | Start ----- */ + +/* localNavigation */ +.localNavigation { float:right;margin-bottom:10px;} +.localNavigation li { float:left; margin-right:.3em;} +.localNavigation li.on { margin-right:.3em;} +.localNavigation li a { padding:.4em 1em .2em 1em; display:block; float:left; font-size:.9em; color:#606060; border:2px solid #e0dfde;} +.localNavigation li a:hover { border:2px solid #ff1a00; color:#f2250d; text-decoration:none;} +.localNavigation li.on a { color:#f2250d; border:2px solid #ff1a00; text-decoration:none;} + +/* pageNavigation */ +.pageNavigation { display:block; padding:1.5em 0 2em 0; text-align:center; font:bold .8em Tahoma; } +.pageNavigation a { margin-left:-4px; font:bold 1em Tahoma; color:#666666; display:inline-block; padding:1px 7px 2px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } +.pageNavigation a:hover { background:#F7F7F7; text-decoration:none; } +.pageNavigation a:visited { color:#999999;} +.pageNavigation a.goToFirst, +.pageNavigation a.goToLast { border:none; border-right:1px solid #ffffff; border-left:1px solid #ffffff; z-index:99; vertical-align:top; padding:0px 7px 4px 6px;} +.pageNavigation a.goToFirst img, +.pageNavigation a.goToLast img { display:inline-block; padding:2px 0; top:2px; _top:1px;} +.pageNavigation .current { margin-left:-4px; font:bold 1em Tahoma; color:#ff6600; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +/* tableStyle */ +.infoText { clear:both; border:1px solid #f2f2f0; margin-bottom:12px; background:#f9f9f6; padding:1.2em; color:#7b7972; font-size:.9em; line-height:1.4em;} + +.gap1 { margin-top:.8em; } +.tableSummaryType1 { font:bold .8em Tahoma; color:#a0a0a0; margin-bottom:10px;} +.tableSummaryType1 strong { font:bold 1em Tahoma; color:#ff1a00;} + +.tableType1 { width:100%; border-bottom:2px solid #c1c0bd;} +.tableType1 caption { padding:2em 0 .5em 1.5em; font-weight:bold; text-align:left; background:url(../images/iconH3.gif) no-repeat .5em 2em;} +.tableType1 th { font-weight:normal; color:#ffffff; background:url(../images/tableType1Header.gif) repeat-x; height:28px;} +.tableType1 th select { vertical-align:middle; } +.tableType1 td { text-align:center; color:#636363; height:30px; border-top:1px solid #ededed;} +.tableType1 td.left { text-align:left } +.tableType1 td a { color:#1d1d1d;} +.tableType1 .tahoma { font-size:.9em; font-family:Tahoma;} +.tableType1 .tahoma a { font-size:1em;} +.tableType1 td.blue a { color:#158692;} +.tableType1 td.red a { color:#c95b53;} +.tableType1 td.red { color:#c95b53;} +.tableType1 td .blue { color:#158692;} +.tableType1 td .red { color:#c95b53;} + +.tableType2 { border:2px solid #c1c0bd; border-left:none; border-right:none; width:100%;} +.tableType2 caption { padding:2em 0 .5em 1.5em; font-weight:bold; text-align:left; background:url(../images/iconH3.gif) no-repeat .5em 2em;} +.tableType2 th { border-top:1px solid #fbfbfb; border-bottom:1px solid #e4e4e4; background:#f5f5f5; padding:10px 10px 10px 2em; font-weight:normal; text-align:left; color:#606060;} +.tableType2 td { border-bottom:1px solid #ededed; padding:10px 10px 7px 10px; font-size:.9em; color:#7b7972;} +.tableType2 td input, +.tableType2 td textarea, +.tableType2 td select { margin-bottom:.5em; vertical-align:middle; font-size:1em; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6;} +.tableType2 td .w100 { width:100%; display:block;} +.tableType2 td .checkbox { margin:-3px;} +.tableType2 td p { line-height:1.4em;} +.tableType2 td a { color:#1d1d1d;} +.tableType2 td a.blue { color:#158692;} +.tableType2 td a.red { color:#c95b53;} + +.tableType3 { width:100%; border-bottom:2px solid #c1c0bd;} +.tableType3 caption { padding:2em 0 .5em 1.5em; font-weight:bold; text-align:left; background:url(../images/iconH3.gif) no-repeat .5em 2em;} +.tableType3 th.bold { font-weight:bold; } +.tableType3 th, +.tableType3 td { border-top:1px solid #bfbfbf;} +.tableType3 thead th { font-weight:normal; color:#ffffff; background:url(../images/tableType1Header.gif) repeat-x; height:28px;} +.tableType3 tbody th { font-weight:normal; color:#606060; text-align:left; background:#f5f5f5; padding:10px 10px 10px 2em;} +.tableType3 tbody th img { vertical-align:middle; margin-top:-2px;} +.tableType3 td { text-align:center; color:#636363; border-left:1px solid #ededed; padding:10px 10px 7px 10px;} +.tableType3 td.colSpan { text-align:left; border-top:1px solid #ededed;} +.tableType3 td a { color:#1d1d1d;} +.tableType3 th a.blue { color:#158692;} +.tableType3 th a.red { color:#c95b53;} +.tableType3 .tahoma { font-size:.9em; font-family:Tahoma;} +.tableType3 .tahoma a { font-size:1em;} +.tableType3 td.left { text-align:left; } +.tableType3 td label { margin-right:1em; } +.tableType3 td.blue a { color:#158692;} +.tableType3 td.red a { color:#c95b53;} +.tableType3 td a.blue { color:#158692;} +.tableType3 td a.red { color:#c95b53;} +/*.tableType3 td input,*/ +.tableType3 td textarea, +.tableType3 td select { margin-bottom:.5em; vertical-align:middle; font-size:1em; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6;} +.tableType3 td .w100 { width:100%; display:block;} + +.tableType4 { border:2px solid #c1c0bd; border-left:none; border-right:none; width:100%;} +.tableType4 th { border-top:1px solid #fbfbfb; border-bottom:1px solid #e4e4e4; background:#f5f5f5; padding:10px 10px 10px 2em; font-weight:normal; text-align:left; color:#606060;} +.tableType4 caption { padding:2em 0 .5em 1.5em; font-weight:bold; text-align:left; background:url(../images/iconH3.gif) no-repeat .5em 2em;} +.tableType4.counter th { font-size:.9em; text-align:center; padding:0;} +.tableType4.counter th em { font:normal 1em Tahoma;} +.tableType4 td { border-bottom:1px solid #ededed; padding:10px 10px 7px 10px; color:#7b7972;} +.tableType4 td a { color:#1d1d1d;} +.tableType4 .tahoma { font-size:.9em; font-family:Tahoma;} +.tableType4 .tahoma a { font-size:1em;} +.tableType4 td.blue a { color:#158692;} +.tableType4 td.red a { color:#c95b53;} +/*.tableType4 td input,*/ +.tableType4 td textarea, +.tableType4 td select { margin-bottom:.5em; vertical-align:middle;font-size:1em; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6;} +.tableType4 td label { margin-right:1em; } +.tableType4 td .w100 { width:100%; display:block;} +.tableType4 td .checkbox { margin:-3px;} +.tableType4 td p { line-height:1.4em;} +.tableType4 td .graph { width:90%; position:relative;} +.tableType4 td .graph .bar { width:100%; position:absolute; margin-top:4px;} +.tableType4 td .graph .num { position:relative; background:#ffffff; color:#636363; font:.9em Tahoma; padding-left:10px;} + + +.widgetBox { border:1px solid #c1c0bd; width:100%;} +.widgetBox th { text-align:center; font-weight:normal; background-color:#EFEFEF; } +.widgetBox td { text-align:left; padding:.5em; } + +/* ----- Content | End ----- */ + +/* ----- Popup | Start ----- */ + +/* popup */ +#popHeadder { width:620px; height:40px; background:url(../images/popupTopBg.png) repeat-x left top; } +#popHeadder h1 { padding:13px 0 0 19px; height:27px; background:url(../images/popupTopBgEnd.png) no-repeat right top; font-size:1.2em; color:#d8d8d8;} +#popBody { width:600px; padding:10px; background:#ffffff;} +#popFooter { width:620px; background:#f7f7f6; border-top:1px solid #e8e8e7; padding:.5em 0 .5em 0; overflow:hidden; } +#popFooter .close { position:relative; left:50%; margin-left:-1em; float:left;} + +#popBody .tableType5 { border:1px solid #c1c0bd; border-left:none; border-right:none; width:100%;} +#popBody .tableType5 th { border-top:1px solid #fbfbfb; border-bottom:1px solid #e4e4e4; background:#f5f5f5; padding:8px 10px 7px 2em; font-weight:normal; text-align:left; color:#606060;} +#popBody .tableType5 td { border-bottom:1px solid #ededed; padding:8px 10px 7px 10px; color:#7b7972;} +/*#popBody .tableType5 td input,*/ +#popBody .tableType5 td textarea, +#popBody .tableType5 td select { margin-bottom:.5em; vertical-align:middle;} +#popBody .tableType5 td .w100 { width:100%; display:block;} +#popBody .tableType5 td .checkbox { margin:-3px; margin-bottom:1em; } +#popBody .tableType5 td p { line-height:1.4em;} +#popBody .tableType5 td.blue a { color:#158692;} +#popBody .tableType5 .borderBottomNone { border-bottom:none;} + +/* ----- Popup | End ----- */ + +.widget_item { margin-bottom:.5em; } +.layout_editor { width:100%; height:500px; border:0px; font-size:1em; } +.layout_editor_box { padding:10px; border:1px solid #DDDDDD; } + +/* adminSearch */ +.adminSearch { text-align:right; clear:both; width:100%;} +.adminSearch fieldset { border:none; display:inline; overflow:visible; } +.adminSearch * { vertical-align:middle;} + +.title { font-size:1.5em; font-weight:bold; margin-top:2em; margin-bottom:.5em; color:#666666; } +.desc { font-size:1em; margin-bottom:.5em; color:#ADADAD;} + +.w700 { width:700px; } +.w5 { width:5em; } + +.nowrap { white-space:nowrap; } +.mid_list { width:7em; } + +ul.extra_vars li { margin-bottom:.5em;} +li.type_key { float:left; width:10em; } +li.type_value { clear:right; } + +.admin_news { width:49%; float:left; margin-right:10px; } +.admin_link { width:49%; float:right; } diff --git a/modules/admin/tpl/css/admin_layout.css b/modules/admin/tpl/css/admin_layout.css new file mode 100644 index 000000000..0bb015d71 --- /dev/null +++ b/modules/admin/tpl/css/admin_layout.css @@ -0,0 +1,65 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +/* +Used Hack + +IE6 & Below +{ property:value; _property:value;} + +IE7 Only +*:first-child+html #selector + +*/ + +/* default.css - Type Selector Definition */ +li { list-style:none;} +a { text-decoration:none;} +a:hover { text-decoration:underline;} +address { font-style:normal;} + +/* Special Class Selector */ +.fr { float:right;} +.fl { float:left;} +.fwB { font-weight:bold;} + +/* ----- Header | Start ----- */ + +#header { position:relative; height:71px; background:url(../images/headerBg.gif) repeat-x; overflow:hidden; clear:both; z-index:99;} +#header h1 { float:left; width:180px; height:71px; position:relative; background:url(../images/h1_bg.gif) no-repeat;} +#header h1 img { position:absolute; top:29px; left:29px;} +#header #logout { width:470px; height:71px; float:right; background:url(../images/headerBgEnd.png) no-repeat right top;} +#header #logout a { float:right; position:relative; top:29px; right:24px;} + +/* ----- Header | End ----- */ + +#cBody { clear:both; padding:0px 18px 0px 198px; margin:-71px 0 -38px 0; overflow:hidden; background:#ffffff url(../images/menuBg.gif) repeat-y;} + +#gNavigation { float:left; width:180px; padding:71px 0 200px 0; margin-right:18px; margin-left:-198px; _margin-left:-99px; background:#ffffff url(../images/menuBg.gif) repeat-y;} +#gNavigation h2 { } +#gNavigation ul { width:180px;} +#gNavigation ul li { width:180px; height:30px; background:url(../images/menuBg.png) no-repeat left top; } /* behavior:url(./common/js/iePngFix.htc);}*/ +#gNavigation ul li.on { background-position:left -30px; margin-top:-2px; _background:url(../images/menuBgIeFix.png) no-repeat left top;} +#gNavigation ul li.on a { color:#ffffff; font-weight:bold;} +#gNavigation ul li a { display:block; padding:9px 0 0 28px; height:21px; color:#606060;} +#gNavigation ul li a:hover { background:url(../images/menuBgIeFix.png) no-repeat; margin-top:-2px; font-weight:bold; color:#ffffff; text-decoration:none;} +#gNavigation ul li.on a:hover { background:url(../images/menuBgIeFix.png) no-repeat; margin-top:0; font-weight:bold; color:#ffffff; text-decoration:none;} +#gNavigation .menuEdit { width:180px; height:30px; text-align:center; margin-top:1em;} + +#content { float:left; width:100%; padding:71px 0 100px 0;} + +/* ----- Footer | Start ----- */ + +#footer { width:100%; clear:both; height:38px; margin-bottom:-38px; overflow:hidden; background:url(../images/footerBg.gif) repeat-x left 3px;} +#footer .footerLine { height:3px; width:100%; float:left; clear:both;} +#footer .footerLeft { float:left;} +#footer address { float:right; width:350px; height:35px; background:url(../images/addressBg.gif) no-repeat right top;} +#footer address img { margin:15px 10px 0 0} +#footer address .version { font:.8em Tahoma; color:#ffffff;} +#footer address .version strong { font:bold 1em Tahoma; color:#ff0000; } + +/* ----- Footer | End ----- */ + diff --git a/modules/admin/tpl/filter/delete_shortcut.xml b/modules/admin/tpl/filter/delete_shortcut.xml new file mode 100644 index 000000000..e70f82f9d --- /dev/null +++ b/modules/admin/tpl/filter/delete_shortcut.xml @@ -0,0 +1,9 @@ + +
+ + + + + + +
diff --git a/modules/admin/tpl/filter/update_env_config.xml b/modules/admin/tpl/filter/update_env_config.xml new file mode 100644 index 000000000..a89e6e9a0 --- /dev/null +++ b/modules/admin/tpl/filter/update_env_config.xml @@ -0,0 +1,9 @@ + +
+ + + + + + +
diff --git a/modules/admin/tpl/images/address.gif b/modules/admin/tpl/images/address.gif new file mode 100644 index 000000000..30e7a4c91 Binary files /dev/null and b/modules/admin/tpl/images/address.gif differ diff --git a/modules/admin/tpl/images/addressBg.gif b/modules/admin/tpl/images/addressBg.gif new file mode 100644 index 000000000..ae501212c Binary files /dev/null and b/modules/admin/tpl/images/addressBg.gif differ diff --git a/modules/admin/tpl/images/blank.gif b/modules/admin/tpl/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/modules/admin/tpl/images/blank.gif differ diff --git a/modules/admin/tpl/images/bottomGotoFirst.gif b/modules/admin/tpl/images/bottomGotoFirst.gif new file mode 100644 index 000000000..e0297fecb Binary files /dev/null and b/modules/admin/tpl/images/bottomGotoFirst.gif differ diff --git a/modules/admin/tpl/images/bottomGotoLast.gif b/modules/admin/tpl/images/bottomGotoLast.gif new file mode 100644 index 000000000..0a7141d0d Binary files /dev/null and b/modules/admin/tpl/images/bottomGotoLast.gif differ diff --git a/modules/admin/tpl/images/buttonLogout.png b/modules/admin/tpl/images/buttonLogout.png new file mode 100644 index 000000000..5352f97ec Binary files /dev/null and b/modules/admin/tpl/images/buttonLogout.png differ diff --git a/modules/admin/tpl/images/buttonTypeACenter.gif b/modules/admin/tpl/images/buttonTypeACenter.gif new file mode 100644 index 000000000..56127ea2e Binary files /dev/null and b/modules/admin/tpl/images/buttonTypeACenter.gif differ diff --git a/modules/admin/tpl/images/buttonTypeALeft.gif b/modules/admin/tpl/images/buttonTypeALeft.gif new file mode 100644 index 000000000..e23080b50 Binary files /dev/null and b/modules/admin/tpl/images/buttonTypeALeft.gif differ diff --git a/modules/admin/tpl/images/buttonTypeARight.gif b/modules/admin/tpl/images/buttonTypeARight.gif new file mode 100644 index 000000000..1dd5aac05 Binary files /dev/null and b/modules/admin/tpl/images/buttonTypeARight.gif differ diff --git a/modules/admin/tpl/images/buttonTypeBCenter.gif b/modules/admin/tpl/images/buttonTypeBCenter.gif new file mode 100644 index 000000000..cef8361e8 Binary files /dev/null and b/modules/admin/tpl/images/buttonTypeBCenter.gif differ diff --git a/modules/admin/tpl/images/buttonTypeBLeft.gif b/modules/admin/tpl/images/buttonTypeBLeft.gif new file mode 100644 index 000000000..4614e6946 Binary files /dev/null and b/modules/admin/tpl/images/buttonTypeBLeft.gif differ diff --git a/modules/admin/tpl/images/buttonTypeBRight.gif b/modules/admin/tpl/images/buttonTypeBRight.gif new file mode 100644 index 000000000..8136596ae Binary files /dev/null and b/modules/admin/tpl/images/buttonTypeBRight.gif differ diff --git a/modules/admin/tpl/images/buttonTypeInput24.gif b/modules/admin/tpl/images/buttonTypeInput24.gif new file mode 100644 index 000000000..0dcfc0e3d Binary files /dev/null and b/modules/admin/tpl/images/buttonTypeInput24.gif differ diff --git a/modules/admin/tpl/images/button_down.gif b/modules/admin/tpl/images/button_down.gif new file mode 100644 index 000000000..d89fe1a5a Binary files /dev/null and b/modules/admin/tpl/images/button_down.gif differ diff --git a/modules/admin/tpl/images/button_up.gif b/modules/admin/tpl/images/button_up.gif new file mode 100644 index 000000000..1660d5ced Binary files /dev/null and b/modules/admin/tpl/images/button_up.gif differ diff --git a/modules/admin/tpl/images/footerBg.gif b/modules/admin/tpl/images/footerBg.gif new file mode 100644 index 000000000..945aa6cd6 Binary files /dev/null and b/modules/admin/tpl/images/footerBg.gif differ diff --git a/modules/admin/tpl/images/footerLeft.gif b/modules/admin/tpl/images/footerLeft.gif new file mode 100644 index 000000000..5a464f477 Binary files /dev/null and b/modules/admin/tpl/images/footerLeft.gif differ diff --git a/modules/admin/tpl/images/footerLine.gif b/modules/admin/tpl/images/footerLine.gif new file mode 100644 index 000000000..b5555e828 Binary files /dev/null and b/modules/admin/tpl/images/footerLine.gif differ diff --git a/modules/admin/tpl/images/h1.png b/modules/admin/tpl/images/h1.png new file mode 100644 index 000000000..96fa3bdad Binary files /dev/null and b/modules/admin/tpl/images/h1.png differ diff --git a/modules/admin/tpl/images/h1_bg.gif b/modules/admin/tpl/images/h1_bg.gif new file mode 100644 index 000000000..3ce4768b4 Binary files /dev/null and b/modules/admin/tpl/images/h1_bg.gif differ diff --git a/modules/admin/tpl/images/h2.gif b/modules/admin/tpl/images/h2.gif new file mode 100644 index 000000000..8e5918f8b Binary files /dev/null and b/modules/admin/tpl/images/h2.gif differ diff --git a/modules/admin/tpl/images/h3.gif b/modules/admin/tpl/images/h3.gif new file mode 100644 index 000000000..f159eaa5b Binary files /dev/null and b/modules/admin/tpl/images/h3.gif differ diff --git a/modules/admin/tpl/images/h4.gif b/modules/admin/tpl/images/h4.gif new file mode 100644 index 000000000..ace747f3f Binary files /dev/null and b/modules/admin/tpl/images/h4.gif differ diff --git a/modules/admin/tpl/images/headerBg.gif b/modules/admin/tpl/images/headerBg.gif new file mode 100644 index 000000000..4ddc519c5 Binary files /dev/null and b/modules/admin/tpl/images/headerBg.gif differ diff --git a/modules/admin/tpl/images/headerBgEnd.png b/modules/admin/tpl/images/headerBgEnd.png new file mode 100644 index 000000000..d484917b9 Binary files /dev/null and b/modules/admin/tpl/images/headerBgEnd.png differ diff --git a/modules/admin/tpl/images/iconCreate.gif b/modules/admin/tpl/images/iconCreate.gif new file mode 100644 index 000000000..0fdecf963 Binary files /dev/null and b/modules/admin/tpl/images/iconCreate.gif differ diff --git a/modules/admin/tpl/images/iconGallery.gif b/modules/admin/tpl/images/iconGallery.gif new file mode 100644 index 000000000..d75fb10cb Binary files /dev/null and b/modules/admin/tpl/images/iconGallery.gif differ diff --git a/modules/admin/tpl/images/iconGraph.gif b/modules/admin/tpl/images/iconGraph.gif new file mode 100644 index 000000000..a6f66bb73 Binary files /dev/null and b/modules/admin/tpl/images/iconGraph.gif differ diff --git a/modules/admin/tpl/images/iconH3.gif b/modules/admin/tpl/images/iconH3.gif new file mode 100644 index 000000000..8ea0cec82 Binary files /dev/null and b/modules/admin/tpl/images/iconH3.gif differ diff --git a/modules/admin/tpl/images/iconHtml.gif b/modules/admin/tpl/images/iconHtml.gif new file mode 100644 index 000000000..7ca1ed109 Binary files /dev/null and b/modules/admin/tpl/images/iconHtml.gif differ diff --git a/modules/admin/tpl/images/iconImage.gif b/modules/admin/tpl/images/iconImage.gif new file mode 100644 index 000000000..1c3e4b1b8 Binary files /dev/null and b/modules/admin/tpl/images/iconImage.gif differ diff --git a/modules/admin/tpl/images/iconImoticon.gif b/modules/admin/tpl/images/iconImoticon.gif new file mode 100644 index 000000000..244ecbfcc Binary files /dev/null and b/modules/admin/tpl/images/iconImoticon.gif differ diff --git a/modules/admin/tpl/images/iconLink.gif b/modules/admin/tpl/images/iconLink.gif new file mode 100644 index 000000000..71de70f13 Binary files /dev/null and b/modules/admin/tpl/images/iconLink.gif differ diff --git a/modules/admin/tpl/images/iconMap.gif b/modules/admin/tpl/images/iconMap.gif new file mode 100644 index 000000000..24a77f428 Binary files /dev/null and b/modules/admin/tpl/images/iconMap.gif differ diff --git a/modules/admin/tpl/images/iconMedia.gif b/modules/admin/tpl/images/iconMedia.gif new file mode 100644 index 000000000..104abed57 Binary files /dev/null and b/modules/admin/tpl/images/iconMedia.gif differ diff --git a/modules/admin/tpl/images/iconQuote.gif b/modules/admin/tpl/images/iconQuote.gif new file mode 100644 index 000000000..06ae37600 Binary files /dev/null and b/modules/admin/tpl/images/iconQuote.gif differ diff --git a/modules/admin/tpl/images/iconTable.gif b/modules/admin/tpl/images/iconTable.gif new file mode 100644 index 000000000..a7ddb7ac4 Binary files /dev/null and b/modules/admin/tpl/images/iconTable.gif differ diff --git a/modules/admin/tpl/images/iconView.gif b/modules/admin/tpl/images/iconView.gif new file mode 100644 index 000000000..fc0d94e5c Binary files /dev/null and b/modules/admin/tpl/images/iconView.gif differ diff --git a/modules/admin/tpl/images/menuBg.gif b/modules/admin/tpl/images/menuBg.gif new file mode 100644 index 000000000..13362d836 Binary files /dev/null and b/modules/admin/tpl/images/menuBg.gif differ diff --git a/modules/admin/tpl/images/menuBg.png b/modules/admin/tpl/images/menuBg.png new file mode 100644 index 000000000..36af2bc80 Binary files /dev/null and b/modules/admin/tpl/images/menuBg.png differ diff --git a/modules/admin/tpl/images/menuBgIeFix.png b/modules/admin/tpl/images/menuBgIeFix.png new file mode 100644 index 000000000..4f270e064 Binary files /dev/null and b/modules/admin/tpl/images/menuBgIeFix.png differ diff --git a/modules/admin/tpl/images/popupTopBg.png b/modules/admin/tpl/images/popupTopBg.png new file mode 100644 index 000000000..13b6af023 Binary files /dev/null and b/modules/admin/tpl/images/popupTopBg.png differ diff --git a/modules/admin/tpl/images/popupTopBgEnd.png b/modules/admin/tpl/images/popupTopBgEnd.png new file mode 100644 index 000000000..9d52e19f9 Binary files /dev/null and b/modules/admin/tpl/images/popupTopBgEnd.png differ diff --git a/modules/admin/tpl/images/tableType1Header.gif b/modules/admin/tpl/images/tableType1Header.gif new file mode 100644 index 000000000..13aa5ab9a Binary files /dev/null and b/modules/admin/tpl/images/tableType1Header.gif differ diff --git a/modules/admin/tpl/index.html b/modules/admin/tpl/index.html new file mode 100644 index 000000000..0308bb951 --- /dev/null +++ b/modules/admin/tpl/index.html @@ -0,0 +1,96 @@ + + + +

{$lang->welcome_to_zeroboard_xe}

+ +
+ +++ + + + + + + + + + + + + +
{$lang->env_setup}
Lang + +
{$lang->use_rewrite} + checked="checked" /> +

{$lang->about_rewrite}

+
{$lang->time_zone} + +

{$lang->about_time_zone}

+
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + +
{$lang->newest_news}
{$lang->title}{$lang->regdate}
 {$val->title}{zdate($val->date,"Y-m-d H:i")}
+ +
+ + diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js new file mode 100644 index 000000000..b72e6edee --- /dev/null +++ b/modules/admin/tpl/js/admin.js @@ -0,0 +1,31 @@ +/** + * @file admin.js + * @author zero (zero@nzeo.com) + * @brief admin 모듈의 javascript + **/ + +// 숏컷 삭제 +function doDeleteShortCut(selected_module) { + var fo_obj = xGetElementById('fo_shortcut_info'); + fo_obj.selected_module.value = selected_module; + procFilter(fo_obj, delete_shortcut); +} + +// footer를 화면 크기에 맞춰 설정 (폐기) +//xAddEventListener(window, 'load', fixAdminLayoutFooter); +//xAddEventListener(window, 'resize', fixAdminLayoutFooter); +function fixAdminLayoutFooter(height) { + return; +} + +if(xIE6) { + xAddEventListener(window,'load',fixAdminNaviHeight); +} + +function fixAdminNaviHeight() { + var naviHeight = xHeight('gNavigation'); + var bodyHeight = xHeight('content'); + if(naviHeight + + + + +
+ +
+

Administration

+ + +
+ +
{$content}
+ +
+ + diff --git a/modules/admin/tpl/shortcut_list.html b/modules/admin/tpl/shortcut_list.html new file mode 100644 index 000000000..7f3f0ea74 --- /dev/null +++ b/modules/admin/tpl/shortcut_list.html @@ -0,0 +1,32 @@ + + + +

{$lang->cmd_shortcut_management}

+ +
{$lang->about_shortcut}
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + +
{$lang->title}{$lang->module}{$lang->regdate}{$lang->cmd_delete}
{$shortcut_info->title}{$shortcut_info->module}{zdate($shortcut_info->regdate,"Y-m-d H:i:s")}{$lang->cmd_delete}
diff --git a/modules/blog/blog.admin.controller.php b/modules/blog/blog.admin.controller.php new file mode 100644 index 000000000..68c8f6f8d --- /dev/null +++ b/modules/blog/blog.admin.controller.php @@ -0,0 +1,566 @@ +xml_info->grant; + + if(count($grant_list)) { + foreach($grant_list as $key => $val) { + $group_srls = Context::get($key); + if($group_srls) $arr_grant[$key] = explode('|@|',$group_srls); + } + $grants = serialize($arr_grant); + } + + $oModuleController = &getController('module'); + $oModuleController->updateModuleGrant($module_srl, $grants); + + $this->add('module_srl',Context::get('module_srl')); + $this->setMessage('success_registed'); + } + + /** + * @brief 스킨 정보 업데이트 + **/ + function procBlogAdminUpdateSkinInfo() { + // module_srl에 해당하는 정보들을 가져오기 + $module_srl = Context::get('module_srl'); + + $oModuleModel = &getModel('module'); + $oModuleController = &getController('module'); + + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + $skin = $module_info->skin; + + // 스킨의 정보르 구해옴 (extra_vars를 체크하기 위해서) + $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin); + + // 입력받은 변수들을 체크 (mo, act, module_srl, page등 기본적인 변수들 없앰) + $obj = Context::getRequestVars(); + unset($obj->act); + unset($obj->module_srl); + unset($obj->page); + + // 원 skin_info에서 extra_vars의 type이 image일 경우 별도 처리를 해줌 + if($skin_info->extra_vars) { + foreach($skin_info->extra_vars as $vars) { + if($vars->type!='image') continue; + + $image_obj = $obj->{$vars->name}; + + // 삭제 요청에 대한 변수를 구함 + $del_var = $obj->{"del_".$vars->name}; + unset($obj->{"del_".$vars->name}); + if($del_var == 'Y') { + @unlink($module_info->{$vars->name}); + continue; + } + + // 업로드 되지 않았다면 이전 데이터를 그대로 사용 + if(!$image_obj['tmp_name']) { + $obj->{$vars->name} = $module_info->{$vars->name}; + continue; + } + + // 정상적으로 업로드된 파일이 아니면 무시 + if(!is_uploaded_file($image_obj['tmp_name'])) { + unset($obj->{$vars->name}); + continue; + } + + // 이미지 파일이 아니어도 무시 + if(!eregi("\.(jpg|jpeg|gif|png)$", $image_obj['name'])) { + unset($obj->{$vars->name}); + continue; + } + + // 경로를 정해서 업로드 + $path = sprintf("./files/attach/images/%s/", $module_srl); + + // 디렉토리 생성 + if(!FileHandler::makeDir($path)) return false; + + $filename = $path.$image_obj['name']; + + // 파일 이동 + if(!move_uploaded_file($image_obj['tmp_name'], $filename)) { + unset($obj->{$vars->name}); + continue; + } + + // 변수를 바꿈 + unset($obj->{$vars->name}); + $obj->{$vars->name} = $filename; + } + } + + // 메뉴 관리 + $menus = get_object_vars($skin_info->menu); + if(count($menus)) { + foreach($menus as $menu_id => $val) { + $menu_srl = Context::get($menu_id); + if($menu_srl) { + $obj->menu->{$menu_id} = $menu_srl; + $obj->{$menu_id} = $menu_srl; + $menu_srl_list[] = $menu_srl; + } + } + + // 정해진 메뉴가 있으면 모듈 및 메뉴에 대한 레이아웃 연동 + if(count($menu_srl_list)) { + // 해당 메뉴와 레이아웃 값을 매핑 + $oMenuAdminController = &getAdminController('menu'); + $oMenuAdminController->updateMenuLayout($module_srl, $menu_srl_list); + + // 해당 메뉴에 속한 mid의 layout값을 모두 변경 + $oModuleController->updateModuleLayout($module_srl, $menu_srl_list); + } + } + + // serialize하여 저장 + $obj->category_xml_file = sprintf("./files/cache/blog_category/%s.xml.php", $module_srl); + $obj->mid = $module_info->mid; + $skin_vars = serialize($obj); + + $oModuleController->updateModuleSkinVars($module_srl, $skin_vars); + + // 레이아웃 확장변수 수정 + $layout_args->extra_vars = $skin_vars; + $layout_args->layout_srl = $module_srl; + $oLayoutAdminController = &getAdminController('layout'); + $output = $oLayoutAdminController->updateLayout($layout_args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + $this->setLayoutPath('./common/tpl'); + $this->setLayoutFile('default_layout.html'); + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile("top_refresh.html"); + } + + /** + * @brief 블로그 추가 + **/ + function procBlogAdminInsertBlog() { + // 일단 입력된 값들을 모두 받아서 db 입력항목과 그외 것으로 분리 + $args = Context::gets('module_srl','module_category_srl','blog_name','skin','browser_title','description','is_default','header_text','footer_text','admin_id','open_rss'); + $args->module = 'blog'; + $args->mid = $args->blog_name; + unset($args->blog_name); + if($args->is_default!='Y') $args->is_default = 'N'; + + // 기본 값외의 것들을 정리 + $extra_var = delObjectVars(Context::getRequestVars(), $args); + unset($extra_var->act); + unset($extra_var->page); + unset($extra_var->blog_name); + + $oDB = &DB::getInstance(); + $oDB->begin(); + + // module_srl이 넘어오면 원 모듈이 있는지 확인 + if($args->module_srl) { + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl); + + // 만약 원래 모듈이 없으면 새로 입력하기 위한 처리 + if($module_info->module_srl != $args->module_srl) unset($args->module_srl); + } + + // $extra_var를 serialize + $args->extra_vars = serialize($extra_var); + + // module 모듈의 controller 객체 생성 + $oModuleController = &getController('module'); + + // is_default=='Y' 이면 + if($args->is_default=='Y') $oModuleController->clearDefaultModule(); + + // module_srl의 값에 따라 insert/update + if(!$args->module_srl) { + // 블로그 등록 + $output = $oModuleController->insertModule($args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 글작성, 파일첨부, 댓글 파일첨부, 관리에 대한 권한 지정 + if($output->toBool()) { + $oMemberModel = &getModel('member'); + $admin_group = $oMemberModel->getAdminGroup(); + $admin_group_srl = $admin_group->group_srl; + + $module_srl = $output->get('module_srl'); + $grants = serialize(array('write_document'=>array($admin_group_srl), 'fileupload'=>array($admin_group_srl), 'comment_fileupload'=>array($admin_group_srl), 'manager'=>array($admin_group_srl))); + + $output = $oModuleController->updateModuleGrant($module_srl, $grants); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + } + + // 레이아웃 등록 + $layout_args->layout_srl = $layout_args->module_srl = $module_srl; + $layout_args->layout = 'blog'; + $layout_args->title = sprintf('%s - %s',$args->browser_title, $args->mid); + $layout_args->layout_path = sprintf('./modules/blog/skins/%s/layout.html', $args->skin); + + $oLayoutController = &getAdminController('layout'); + $output = $oLayoutController->insertLayout($layout_args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 기본 카테고리 등록 + $category_args->module_srl = $module_srl; + $category_args->category_srl = getNextSequence(); + $category_args->name = 'Story'; + $category_args->expand = 'N'; + $this->procBlogAdminInsertCategory($category_args); + + $msg_code = 'success_registed'; + } else { + // 블로그 데이터 수정 + $output = $oModuleController->updateModule($args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 레이아웃 수정 + $layout_args->layout_srl = $layout_args->module_srl = $module_srl = $output->get('module_srl'); + $layout_args->title = $args->browser_title; + $layout_args->layout_path = sprintf('./modules/blog/skins/%s/layout.html', $args->skin); + + $oLayoutAdminController = &getAdminController('layout'); + $output = $oLayoutAdminController->updateLayout($layout_args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + $msg_code = 'success_updated'; + } + + $oDB->commit(); + + $this->add('page',Context::get('page')); + $this->add('module_srl',$output->get('module_srl')); + $this->setMessage($msg_code); + } + + /** + * @brief 블로그 삭제 + **/ + function procBlogAdminDeleteBlog() { + $module_srl = Context::get('module_srl'); + + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 블로그 모듈 삭제 + $oModuleController = &getController('module'); + $output = $oModuleController->deleteModule($module_srl); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 레이아웃 삭제 + $layout_args->layout_srl = $layout_args->module_srl = $module_srl; + + $oLayoutAdminController = &getAdminController('layout'); + $output = $oLayoutAdminController->deleteLayout($layout_args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 블로그 카테고리 삭제 + $category_args->module_srl = $module_srl; + $output = executeQuery('blog.deleteCategories', $category_args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + @unlink( sprintf('./files/cache/blog_category/%d.xml.php', $module_srl) ); + + $oDB->commit(); + + $this->add('module','blog'); + $this->add('page',Context::get('page')); + $this->setMessage('success_deleted'); + } + + /** + * @brief 카테고리 추가 + **/ + function procBlogAdminInsertCategory($args = null) { + // 입력할 변수 정리 + if(!$args) $args = Context::gets('module_srl','category_srl','parent_srl','name','expand','group_srls'); + + if($args->expand !="Y") $args->expand = "N"; + $args->group_srls = str_replace('|@|',',',$args->group_srls); + $args->parent_srl = (int)$args->parent_srl; + + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 이미 존재하는지를 확인 + $oBlogModel = &getModel('blog'); + $category_info = $oBlogModel->getCategoryInfo($args->category_srl); + + // 존재하게 되면 update를 해준다 + if($category_info->category_srl == $args->category_srl) { + $output = executeQuery('blog.updateCategory', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + $oDocumentController = &getAdminController('document'); + $document_args->category_srl = $args->category_srl; + $document_args->title = $args->name ; + $output = $oDocumentController->updateCategory($document_args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 존재하지 않으면 insert를 해준다 + } else { + $args->listorder = -1*$args->category_srl; + $output = executeQuery('blog.insertCategory', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + $oDocumentController = &getAdminController('document'); + $output = $oDocumentController->insertCategory($args->module_srl, $args->name, $args->category_srl); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + } + + // XML 파일을 갱신하고 위치을 넘겨 받음 + $xml_file = $this->makeXmlFile($args->module_srl); + + $oDB->commit(); + + $this->add('xml_file', $xml_file); + $this->add('module_srl', $args->module_srl); + $this->add('category_srl', $args->category_srl); + $this->add('parent_srl', $args->parent_srl); + } + + /** + * @brief 카테고리 삭제 + **/ + function procBlogAdminDeleteCategory() { + // 변수 정리 + $args = Context::gets('module_srl','category_srl'); + + $oDB = &DB::getInstance(); + $oDB->begin(); + + $oBlogModel = &getModel('blog'); + + // 원정보를 가져옴 + $category_info = $oBlogModel->getCategoryInfo($args->category_srl); + if($category_info->parent_srl) $parent_srl = $category_info->parent_srl; + + // 자식 노드가 있는지 체크하여 있으면 삭제 못한다는 에러 출력 + $output = executeQuery('blog.getChildCategoryCount', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + if($output->data->count>0) { + $oDB->rollback(); + return new Object(-1, 'msg_cannot_delete_for_child'); + } + + // DB에서 삭제 + $output = executeQuery("blog.deleteCategory", $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + $oDocumentController = &getAdminController('document'); + $output = $oDocumentController->deleteCategory($args->category_srl); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // XML 파일을 갱신하고 위치을 넘겨 받음 + $xml_file = $this->makeXmlFile($args->module_srl); + + $oDB->commit(); + + $this->add('xml_file', $xml_file); + $this->add('category_srl', $parent_srl); + $this->setMessage('success_deleted'); + } + + /** + * @brief 카테고리 이동 + **/ + function procBlogAdminMoveCategory() { + $source_category_srl = Context::get('source_category_srl'); + $target_category_srl = Context::get('target_category_srl'); + + $oBlogModel = &getModel('blog'); + $target_category = $oBlogModel->getCategoryInfo($target_category_srl); + $source_category = $oBlogModel->getCategoryInfo($source_category_srl); + + // source_category에 target_category_srl의 parent_srl, listorder 값을 입력 + $source_args->category_srl = $source_category_srl; + $source_args->parent_srl = $target_category->parent_srl; + $source_args->listorder = $target_category->listorder; + $output = executeQuery('blog.updateCategoryParent', $source_args); + if(!$output->toBool()) return $output; + + // target_category의 listorder값을 +1해 준다 + $target_args->category_srl = $target_category_srl; + $target_args->parent_srl = $target_category->parent_srl; + $target_args->listorder = $target_category->listorder -1; + $output = executeQuery('blog.updateCategoryParent', $target_args); + if(!$output->toBool()) return $output; + + // xml파일 재생성 + $xml_file = $this->makeXmlFile($target_category->module_srl); + + // return 변수 설정 + $this->add('xml_file', $xml_file); + $this->add('source_category_srl', $source_category_srl); + } + + /** + * @brief xml 파일을 갱신 + * 관리자페이지에서 메뉴 구성 후 간혹 xml파일이 재생성 안되는 경우가 있는데\n + * 이럴 경우 관리자의 수동 갱신 기능을 구현해줌\n + * 개발 중간의 문제인 것 같고 현재는 문제가 생기지 않으나 굳이 없앨 필요 없는 기능 + **/ + function procBlogAdminMakeXmlFile() { + // 입력값을 체크 + $module_srl = Context::get('module_srl'); + + // xml파일 재생성 + $xml_file = $this->makeXmlFile($module_srl); + + // return 값 설정 + $this->add('xml_file',$xml_file); + } + + /** + * @brief 블로그 카테고리를 xml파일로 저장 + **/ + function makeXmlFile($module_srl) { + // xml파일 생성시 필요한 정보가 없으면 그냥 return + if(!$module_srl) return; + + // 캐시 파일의 이름을 지정 + $xml_file = sprintf("./files/cache/blog_category/%s.xml.php", $module_srl); + + // 모듈정보를 구해옴 + $oModuleModel = &getModel('module'); + $this->module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + + // DB에서 module_srl 에 해당하는 메뉴 아이템 목록을 listorder순으로 구해옴 + $oBlogModel = &getModel('blog'); + $list = $oBlogModel->getCategoryList($module_srl); + + // 구해온 데이터가 없다면 노드데이터가 없는 xml 파일만 생성 + if(!$list) { + $xml_buff = ""; + FileHandler::writeFile($xml_file, $xml_buff); + return $xml_file; + } + + // 구해온 데이터가 하나라면 array로 바꾸어줌 + if(!is_array($list)) $list = array($list); + + // 루프를 돌면서 tree 구성 + $list_count = count($list); + for($i=0;$i<$list_count;$i++) { + $node = $list[$i]; + $category_srl = $node->category_srl; + $parent_srl = $node->parent_srl; + + $tree[$parent_srl][$category_srl] = $node; + } + + // xml 캐시 파일 생성 + $xml_buff = sprintf('%s', $this->getXmlTree($tree[0], $tree)); + + // 파일 저장 + FileHandler::writeFile($xml_file, $xml_buff); + return $xml_file; + } + + /** + * @brief array로 정렬된 노드들을 parent_srl을 참조하면서 recursive하게 돌면서 xml 데이터 생성 + * 메뉴 xml파일은 node라는 tag가 중첩으로 사용되며 이 xml doc으로 관리자 페이지에서 메뉴를 구성해줌\n + * (tree_menu.js 에서 xml파일을 바로 읽고 tree menu를 구현) + **/ + function getXmlTree($source_node, $tree) { + if(!$source_node) return; + foreach($source_node as $category_srl => $node) { + $child_buff = ""; + + // 자식 노드의 데이터 가져옴 + if($category_srl && $tree[$category_srl]) $child_buff = $this->getXmlTree($tree[$category_srl], $tree); + + // 변수 정리 + $name = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->name); + $expand = $node->expand; + $group_srls = $node->group_srls; + + // node->group_srls값이 있으면 + if($group_srls) $group_check_code = sprintf('($_SESSION["is_admin"]==true||(is_array($_SESSION["group_srls"])&&count(array_intersect($_SESSION["group_srls"], array(%s)))))',$group_srls); + else $group_check_code = "true"; + + $attribute = sprintf( + 'node_srl="%s" text="" url="%s" expand="%s" ', + $category_srl, + $group_check_code, + $name, + getUrl('','mid',$this->module_info->mid,'category',$category_srl), + $expand + ); + + if($child_buff) $buff .= sprintf('%s', $attribute, $child_buff); + else $buff .= sprintf('', $attribute); + } + return $buff; + } + } +?> diff --git a/modules/blog/blog.admin.model.php b/modules/blog/blog.admin.model.php new file mode 100644 index 000000000..8bd505241 --- /dev/null +++ b/modules/blog/blog.admin.model.php @@ -0,0 +1,65 @@ +getGroups(); + Context::set('group_list', $group_list); + + $oBlogModel = &getModel('blog'); + + // parent_srl이 있고 category_srl 이 없으면 하부 메뉴 추가임 + if(!$category_srl && $parent_srl) { + // 상위 메뉴의 정보를 가져옴 + $parent_info = $oBlogModel->getCategoryInfo($parent_srl); + + // 추가하려는 메뉴의 기본 변수 설정 + $category_info->category_srl = getNextSequence(); + $category_info->parent_srl = $parent_srl; + $category_info->parent_category_name = $parent_info->name; + + // root에 메뉴 추가하거나 기존 메뉴의 수정일 경우 + } else { + // category_srl 이 있으면 해당 메뉴의 정보를 가져온다 + if($category_srl) $category_info = $oBlogModel->getCategoryInfo($category_srl); + + // 찾아진 값이 없다면 신규 메뉴 추가로 보고 category_srl값만 구해줌 + if(!$category_info->category_srl) { + $category_info->category_srl = getNextSequence(); + } + } + + Context::set('category_info', $category_info); + + // template 파일을 직접 컴파일한후 tpl변수에 담아서 return한다. + $oTemplate = &TemplateHandler::getInstance(); + $tpl = $oTemplate->compile($this->module_path.'tpl', 'category_info'); + + // return 할 변수 설정 + $this->add('tpl', $tpl); + } + + } +?> diff --git a/modules/blog/blog.admin.view.php b/modules/blog/blog.admin.view.php new file mode 100644 index 000000000..19ec86e2b --- /dev/null +++ b/modules/blog/blog.admin.view.php @@ -0,0 +1,209 @@ +module_srl) { + $module_srl = $this->module_srl; + Context::set('module_srl', $module_srl); + } + + // module model 객체 생성 + $oModuleModel = &getModel('module'); + + // module_srl이 넘어오면 해당 모듈의 정보를 미리 구해 놓음 + if($module_srl) { + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + if($module_info->module_srl == $module_srl) { + $this->module_info = $module_info; + Context::set('module_info',$module_info); + } + } + + // 모듈 카테고리 목록을 구함 + $module_category = $oModuleModel->getModuleCategories(); + Context::set('module_category', $module_category); + + // 만약 블로그 서비스 페이지에서 관리자 기능 호출시 요청된 블로그의 정보와 레이아웃 가져옴 + if($this->mid) { + $oView = &getView('blog'); + $oView->setModuleInfo($this->module_info, $this->xml_info); + $oView->init(); + } + + // 템플릿 경로 지정 (blog의 경우 tpl에 관리자용 템플릿 모아놓음) + $this->setTemplatePath($this->module_path."tpl"); + } + + /** + * @brief 블로그 관리 목록 보여줌 + **/ + function dispBlogAdminContent() { + // 등록된 blog 모듈을 불러와 세팅 + $args->sort_index = "module_srl"; + $args->page = Context::get('page'); + $args->list_count = 40; + $args->page_count = 10; + $args->s_module_category_srl = Context::get('module_category_srl'); + $output = executeQuery('blog.getBlogList', $args); + + // 템플릿에 쓰기 위해서 context::set + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('blog_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + // 템플릿 파일 지정 + $this->setTemplateFile('index'); + } + + /** + * @brief 선택된 블로그의 정보 출력 + **/ + function dispBlogAdminBlogInfo() { + + // module_srl 값이 없다면 그냥 index 페이지를 보여줌 + if(!Context::get('module_srl')) return $this->dispBlogAdminContent(); + + // 레이아웃이 정해져 있다면 레이아웃 정보를 추가해줌(layout_title, layout) + if($this->module_info->layout_srl) { + $oLayoutModel = &getModel('layout'); + $layout_info = $oLayoutModel->getLayout($this->module_info->layout_srl); + $this->module_info->layout = $layout_info->layout; + $this->module_info->layout_title = $layout_info->layout_title; + } + + // 정해진 스킨이 있으면 해당 스킨의 정보를 구함 + if($this->module_info->skin) { + $oModuleModel = &getModel('module'); + $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $this->module_info->skin); + $this->module_info->skin_title = $skin_info->title; + } + + // 템플릿 파일 지정 + $this->setTemplateFile('blog_info'); + } + + /** + * @brief 블로그 추가 폼 출력 + **/ + function dispBlogAdminInsertBlog() { + + // 스킨 목록을 구해옴 + $oModuleModel = &getModel('module'); + $skin_list = $oModuleModel->getSkins($this->module_path); + Context::set('skin_list',$skin_list); + + // 템플릿 파일 지정 + $this->setTemplateFile('blog_insert'); + } + + /** + * @brief 블로그 삭제 화면 출력 + **/ + function dispBlogAdminDeleteBlog() { + + if(!Context::get('module_srl')) return $this->dispBlogAdminContent(); + + $module_info = Context::get('module_info'); + + $oDocumentModel = &getModel('document'); + $document_count = $oDocumentModel->getDocumentCount($module_info->module_srl); + $module_info->document_count = $document_count; + + Context::set('module_info',$module_info); + + // 템플릿 파일 지정 + $this->setTemplateFile('blog_delete'); + } + + /** + * @brief 스킨 정보 보여줌 + **/ + function dispBlogAdminSkinInfo() { + + // 현재 선택된 모듈의 스킨의 정보 xml 파일을 읽음 + $module_info = Context::get('module_info'); + $skin = $module_info->skin; + + $oModuleModel = &getModel('module'); + $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin); + + // skin_info에 extra_vars 값을 지정 + if(count($skin_info->extra_vars)) { + foreach($skin_info->extra_vars as $key => $val) { + $name = $val->name; + $type = $val->type; + $value = $module_info->{$name}; + if($type=="checkbox"&&!$value) $value = array(); + $skin_info->extra_vars[$key]->value= $value; + } + } + + // skin_info에 menu값을 지정 + if(count($skin_info->menu)) { + foreach($skin_info->menu as $key => $val) { + if($module_info->{$key}) $skin_info->menu->{$key}->menu_srl = $module_info->{$key}; + } + } + + // 메뉴를 가져옴 + $oMenuAdminModel = &getAdminModel('menu'); + $menu_list = $oMenuAdminModel->getMenus(); + Context::set('menu_list', $menu_list); + + Context::set('skin_info', $skin_info); + $this->setTemplateFile('skin_info'); + } + + /** + * @brief 카테고리의 정보 출력 + **/ + function dispBlogAdminCategoryInfo() { + // module_srl을 구함 + $module_srl = $this->module_info->module_srl; + + // 카테고리 정보를 가져옴 + $oBlogModel = &getModel('blog'); + $category_info = $oBlogModel->getCategory($module_srl); + + Context::set('category_info', $category_info); + Context::addJsFile('./common/js/tree_menu.js'); + + Context::set('layout','none'); + $this->setTemplateFile('category_list'); + } + + /** + * @brief 권한 목록 출력 + **/ + function dispBlogAdminGrantInfo() { + // module_srl을 구함 + $module_srl = Context::get('module_srl'); + + // module.xml에서 권한 관련 목록을 구해옴 + $grant_list = $this->xml_info->grant; + Context::set('grant_list', $grant_list); + + // 권한 그룹의 목록을 가져온다 + $oMemberModel = &getModel('member'); + $group_list = $oMemberModel->getGroups(); + Context::set('group_list', $group_list); + + $this->setTemplateFile('grant_list'); + } + } +?> diff --git a/modules/blog/blog.class.php b/modules/blog/blog.class.php new file mode 100644 index 000000000..520b1e740 --- /dev/null +++ b/modules/blog/blog.class.php @@ -0,0 +1,53 @@ +insertActionForward('blog', 'view', 'dispBlogAdminContent'); + $oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminBlogInfo'); + $oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminInsertBlog'); + $oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminDeleteBlog'); + $oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminSkinInfo'); + $oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminCategoryInfo'); + $oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminMenuInfo'); + $oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminGrantInfo'); + $oModuleController->insertActionForward('blog', 'controller', 'procBlogAdminUpdateSkinInfo'); + + // 캐쉬로 사용할 디렉토리 생성 + FileHandler::makeDir('./files/cache/blog_category'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + + } +?> diff --git a/modules/blog/blog.controller.php b/modules/blog/blog.controller.php new file mode 100644 index 000000000..5f0640962 --- /dev/null +++ b/modules/blog/blog.controller.php @@ -0,0 +1,226 @@ +grant->write_document) return new Object(-1, 'msg_not_permitted'); + + // 글작성시 필요한 변수를 세팅 + $obj = Context::getRequestVars(); + $obj->module_srl = $this->module_srl; + if($obj->is_notice!='Y'||!$this->grant->manager) $obj->is_notice = 'N'; + + // document module의 model 객체 생성 + $oDocumentModel = &getModel('document'); + + // document module의 controller 객체 생성 + $oDocumentController = &getController('document'); + + // 이미 존재하는 글인지 체크 + $oDocument = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager); + + // 이미 존재하는 경우 수정 + if($oDocument->isExists() && $oDocument->document_srl == $obj->document_srl) { + $output = $oDocumentController->updateDocument($oDocument, $obj); + $msg_code = 'success_updated'; + + // 그렇지 않으면 신규 등록 + } else { + $output = $oDocumentController->insertDocument($obj); + $msg_code = 'success_registed'; + $obj->document_srl = $output->get('document_srl'); + } + + // 오류 발생시 멈춤 + if(!$output->toBool()) return $output; + + // 트랙백이 있으면 트랙백 발송 + $trackback_url = Context::get('trackback_url'); + $trackback_charset = Context::get('trackback_charset'); + if($trackback_url) { + $oTrackbackController = &getController('trackback'); + $oTrackbackController->sendTrackback($obj, $trackback_url, $trackback_charset); + } + + // 결과를 리턴 + $this->add('mid', Context::get('mid')); + $this->add('document_srl', $output->get('document_srl')); + + // 성공 메세지 등록 + $this->setMessage($msg_code); + } + + /** + * @brief 문서 삭제 + **/ + function procBlogDeleteDocument() { + // 문서 번호 확인 + $document_srl = Context::get('document_srl'); + + // 문서 번호가 없다면 오류 발생 + if(!$document_srl) return $this->doError('msg_invalid_document'); + + // document module model 객체 생성 + $oDocumentController = &getController('document'); + + // 삭제 시도 + $output = $oDocumentController->deleteDocument($document_srl, $this->grant->manager); + if(!$output->toBool()) return $output; + + // 성공 메세지 등록 + $this->add('mid', Context::get('mid')); + $this->add('page', $output->get('page')); + $this->setMessage('success_deleted'); + } + + /** + * @brief 코멘트 추가 + **/ + function procBlogInsertComment() { + // 권한 체크 + if(!$this->grant->write_comment) return new Object(-1, 'msg_not_permitted'); + + // 댓글 입력에 필요한 데이터 추출 + $obj = Context::gets('document_srl','comment_srl','parent_srl','content','password','nick_name','nick_name','member_srl','email_address','homepage'); + $obj->module_srl = $this->module_srl; + + // comment 모듈의 model 객체 생성 + $oCommentModel = &getModel('comment'); + + // comment 모듈의 controller 객체 생성 + $oCommentController = &getController('comment'); + + // 줄바꾸임나 태그제거등의 작업 + $obj->content = nl2br(strip_tags($obj->content)); + + /** + * 존재하는 댓글인지를 확인하여 존재 하지 않는 댓글이라면 신규로 등록하기 위해서 comment_srl의 sequence값을 받는다 + **/ + if(!$obj->comment_srl) { + $obj->comment_srl = getNextSequence(); + } else { + $comment = $oCommentModel->getComment($obj->comment_srl, $this->grant->manager); + } + + // comment_srl이 없을 경우 신규 입력 + if($comment->comment_srl != $obj->comment_srl) { + + // parent_srl이 있으면 답변으로 + if($obj->parent_srl) { + $parent_comment = $oCommentModel->getComment($obj->parent_srl); + if(!$parent_comment->comment_srl) return new Object(-1, 'msg_invalid_request'); + + $output = $oCommentController->insertComment($obj); + + // 없으면 신규 + } else { + $output = $oCommentController->insertComment($obj); + } + + // comment_srl이 있으면 수정으로 + } else { + $obj->parent_srl = $comment->parent_srl; + $output = $oCommentController->updateComment($obj, $this->grant->manager); + $comment_srl = $obj->comment_srl; + } + + if(!$output->toBool()) return $output; + + $this->add('mid', Context::get('mid')); + $this->add('document_srl', $obj->document_srl); + $this->add('comment_srl', $obj->comment_srl); + + $this->setMessage('success_registed'); + } + + /** + * @brief 코멘트 삭제 + **/ + function procBlogDeleteComment() { + // 댓글 번호 확인 + $comment_srl = Context::get('comment_srl'); + if(!$comment_srl) return $this->doError('msg_invalid_request'); + + // comment 모듈의 controller 객체 생성 + $oCommentController = &getController('comment'); + + $output = $oCommentController->deleteComment($comment_srl, $this->grant->manager); + if(!$output->toBool()) return $output; + + $this->add('mid', Context::get('mid')); + $this->add('page', Context::get('page')); + $this->add('document_srl', $output->get('document_srl')); + $this->setMessage('success_deleted'); + } + + /** + * @brief 엮인글 삭제 + **/ + function procBlogDeleteTrackback() { + $trackback_srl = Context::get('trackback_srl'); + + // trackback module의 controller 객체 생성 + $oTrackbackController = &getController('trackback'); + $output = $oTrackbackController->deleteTrackback($trackback_srl, $this->grant->manager); + if(!$output->toBool()) return $output; + + $this->add('mid', Context::get('mid')); + $this->add('page', Context::get('page')); + $this->add('document_srl', $output->get('document_srl')); + $this->setMessage('success_deleted'); + } + + /** + * @brief 문서와 댓글의 비밀번호를 확인 + **/ + function procBlogVerificationPassword() { + // 비밀번호와 문서 번호를 받음 + $password = md5(Context::get('password')); + $document_srl = Context::get('document_srl'); + $comment_srl = Context::get('comment_srl'); + + // comment_srl이 있을 경우 댓글이 대상 + if($comment_srl) { + // 문서번호에 해당하는 글이 있는지 확인 + $oCommentModel = &getModel('comment'); + $data = $oCommentModel->getComment($comment_srl); + // comment_srl이 없으면 문서가 대상 + } else { + // 문서번호에 해당하는 글이 있는지 확인 + $oDocumentModel = &getModel('document'); + $data = $oDocumentModel->getDocument($document_srl); + } + + // 글이 없을 경우 에러 + if(!$data) return new Object(-1, 'msg_invalid_request'); + + // 문서의 비밀번호와 입력한 비밀번호의 비교 + if($data->password != $password) return new Object(-1, 'msg_invalid_password'); + + // 해당 글에 대한 권한 부여 + if($comment_srl) { + $oCommentController = &getController('comment'); + $oCommentController->addGrant($comment_srl); + } else { + $oDocumentController = &getController('document'); + $oDocumentController->addGrant($document_srl); + } + } + + } +?> diff --git a/modules/blog/blog.model.php b/modules/blog/blog.model.php new file mode 100644 index 000000000..e7fe3e561 --- /dev/null +++ b/modules/blog/blog.model.php @@ -0,0 +1,53 @@ +xml_file = sprintf('./files/cache/blog_category/%s.xml.php',$module_srl); + return $category_info; + } + + /** + * @brief 특정 모듈의 전체 카테고리를 구함 + **/ + function getCategoryList($module_srl) { + $args->module_srl = $module_srl; + $args->sort_index = 'listorder'; + $output = executeQuery('blog.getBlogCategories', $args); + if(!$output->toBool()) return; + return $output->data; + } + + /** + * @brief 특정 카테고리의 정보를 return + * 이 정보중에 group_srls의 경우는 , 로 연결되어 들어가며 사용시에는 explode를 통해 array로 변환 시킴 + **/ + function getCategoryInfo($category_srl) { + if(!$category_srl) return; + // category_srl이 있으면 해당 메뉴의 정보를 가져온다 + $args->category_srl= $category_srl; + $output = executeQuery('blog.getCategoryInfo', $args); + $node = $output->data; + if($node->group_srls) $node->group_srls = explode(',',$node->group_srls); + else $node->group_srls = array(); + return $node; + } + + } +?> diff --git a/modules/blog/blog.view.php b/modules/blog/blog.view.php new file mode 100644 index 000000000..2e1724847 --- /dev/null +++ b/modules/blog/blog.view.php @@ -0,0 +1,382 @@ +module_srl) Context::set('module_srl',$this->module_srl); + + // 기본 모듈 정보들 설정 + $this->list_count = $this->module_info->list_count?$this->module_info->list_count:1; + $this->page_count = $this->module_info->page_count?$this->module_info->page_count:10; + + // 카테고리 목록을 가져오고 선택된 카테고리의 값을 설정 + $oDocumentModel = &getModel('document'); + $this->category_list = $oDocumentModel->getCategoryList($this->module_srl); + Context::set('category_list', $this->category_list); + + // 스킨 경로 구함 + $template_path = sprintf("%sskins/%s/",$this->module_path, $this->module_info->skin); + $this->setTemplatePath($template_path); + + // rss url + if($this->module_info->open_rss != 'N') Context::set('rss_url', getUrl('','mid',$this->mid,'act','rss')); + + // 레이아웃의 정보를 속이기 위해서 layout_srl을 현 블로그의 module_srl로 입력 + $this->module_info->layout_srl = $this->module_info->module_srl; + + /** + * 블로그는 자체 레이아웃을 관리하기에 이와 관련된 세팅을 해줌 + **/ + // 레이아웃 경로와 파일 지정 (블로그는 자체 레이아웃을 가지고 있음) + $this->setLayoutPath($template_path); + $this->setLayoutFile("layout"); + + // 수정된 레이아웃 파일이 있으면 지정 + $edited_layout = sprintf('./files/cache/layout/%d.html', $this->module_info->module_srl); + if(file_exists($edited_layout)) $this->setEditedLayoutFile($edited_layout); + + // 카테고리 xml 파일 위치 지정 + $this->module_info->category_xml_file = sprintf('%s/files/cache/blog_category/%d.xml.php', getUrl(), $this->module_info->module_srl); + + // 메뉴 등록시 메뉴 정보를 구해옴 + if($this->module_info->menu) { + foreach($this->module_info->menu as $menu_id => $menu_srl) { + $menu_php_file = sprintf("./files/cache/menu/%s.php", $menu_srl); + if(file_exists($menu_php_file)) @include($menu_php_file); + Context::set($menu_id, $menu); + } + } + + // layout_info 변수 설정 + Context::set('layout_info',$this->module_info); + + // 모듈정보 세팅 + Context::set('module_info',$this->module_info); + } + + /** + * @brief 목록 및 선택된 글 출력 + **/ + function dispBlogContent() { + // 권한 체크 + if(!$this->grant->list) return $this->dispBlogMessage('msg_not_permitted'); + + // 목록 구현에 필요한 변수들을 가져온다 + $document_srl = Context::get('document_srl'); + $page = Context::get('page'); + + // document 객체를 생성. 기본 데이터 구조의 경우 document모듈만 쓰면 만사 해결.. -_-; + $oDocumentModel = &getModel('document'); + + $oDocument = $oDocumentModel->getDocument(0, $this->grant->manager); + + // document_srl이 있다면 해당 글을 구해오자 + if($this->grant->list && $document_srl) { + + // 글을 구함 + $oDocument->setDocument($document_srl); + + // 찾아지지 않았다면 초기화 + if(!$oDocument->isExists()) { + unset($document_srl); + Context::set('document_srl','',true); + } else { + // 브라우저 타이틀 설정 + Context::setBrowserTitle($oDocument->getTitleText()); + + // 댓글에디터 설정 + //if($this->grant->write_comment && $oDocument->allowComment() && !$oDocument->isLocked()) $this->setCommentEditor(0, 100); + + // 조회수 증가 + $oDocument->updateReadedCount(); + } + + } + Context::set('oDocument', $oDocument); + + // 댓글 + //$this->setCommentEditor(0, 100); + + // 만약 document_srl은 있는데 page가 없다면 글만 호출된 경우 page를 구해서 세팅해주자.. + if($document_srl && !$page) { + $page = $oDocumentModel->getDocumentPage($document_srl, $this->module_srl, $this->list_count); + Context::set('page', $page); + } + + // 목록을 구하기 위한 옵션 + $args->module_srl = $this->module_srl; ///< 현재 모듈의 module_srl + $args->page = $page; ///< 페이지 + $args->list_count = $this->list_count; ///< 한페이지에 보여줄 글 수 + $args->page_count = $this->page_count; ///< 페이지 네비게이션에 나타날 페이지의 수 + + // 검색 옵션 + $args->search_target = trim(Context::get('search_target')); ///< 검색대상 + $args->search_keyword = trim(Context::get('search_keyword')); ///< 검색어 + + // 키워드 검색이 아닌 검색일 경우 목록의 수를 40개로 고정 + if($args->search_target && $args->search_keyword) $args->list_count = 40; + + // 키워드 검색의 경우 제목,내용으로 검색 대상 고정 + if($args->search_keyword && !$args->search_target) $args->search_target = "title_content"; + + // 블로그 카테고리 + $args->category_srl = (int)Context::get('category'); + + $args->sort_index = 'list_order'; ///< 소팅 값 + + // 목록 구함, document->getDocumentList 에서 걍 알아서 다 해버리는 구조 + $output = $oDocumentModel->getDocumentList($args, true); + + // 템플릿에 쓰기 위해서 document_model::getDocumentList() 의 return object에 있는 값들을 세팅 + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('document_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + // 템플릿에서 사용할 검색옵션 세팅 + $count_search_option = count($this->search_option); + for($i=0;$i<$count_search_option;$i++) { + $search_option[$this->search_option[$i]] = Context::getLang($this->search_option[$i]); + } + Context::set('search_option', $search_option); + + // 블로그의 코멘트는 ajax로 호출되기에 미리 css, js파일을 import + Context::addJsFile('./modules/editor/tpl/js/editor.js'); + Context::addCSSFile('./modules/editor/tpl/css/editor.css'); + + $this->setTemplateFile('list'); + } + + /** + * @brief 글 작성 화면 출력 + **/ + function dispBlogWrite() { + // 권한 체크 + if(!$this->grant->write_document) return $this->dispBlogMessage('msg_not_permitted'); + + // GET parameter에서 document_srl을 가져옴 + $document_srl = Context::get('document_srl'); + + // document 모듈 객체 생성 + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl, $this->grant->manager); + + // 지정된 글이 없다면 (신규) 새로운 번호를 만든다 + if(!$oDocument->isExists()) { + unset($document_srl); + Context::set('document_srl',''); + } + + if(!$document_srl) $document_srl = getNextSequence(); + + // 글을 수정하려고 할 경우 권한이 없는 경우 비밀번호 입력화면으로 + if($oDocument->isExists()&&!$oDocument->isGranted()) return $this->setTemplateFile('input_password_form'); + + Context::set('document_srl',$document_srl); + Context::set('oDocument', $oDocument); + + // 에디터 모듈의 getEditor를 호출하여 세팅 + $oEditorModel = &getModel('editor'); + $option->allow_fileupload = $this->grant->fileupload; + $option->enable_autosave = true; + $option->enable_default_component = true; + $option->enable_component = true; + $option->resizable = true; + $option->height = 600; + $editor = $oEditorModel->getEditor($document_srl, $option); + Context::set('editor', $editor); + + $this->setTemplateFile('write_form'); + } + + /** + * @brief 문서 삭제 화면 출력 + **/ + function dispBlogDelete() { + // 권한 체크 + if(!$this->grant->write_document) return $this->dispBlogMessage('msg_not_permitted'); + + // 삭제할 문서번호를 가져온다 + $document_srl = Context::get('document_srl'); + + // 지정된 글이 있는지 확인 + if($document_srl) { + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + } + + // 삭제하려는 글이 없으면 에러 + if(!$oDocument->isExists()) return $this->dispBlogContent(); + + // 권한이 없는 경우 비밀번호 입력화면으로 + if(!$oDocument->isGranted()) return $this->setTemplateFile('input_password_form'); + + Context::set('oDocument',$oDocument); + + $this->setTemplateFile('delete_form'); + } + + /** + * @brief 댓글의 답글 화면 출력 + **/ + function dispBlogReplyComment() { + // 권한 체크 + if(!$this->grant->write_comment) return $this->dispBlogMessage('msg_not_permitted'); + + // 목록 구현에 필요한 변수들을 가져온다 + $document_srl = Context::get('document_srl'); + $parent_srl = Context::get('comment_srl'); + + // 지정된 원 댓글이 없다면 오류 + if(!$parent_srl) return new Object(-1, 'msg_invalid_request'); + + // 해당 댓글를 찾아본다 + $oCommentModel = &getModel('comment'); + $source_comment = $oCommentModel->getComment($parent_srl, $this->grant->manager); + + // 댓글이 없다면 오류 + if(!$source_comment) return $this->dispBlogMessage('msg_invalid_request'); + + // 필요한 정보들 세팅 + Context::set('document_srl',$source_comment->document_srl); + Context::set('parent_srl',$parent_srl); + Context::set('comment_srl',NULL); + Context::set('source_comment',$source_comment); + + // 댓글 에디터 세팅 + //$this->setCommentEditor(0,400); + + $this->setTemplateFile('comment_form'); + } + + /** + * @brief 댓글 수정 폼 출력 + **/ + function dispBlogModifyComment() { + // 권한 체크 + if(!$this->grant->write_comment) return $this->dispBlogMessage('msg_not_permitted'); + + // 목록 구현에 필요한 변수들을 가져온다 + $document_srl = Context::get('document_srl'); + $comment_srl = Context::get('comment_srl'); + + // 지정된 댓글이 없다면 오류 + if(!$comment_srl) return new Object(-1, 'msg_invalid_request'); + + // 해당 댓글를 찾아본다 + $oCommentModel = &getModel('comment'); + $comment = $oCommentModel->getComment($comment_srl, $this->grant->manager); + + // 댓글이 없다면 오류 + if(!$comment) return $this->dispBlogMessage('msg_invalid_request'); + + Context::set('document_srl',$comment->document_srl); + + // 글을 수정하려고 할 경우 권한이 없는 경우 비밀번호 입력화면으로 + if($comment_srl&&$comment&&!$comment->is_granted) return $this->setTemplateFile('input_password_form'); + + // 필요한 정보들 세팅 + Context::set('comment_srl',$comment_srl); + Context::set('comment', $comment); + + // 댓글 에디터 세팅 + //$this->setCommentEditor($comment_srl,400); + + $this->setTemplateFile('comment_form'); + } + + /** + * @brief 댓글 삭제 화면 출력 + **/ + function dispBlogDeleteComment() { + // 권한 체크 + if(!$this->grant->write_comment) return $this->dispBlogMessage('msg_not_permitted'); + + // 삭제할 댓글번호를 가져온다 + $comment_srl = Context::get('comment_srl'); + + // 삭제하려는 댓글가 있는지 확인 + if($comment_srl) { + $oCommentModel = &getModel('comment'); + $comment = $oCommentModel->getComment($comment_srl, $this->grant->manager); + } + + // 삭제하려는 글이 없으면 에러 + if(!$comment) return $this->dispBlogContent(); + + Context::set('document_srl',$comment->document_srl); + + // 권한이 없는 경우 비밀번호 입력화면으로 + if($comment_srl&&$comment&&!$comment->is_granted) return $this->setTemplateFile('input_password_form'); + + Context::set('comment',$comment); + + $this->setTemplateFile('delete_comment_form'); + } + + /** + * @brief 엮인글 삭제 화면 출력 + **/ + function dispBlogDeleteTrackback() { + // 삭제할 댓글번호를 가져온다 + $trackback_srl = Context::get('trackback_srl'); + + // 삭제하려는 댓글가 있는지 확인 + $oTrackbackModel = &getModel('trackback'); + $output = $oTrackbackModel->getTrackback($trackback_srl); + $trackback = $output->data; + + // 삭제하려는 글이 없으면 에러 + if(!$trackback) return $this->dispBlogContent(); + + Context::set('trackback',$trackback); + + $this->setTemplateFile('delete_trackback_form'); + } + + /** + * @brief 메세지 출력 + **/ + function dispBlogMessage($msg_code) { + $msg = Context::getLang($msg_code); + if(!$msg) $msg = $msg_code; + Context::set('message', $msg); + $this->setTemplateFile('message'); + } + + /** + * @brief 댓글의 editor 를 세팅 + * 댓글의 경우 수정하는 경우가 아니라면 고유값이 없음.\n + * 따라서 고유값이 없을 경우 고유값을 가져와서 지정해 주어야 함 + **/ + function setCommentEditor($comment_srl=0, $height = 100) { + return; + if(!$comment_srl) { + $comment_srl = getNextSequence(); + Context::set('comment_srl', $comment_srl); + } + $oEditorModel = &getModel('editor'); + $option->allow_fileupload = $this->grant->comment_fileupload; + $option->enable_autosave = false; + $option->enable_default_component = true; + $option->enable_component = true; + $option->resizable = true; + $option->height = $height; + $comment_editor = $oEditorModel->getEditor($comment_srl, $option); + Context::set('comment_editor', $comment_editor); + } + + } +?> diff --git a/modules/blog/conf/info.xml b/modules/blog/conf/info.xml new file mode 100644 index 000000000..adf14e3f2 --- /dev/null +++ b/modules/blog/conf/info.xml @@ -0,0 +1,39 @@ + + + 블로그 + ブログ + Blog + Blog + 博客 + + 제로 + Zero + zero + zero + zero + + 블로그의 기능을 담당하는 모듈. + 게시판과 비슷하지만 보여지는 view가 다르고 블로그에 적합한 method가 추가되었음. + 레이아웃과 기본 메뉴를 직접 담당 + + + ブログの機能を担当するモジュール + 掲示板と似ているが、内容の表示が異なり、ブログに適切なメソッドが追加されている。 + レイアウトと基本メニューを直接担当します。 + + + This module contains the blog functions. + It's similar to the bbs module, but it has diffent views and more suitable methods for blog has been included. + This module manages layout and basic menu itself. + + + Es el módulo para funcióne a blog. + Casi mismo del boletín, pero la vista es diferente, y incluye metodo para blog. Maneja directo al diseño y menú principal. + + + 是负责博客功能的模块。 + 虽然类似版面,但其显示模式不同,且还添加了适合博客的method。 + 内置布局和基本的菜单。 + + + diff --git a/modules/blog/conf/module.xml b/modules/blog/conf/module.xml new file mode 100644 index 000000000..df54036a3 --- /dev/null +++ b/modules/blog/conf/module.xml @@ -0,0 +1,74 @@ + + + + + 목록 + list + リスト + + + 글 작성 + write document + 書き込む + + + 댓글 작성 + write comment + コメント作成 + + + 파일 첨부 + file upload + 添付ファイル + + + 댓글 파일 첨부 + comment file upload + コメントファイル添付 + + + 관리 + manager + 管理 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/blog/lang/en.lang.php b/modules/blog/lang/en.lang.php new file mode 100644 index 000000000..bf23e2481 --- /dev/null +++ b/modules/blog/lang/en.lang.php @@ -0,0 +1,33 @@ +cmd_blog_list = 'Blog list'; + $lang->cmd_module_config = 'Common blog setting'; + $lang->cmd_view_info = 'Blog info'; + $lang->cmd_manage_menu = 'Menu management'; + $lang->cmd_make_child = 'Add child category'; + $lang->cmd_enable_move_category = "Change category position (Drag the top menu after selection)"; + $lang->cmd_remake_cache = 'Rebuild cache file'; + $lang->cmd_layout_setup = 'Configure layout'; + $lang->cmd_layout_edit = 'Edit layout'; + + // Item + $lang->parent_category_name = 'Parent category'; + $lang->category_name = 'Category'; + $lang->expand = 'Expand'; + $lang->category_group_srls = 'Accessable Group'; + $lang->search_result = 'Search result'; + + // blah blah.. + $lang->about_category_name = 'Please input category name'; + $lang->about_expand = 'By selecting this option, it will be always expanded'; + $lang->about_category_group_srls = 'Only the selected group will be able to see current categories. (Manually open xml file to expose)'; + $lang->about_layout_setup = 'You can manually modify blog layout code. Insert or manage the widget code anywhere you want'; + $lang->about_blog_category = 'You can make blog categories.
When blog category is broken, try rebuilding the cache file manually.'; + $lang->about_blog = "This is a blog module that can create and manage blog.\nAfter creating a blog, please decorate your blog by category and skin management because this blog module uses layout that is included in the blog skin.\nIf you want to connect other boards inside the blog, use the menu module to create a menu and then connect it with the skin manager"; +?> diff --git a/modules/blog/lang/es.lang.php b/modules/blog/lang/es.lang.php new file mode 100644 index 000000000..4228c2d8f --- /dev/null +++ b/modules/blog/lang/es.lang.php @@ -0,0 +1,33 @@ +cmd_blog_list = 'lista de blogs'; + $lang->cmd_module_config = 'configuración común de blogs '; + $lang->cmd_view_info = 'Información de blog'; + $lang->cmd_manage_menu = 'manejar menú'; + $lang->cmd_make_child = 'agregar sub categoria'; + $lang->cmd_enable_move_category = "mover posición de categoria. (arrastrar y soltar la selección)"; + $lang->cmd_remake_cache = 'rehacer caché'; + $lang->cmd_layout_setup = 'configuración del diseño'; + $lang->cmd_layout_edit = 'editar el diseño'; + + // Artículo + $lang->parent_category_name = 'Nombre de la categoria preferencia'; + $lang->category_name = 'Nombre de la categoria'; + $lang->expand = 'Abrir'; + $lang->category_group_srls = 'Limitar grupos'; + $lang->search_result = 'Resulto de la busqueda'; + + // bla bla... + $lang->about_category_name = 'Por favor escribe nombre de la categoria.'; + $lang->about_expand = 'Si seleccióna, sera abierto siempre.'; + $lang->about_category_group_srls = 'Solo muestra categoria a grupo selecciónado. (pero muestra todo en XML)'; + $lang->about_layout_setup = 'Puede modificar directamente los codigo de diseño del blog. Inserta o modifica codigo de widget.'; + $lang->about_blog_category = 'Puede crear las categorias.
A veces no funcióna blog, rehacer caché manualmente puede ser solución.'; + $lang->about_blog = "Es el módulo para crear y manejar blog.\nEl módulo de blog usa la diseña que incluydo en la carátula de blog. Es necesarario decorar su blog manejar las categorias y carátulas.\nSi desea conectar otro boletín en su blog, crea otro menú y connecta en manejar las carátulas."; +?> diff --git a/modules/blog/lang/jp.lang.php b/modules/blog/lang/jp.lang.php new file mode 100644 index 000000000..42e042712 --- /dev/null +++ b/modules/blog/lang/jp.lang.php @@ -0,0 +1,33 @@ +cmd_blog_list = 'ブログリスト'; + $lang->cmd_module_config = 'ブログ共通設定'; + $lang->cmd_view_info = 'ブログ情報'; + $lang->cmd_manage_menu = 'メニュー管理'; + $lang->cmd_make_child = '下位カテゴリ追加'; + $lang->cmd_enable_move_category = "カテゴリ位置変更(選択後上のメニューをドラッグして下さい)"; + $lang->cmd_remake_cache = 'キャッシュファイル再生性'; + $lang->cmd_layout_setup = 'レイアウト設定'; + $lang->cmd_layout_edit = 'レイアウト編集'; + + // 項目 + $lang->parent_category_name = '上位カテゴリ名'; + $lang->category_name = 'カテゴリ名'; + $lang->expand = '拡張表示'; + $lang->category_group_srls = 'グループ制限'; + $lang->search_result = '検索結果'; + + // その他 + $lang->about_category_name = 'カテゴリ名を入力して下さい'; + $lang->about_expand = 'チェックすると常に開いた状態にします'; + $lang->about_category_group_srls = '選択したグループのみ現在のカテゴリが見えるようになります(XMLファイルを直接閲覧すると表示されます)'; + $lang->about_layout_setup = 'ブログのレイアウトのコードを直接修正できます。ウィジェットコードを入力、又は管理して下さい'; + $lang->about_blog_category = 'ブログのカテゴリが作成できます。
ブログのカテゴリが誤作動する場合キャッシュファイルの再生性を手動で行うと解決される事があります。'; + $lang->about_blog = "ブログを作成し管理できるブログモジュールです。ブログモジュールはブログスキンに含まれているレイアウトを利用するので生成後必ずカテゴリ、又はスキン管理を用いてブログを編集して下さい。ブログ内に他の掲示板を連結したい時はメニュモジュールでメニューを作成した後、スキン管理で連結して下さい。"; +?> diff --git a/modules/blog/lang/ko.lang.php b/modules/blog/lang/ko.lang.php new file mode 100644 index 000000000..bc6684f9c --- /dev/null +++ b/modules/blog/lang/ko.lang.php @@ -0,0 +1,33 @@ +cmd_blog_list = '블로그 목록'; + $lang->cmd_module_config = '블로그 공통 설정'; + $lang->cmd_view_info = '블로그 정보'; + $lang->cmd_manage_menu = '메뉴관리'; + $lang->cmd_make_child = '하위 카테고리 추가'; + $lang->cmd_enable_move_category = "카테고리 위치 변경 (선택후 위 메뉴를 드래그하세요)"; + $lang->cmd_remake_cache = '캐시파일 재생성'; + $lang->cmd_layout_setup = '레이아웃 설정'; + $lang->cmd_layout_edit = '레이아웃 편집'; + + // 항목 + $lang->parent_category_name = '상위 카테고리명'; + $lang->category_name = '분류명'; + $lang->expand = '펼침'; + $lang->category_group_srls = '그룹제한'; + $lang->search_result = '검색결과'; + + // 주절 주절.. + $lang->about_category_name = '카테고리 이름을 입력해주세요'; + $lang->about_expand = '선택하시면 늘 펼쳐진 상태로 있게 합니다'; + $lang->about_category_group_srls = '선택하신 그룹만 현재 카테고리가 보이게 됩니다. (xml파일을 직접 열람하면 노출이 됩니다)'; + $lang->about_layout_setup = '블로그의 레이아웃 코드를 직접 수정할 수 있습니다. 위젯 코드를 원하는 곳에 삽입하시거나 관리하세요'; + $lang->about_blog_category = '블로그 분류를 만드실 수 있습니다.
블로그 분류가 오동작을 할 경우 캐시파일 재생성을 수동으로 해주시면 해결이 될 수 있습니다.'; + $lang->about_blog = "블로그를 만드시고 관리할 수 있는 블로그 모듈입니다.\n블로그 모듈은 블로그 스킨에 포함된 레이아웃을 이용하니 생성후 꼭 분류 및 스킨 관리를 통해서 블로그를 꾸미시기 바랍니다.\n블로그내에 다른 게시판을 연결하시고 싶을때에는 메뉴모듈로 메뉴를 만들고 나서 스킨관리에 연결해 주시면 됩니다"; +?> diff --git a/modules/blog/lang/zh-CN.lang.php b/modules/blog/lang/zh-CN.lang.php new file mode 100644 index 000000000..41f649361 --- /dev/null +++ b/modules/blog/lang/zh-CN.lang.php @@ -0,0 +1,33 @@ +cmd_blog_list = '博客目录'; + $lang->cmd_module_config = '博客共同设定'; + $lang->cmd_view_info = '博客信息'; + $lang->cmd_manage_menu = '菜单管理'; + $lang->cmd_make_child = '添加下级分类'; + $lang->cmd_enable_move_category = "更改分类顺序 (选择后拖动菜单)"; + $lang->cmd_remake_cache = '重新生成缓冲文件'; + $lang->cmd_layout_setup = '布局设置'; + $lang->cmd_layout_edit = '编辑布局'; + + // 项目 + $lang->parent_category_name = '上级分类名'; + $lang->category_name = '分类名'; + $lang->expand = '展开'; + $lang->category_group_srls = '用户组'; + $lang->search_result = '搜索结果'; + + // 信息、提示.. + $lang->about_category_name = '请输入分类名。'; + $lang->about_expand = '选择此项将维持展开状态。'; + $lang->about_category_group_srls = '被选的用户组才可以查看此分类。'; + $lang->about_layout_setup = '可直接编辑博客布局代码。可以把控件代码插入到您喜欢的位置。'; + $lang->about_blog_category = '可以添加/删除博客分类
博客分类有异常情况时,可以尝试重新生成缓冲文件。'; + $lang->about_blog = "可生成,管理博客的模块。\n博客模块将利用博客皮肤里包含的布局,因此生成博客后尽早布置为适。\n在博客内,想使用其他版面时,可以先在菜单模块当中生成菜单后,在博客皮肤管理中连接即可。"; +?> diff --git a/modules/blog/queries/deleteCategories.xml b/modules/blog/queries/deleteCategories.xml new file mode 100644 index 000000000..0b5ffd063 --- /dev/null +++ b/modules/blog/queries/deleteCategories.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/blog/queries/deleteCategory.xml b/modules/blog/queries/deleteCategory.xml new file mode 100644 index 000000000..79b75d5c2 --- /dev/null +++ b/modules/blog/queries/deleteCategory.xml @@ -0,0 +1,8 @@ + + +
+ + + + + diff --git a/modules/blog/queries/getAllBlog.xml b/modules/blog/queries/getAllBlog.xml new file mode 100644 index 000000000..b56e6f6b3 --- /dev/null +++ b/modules/blog/queries/getAllBlog.xml @@ -0,0 +1,14 @@ + + +
+ + + + + + + + + + + diff --git a/modules/blog/queries/getBlogCategories.xml b/modules/blog/queries/getBlogCategories.xml new file mode 100644 index 000000000..d732b5ca9 --- /dev/null +++ b/modules/blog/queries/getBlogCategories.xml @@ -0,0 +1,14 @@ + + +
+ + + + + + + + + + + diff --git a/modules/blog/queries/getBlogList.xml b/modules/blog/queries/getBlogList.xml new file mode 100644 index 000000000..d6dd2e60e --- /dev/null +++ b/modules/blog/queries/getBlogList.xml @@ -0,0 +1,24 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + diff --git a/modules/blog/queries/getCategory.xml b/modules/blog/queries/getCategory.xml new file mode 100644 index 000000000..ac2827142 --- /dev/null +++ b/modules/blog/queries/getCategory.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/blog/queries/getCategoryInfo.xml b/modules/blog/queries/getCategoryInfo.xml new file mode 100644 index 000000000..3ebe79059 --- /dev/null +++ b/modules/blog/queries/getCategoryInfo.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/blog/queries/getChildCategoryCount.xml b/modules/blog/queries/getChildCategoryCount.xml new file mode 100644 index 000000000..b82d7c15a --- /dev/null +++ b/modules/blog/queries/getChildCategoryCount.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/blog/queries/insertCategory.xml b/modules/blog/queries/insertCategory.xml new file mode 100644 index 000000000..9205cdad8 --- /dev/null +++ b/modules/blog/queries/insertCategory.xml @@ -0,0 +1,15 @@ + + +
+ + + + + + + + + + + + diff --git a/modules/blog/queries/updateCategory.xml b/modules/blog/queries/updateCategory.xml new file mode 100644 index 000000000..f8ea145f2 --- /dev/null +++ b/modules/blog/queries/updateCategory.xml @@ -0,0 +1,13 @@ + + +
+ + + + + + + + + + diff --git a/modules/blog/queries/updateCategoryParent.xml b/modules/blog/queries/updateCategoryParent.xml new file mode 100644 index 000000000..3c34004ad --- /dev/null +++ b/modules/blog/queries/updateCategoryParent.xml @@ -0,0 +1,12 @@ + + +
+ + + + + + + + + diff --git a/modules/blog/schemas/blog_category.xml b/modules/blog/schemas/blog_category.xml new file mode 100644 index 000000000..ca3165dc4 --- /dev/null +++ b/modules/blog/schemas/blog_category.xml @@ -0,0 +1,10 @@ +
+ + + + + + + + +
diff --git a/modules/blog/skins/cozy_simple/comment.html b/modules/blog/skins/cozy_simple/comment.html new file mode 100644 index 000000000..dad209923 --- /dev/null +++ b/modules/blog/skins/cozy_simple/comment.html @@ -0,0 +1,62 @@ +
+ {@ $idx = 0 } + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + +
{$val->content} + + {$lang->cmd_delete} + {$lang->cmd_modify} + + {$lang->cmd_reply} +
+ +
+
{htmlspecialchars($val->nick_name)}
+ + {zdate($val->regdate, "Y.m.d H:i")} + + ({$val->ipaddress}) + + +
+ + +
+
+ +
+ + {@ $idx++} + + +
diff --git a/modules/blog/skins/cozy_simple/comment_form.html b/modules/blog/skins/cozy_simple/comment_form.html new file mode 100644 index 000000000..ed27feb78 --- /dev/null +++ b/modules/blog/skins/cozy_simple/comment_form.html @@ -0,0 +1,68 @@ + + + + + + + + + +
+
+
+
+ {$source_comment->content} +
+ +
{htmlspecialchars($source_comment->nick_name)}
+ + {zdate($source_comment->regdate, "Y.m.d H:i")} + + ({$source_comment->ipaddress}) + + +
+
+
+ + + +
+ +
fileupload)-->enctype="multipart/form-data" class="blogEditor" id="fo_comment_write" > +
+ + + + + + +
+ + + + + + + + + + + +
+ + +
+ +
+
+ + +
+ +
+
+ + + + diff --git a/modules/blog/skins/cozy_simple/css/blog_tree_menu.css b/modules/blog/skins/cozy_simple/css/blog_tree_menu.css new file mode 100644 index 000000000..95137d8c7 --- /dev/null +++ b/modules/blog/skins/cozy_simple/css/blog_tree_menu.css @@ -0,0 +1,88 @@ + +#blog_category .title_box { position:relative; padding:7px 0 0 12px; height:21px; _height:20px; background:#f5f5f5; font-size:1em; color:#ef2121; font-family:Tahoma;} +*:first-child+html #blog_category .title_box { height:20px; color:#ef2121;} + +#blog_category .category_list { padding:.8em 0 .8em 0; } + +#blog_category .node_item a { color:#6b6b6b; } + +#blog_category .unselected { cursor:pointer; font-size:1em; color:#54564b; } + +#blog_category .document_count { + margin-left:5px; + color:#AAAAAA; + font-size:.8em; +} + +#blog_category .page { + cursor:pointer; + background:url(../images/common/iconList.gif) no-repeat left; +} + +#blog_category .folder_open { + cursor:pointer; + background:url(../images/common/iconFolderClose.gif) no-repeat left; +} + +#blog_category .folder_close { + cursor:pointer; + background:url(../images/common/iconFolderClose.gif) no-repeat left; +} + +#blog_category .item_open { + display:block; + padding-left:18px; +} + +#blog_category .item_close { + display:none; + padding-left:18px; +} + +#blog_category .line_null { + padding-left:13px; +} + +#blog_category .line_open { + display:block; + padding-left:18px; + /*background:url(../images/tree_menu/line.gif) repeat-y left;*/ +} + +#blog_category .line_close { + display:none; + padding-left:18px; + /*background:url(../images/tree_menu/line.gif) repeat-y left;*/ +} + +#blog_category .plus { + padding-left:18px; + /*background:url(../images/tree_menu/plus.gif) repeat-y left;*/ +} + +#blog_category .plus_bottom { + padding-left:18px; + /*background:url(../images/tree_menu/plusbottom.gif) no-repeat left;*/ +} + +#blog_category .minus { + padding-left:18px; + /*background:url(../images/tree_menu/minus.gif) repeat-y left;*/ +} + +#blog_category .minus_bottom { + padding-left:18px; + /*background:url(../images/tree_menu/minusbottom.gif) no-repeat left;*/ +} + +#blog_category .join { + padding-left:18px; + margin:0; + /*background:url(../images/tree_menu/join.gif) repeat-y left;*/ +} + +#blog_category .join_bottom { + padding-left:18px; + /*background:url(../images/tree_menu/joinbottom.gif) no-repeat left;*/ +} + diff --git a/modules/blog/skins/cozy_simple/css/blue.css b/modules/blog/skins/cozy_simple/css/blue.css new file mode 100644 index 000000000..14c8ecef6 --- /dev/null +++ b/modules/blog/skins/cozy_simple/css/blue.css @@ -0,0 +1,25 @@ +@charset "utf-8"; + +/* Blog Layout - Header */ +#header { margin:0 9px .8em 9px; clear:both; margin-top:.6em; background:#1187d8 url(../images/blue/bg_header.gif) no-repeat 2.5em top; border:1px solid #FFFFFF; overflow:hidden;} +#blog_category .selected { font-weight:bold; cursor:default; font-size:1em; color:#1187d8; } +#header #globalNavigation li.on a { color:#1187d8;} +#header #tagLine { padding:0 0 0 30px; color:#bfdff4;} + +/* blogHeader */ +.blogHeader { position:relative; _width:100%; background:#1187d8 url(../images/blue/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.blogList { width:100%; position:relative; border-bottom:2px solid #1187d8; border-collapse:collapse; } + +.blogList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/blue/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.blogList td .replyAndTrackback { font:.8em Tahoma; color:#007ed5; cursor:default; position:relative; top:-.2em;} +.blogList td.recommend { font:bold .8em Tahoma; color:#007ed5; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#007ed5; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.blogRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #1187d8;} +.blogRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #1187d8; overflow:hidden;} +.blogRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#007ed5;} + +.blogWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;} +.blogWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/blue/bg_title_norepeat.gif) no-repeat left bottom;} +.blogWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/blue/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} diff --git a/modules/blog/skins/cozy_simple/css/bluish_green.css b/modules/blog/skins/cozy_simple/css/bluish_green.css new file mode 100644 index 000000000..929242bf0 --- /dev/null +++ b/modules/blog/skins/cozy_simple/css/bluish_green.css @@ -0,0 +1,25 @@ +@charset "utf-8"; + +/* Blog Layout - Header */ +#header { margin:0 9px .8em 9px; clear:both; margin-top:.6em; background:#9ab09f url(../images/bluish_green/bg_header.gif) no-repeat 2.5em top; border:1px solid #FFFFFF; overflow:hidden;} +#blog_category .selected { font-weight:bold; cursor:default; font-size:1em; color:#9ab09f; } +#header #globalNavigation li.on a { color:#9ab09f;} +#header #tagLine { padding:0 0 0 30px; color:#e6ebe7;} + +/* blogHeader */ +.blogHeader { position:relative; _width:100%; background:#9ab09f url(../images/bluish_green/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.blogList { width:100%; position:relative; border-bottom:2px solid #9ab09f; border-collapse:collapse; } + +.blogList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/bluish_green/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.blogList td .replyAndTrackback { font:.8em Tahoma; color:#9ab09f; cursor:default; position:relative; top:-.2em;} +.blogList td.recommend { font:bold .8em Tahoma; color:#9ab09f; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#9ab09f; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.blogRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #9ab09f;} +.blogRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #9ab09f; overflow:hidden;} +.blogRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#9ab09f;} + +.blogWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;} +.blogWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/bluish_green/bg_title_norepeat.gif) no-repeat left bottom;} +.blogWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/bluish_green/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} diff --git a/modules/blog/skins/cozy_simple/css/common.css b/modules/blog/skins/cozy_simple/css/common.css new file mode 100644 index 000000000..6da8a6902 --- /dev/null +++ b/modules/blog/skins/cozy_simple/css/common.css @@ -0,0 +1,441 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +/* ----- List+Read+Write+Modify | Start ----- */ +.blogHeader h3 { float:left; clear:both; padding:1.9em 1.5em 1.8em 1.5em; font-size:1.2em; color:#FFFFFF;} + +/* blogInformation */ +.blogInformation { width:100%; clear:both; margin:0 0 .5em 0; background:#EFEFEF; color:#8D8D8D; overflow:hidden;} +.articleNum { float:left; padding:.5em 0 .5em 2.3em; font:.8em Tahoma;} +.articleNum strong { margin:0 0 0 .5em; padding:0 0 0 .7em; font:bold .9em Tahoma; color:#6F6F6F; background:url(../images/common/bar_1x8_c0c0c0.gif) no-repeat left .1em;} +.accountNavigation { float:right; margin:.3em .5em 0 0; overflow:hidden;} +.accountNavigation li { list-style:none; float:left; margin:0 0 0 -.1em; padding:.1em .8em 0 .8em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left .3em;} +.accountNavigation li a {} + +/* blogList */ +.blogList tr:first-child td, .blogList tr.first-child td {} +.blogList tr.notice {} +.blogList tr.notice .num { font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; font-weight:bold;} + +.blogList th a { color:#3e3f3e;} +.blogList th span.on { font-weight:bold;} +.blogList th.num { background-position:-3px bottom; padding:0;} +.blogList th select { height:20px; } +.blogList th.category { padding:0 .2em 0 .5em;} +.blogList th.category.thumbStyle { background-position:-3px bottom !important; border-left:1px solid #ffffff; text-align:left;} +.blogList th:first-child { background-position:-2px bottom;} +.blogList th.first-child { background-position:-2px bottom;} +.blogList th.author {} +.blogList th.title {} +.blogList th.reading { white-space:nowrap;} +.blogList th.recommend { white-space:nowrap;} +.blogList th.reply { white-space:nowrap;} +.blogList th.date {} +.blogList th.check { padding:0;} +.blogList th.user {} +.blogList th.registDate {} +.blogList th.checkDate {} +.blogList th.friendGroup {} +.blogList th.userId {} +.blogList th.userName {} +.blogList th.userNick {} +.blogList th.sendMessage {} +.blogList th.last-child { border-right:1px solid #ffffff;} +.blogList th .sort { padding:0 .2em; vertical-align:middle;} +.blogList th select, +.blogList th input { vertical-align:middle;} + +.blogList td { padding:.3em; border-bottom:1px solid #e4e4e2;} +.blogList td.noline { border-bottom:none;} +.blogList td.num { font:.8em Tahoma; color:#999999; padding:.5em .5em .5em 1.5em;} +.blogList td.category {} +.blogList tr.notice td { padding:.3em; white-space:nowrap;} +.blogList tr.notice td img { margin:-.1em .3em 0 0;} +.blogList td.thumb { padding:.5em 0 .5em .5em; width:145px; table-layout:fixed; white-space:nowrap;} +.blogList td.thumb * { vertical-align:middle;} +.blogList td.title.bold { font-size:1em; font-weight:bold;} +.blogList td.title.bold a { position:relative; top:.3em;} +.blogList td.title * { vertical-align:middle;} +.blogList td.title, +.blogList td.title a { color:#444444; text-decoration:none; } +.blogList td.title a:visited { color:#777777;} +.blogList td.title .title_wrap { width:100%; overflow:hidden; white-space:nowrap;} +.blogList td.author { padding:0 .5em 0 1.3em; color:#333333; font:.95em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;} +.blogList td.author a { font-size:1em; color:#333333;} +.blogList td.reading { font:.8em Tahoma; color:#999999; text-align:center;} +.blogList td.reply { font:bold .8em Tahoma; color:#ff6600; text-align:center;} +.blogList td.date { font:.8em Tahoma; color:#999999; text-align:center;} +.blogList td.registDate { font:.8em Tahoma; color:#999999; text-align:center;} +.blogList td.checkDate { font:.8em Tahoma; color:#333333; text-align:center;} +.blogList td.summary { border-top:none; vertical-align:top; color:#666666; line-height:1.25em;} +.blogList td.summary a { color:#666666; text-decoration:none; line-height:inherit;} +.blogList td.summary a:visited { color:#999999;} +.blogList td.check { text-align:center;} +.blogList td.user { color:#333333; font-size:.9em;} +.blogList td.user a { color:#333333;} +.blogList td.userId { font:.9em Tahoma;} +.blogList td.userName {} +.blogList td.userNick { font-size:.9em; color:#999999;} +.blogList td.friendGroup {} +.blogList td.sendMessage { text-align:center; padding:0;} +.blogList td.sendMessage .buttonFixedLeft { position:relative; left:20%; _left:0;} +*:first-child+html .blogList td.sendMessage .buttonFixedLeft { left:0;} +.blogList td input { _margin:-3px;} +.blogList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#ff6600; cursor:default; position:relative; top:.3em;} +.blogList td .replyAndTrackback strong { font:bold 1em Tahoma;} + +.blogList td .thumbnailSmall { margin:0 .3em 0 .3em;} +.blogList td .thumbnailSmall img {} +.blogList td .thumbnailMedium { margin:0 .3em 0 .3em;} +.blogList td .thumbnailMedium img {} + +.blogList.thumbnail {} +.blogList.thumbnail td { border-top:none; border-bottom:1px solid #eff0ed; padding:1.5em 0 0 1.5em; overflow:hidden;} +.blogList.thumbnail div.cell { float:left; width:131px; margin:0 1.6em 0 0; padding-bottom:1.5em;} +.blogList.thumbnail div.cell .fix_img { width:131px; height:106px; overflow:hidden;} +.blogList.thumbnail div.title { color:#444444; margin:.5em 0 .2em 0;} +.blogList.thumbnail div.title a { color:#444444;} +.blogList.thumbnail div.nameAndDate { font-size:.9em; color:#999999; margin-bottom:.2em; padding-left:3px;} +.blogList.thumbnail div.nameAndDate a { color:#999999;} +.blogList.thumbnail div.nameAndDate .date { font:.8em Tahoma; color:#999999;} +.blogList.thumbnail div.readAndRecommend { font-size:.9em; color:#666666; padding-left:3px;} +.blogList.thumbnail div.readAndRecommend .num { font:.8em Tahoma;} +.blogList.thumbnail div.readAndRecommend .vr { color:#dddddd;} +.blogList.thumbnail div.readAndRecommend strong.num { font:bold .8em Tahoma; color:#494949;} + +/* blogSearch */ +.blogSearch { clear:both; text-align:center; margin-top:3em;} +.blogSearch fieldset { display:inline; padding:10px 15px 10px 15px; border:none; background:#F4F4F4; overflow:hidden; } +.blogSearch fieldset legend { overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} +.blogSearch * { vertical-align:middle;} +.blogSearch select { float:left;} +.blogSearch input { float:left; margin:0 .3em; background:#fbfbfb;} +.searchButton ul { overflow:hidden;} +.searchButton li { float:left; margin-right:.3em; list-style:none;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; background:url(../images/common/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} + + +/* pageNavigation */ +.pageNavigation { text-align:center; display:block; margin:2.2em 0 2em 1.1em; font:bold .8em Tahoma; } +.pageNavigation a, .pageNavigation a:visited, .pageNavigation a:active { margin-left:-4px; font:bold .8em Tahoma; color:#676767; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } +.pageNavigation a:hover { text-decoration:none; } +.pageNavigation a.goToFirst, +.pageNavigation a.goToLast { border:none; border-right:1px solid #ffffff; border-left:1px solid #ffffff; z-index:99; padding:1px 5px 3px 4px;} +.pageNavigation a.goToFirst img, +.pageNavigation a.goToLast img { vertical-align:middle;} + +.buttonBox { float:right; margin:1.2em 0 0 0; } + +/* blogRead */ +#blog .blogRead { position:relative; margin:0; _overflow:hidden;} +.blogRead .originalContent { padding:2em 0 2em 0;} +.blogRead .titleAndCategory { float:left;} +.blogRead .titleAndCategory h4 { font-size:1.4em; display:inline; padding-left:.2em;} +.blogRead .titleAndCategory .vr { font-size:.9em; margin:0 .3em; color:#c5c7c0;} +.blogRead .titleAndCategory .category { font-size:.9em; color:#999999; white-space:nowrap;} + +.blogRead .dateAndModify { font-size:.8em; float:right; white-space:nowrap;} +.blogRead .dateAndModify .date { font-size:.8em; font-family:Tahoma; color:#999999; margin-right:.5em; float:left; position:relative; top:.1em;} +.blogRead .dateAndModify .date strong { font-size:1em; font-family:Tahoma;} +.blogRead .dateAndModify ul { display:inline; margin:0 .4em 0 0;} +.blogRead .dateAndModify ul li { float:left; margin-left:.3em; list-style:none;} +.blogRead dl.uri { float:right; overflow:hidden; margin:0 0 3em .3em;} +.blogRead dl.uri dt { float:left; clear:left; font-size:.9em; margin-right:.3em; color:#999999;} +.blogRead dl.uri dd { clear:right; font-size:.8em; color:#d4d5d0;} +.blogRead dl.uri dd span { font-family:Tahoma; color:#d4d5d0;} +.blogRead .readBody { padding:0 .3em; color:#555555; overflow:hidden; margin-bottom:2em;} +.blogRead .readBody p { margin:1em 0; line-height:1.5em;} +.blogRead .contentBody { width:100%; overflow:hidden; } + +.blogRead .userInfo { float:left; white-space:nowrap;} +.blogRead .userInfo .author { padding:0 .3em 0 0; color:#3074a5; margin-right:.3em;} +.blogRead .userInfo .ipaddress { font-size:.9em; font-family:Tahoma; color:#888888; margin-right:.5em; } + +/* extraVars list */ +.extraVarsList { width:100%; border:1px solid #e0e1db; clear:both; margin-bottom:1em;} +.extraVarsList tr.notice { background:#f8f8f8;} +.extraVarsList tr.notice .num { font-size:.9em; font-weight:bold;} +.extraVarsList tr.bg1 { background:#ffffff} +.extraVarsList tr.bg2 { background:#fbfbfb;} +.extraVarsList th { color:#3e3f3e; font-weight:bold; padding:.8em .5em .5em .5em; border-bottom:1px solid #eff0ed; border-right:1px solid #eff0ed;} +.extraVarsList td { border-bottom:1px solid #eff0ed; padding:.5em .5em .5em 1em;} + +.blogRead .readFooter { border-top:1px solid #dfe0db; } +.blogRead .readFooter .tag { margin-bottom:1em; padding:1em 0 0 0; } +.blogRead .readFooter .tag h5 { display:inline; font-size:1em; margin:0 .3em 0 1.8em;} +.blogRead .readFooter .tag ul, +.blogRead .readFooter .tag li { display:inline;} +.blogRead .readFooter .tag a { color:#444444; text-decoration:none;} +.blogRead .readFooter .tag .tagIcon { vertical-align:middle;} +.blogRead .readFooter .fileAttached { padding:1em 1em .8em 0; position:relative; _width:100%; border-bottom:1px solid #dfdfdd; overflow:hidden; background:#f9f9f9;} +.blogRead .readFooter .fileAttached h5 {} +.blogRead .readFooter .fileAttached ul { margin-left:1.8em;} +.blogRead .readFooter .fileAttached li { float:left; margin-right:.75em; line-height:1.6em; color:#888888; white-space:nowrap; list-style:none;} +.blogRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em .2em; white-space:nowrap; position:relative; color:#888888; text-decoration:none; } +.blogRead .readFooter .fileAttached li a:visited { color:#777777;} + +.listButton li { list-style:none; clear:both; text-align:right; margin-top:.5em; } + +.blogRead .replyAndTrackback { float:left; width:100%; background:url(../images/common/bg_repeat_x_eaeaea.gif) repeat-x left bottom; overflow:hidden;} +.blogRead .replyAndTrackback li { float:left; font-weight:bold; margin:.3em 0 0 0; padding:.7em 1.1em .7em 1.2em; color:#FFFFFF; background:#B8B8B8; list-style:none;} +.blogRead .replyAndTrackback li a { color:#FFFFFF; text-decoration:none; } +.blogRead .replyAndTrackback li strong { padding:0 1.1em 0 0; background:#B8B8B8 url(../images/common/icon_close.gif) no-repeat right .2em;} +.blogRead .replyAndTrackback li.selected a { color:#666666;} +.blogRead .replyAndTrackback li.selected strong { padding:0 1.1em 0 0; background:#FFFFFF url(../images/common/icon_open.gif) no-repeat right .2em;} +.blogRead .replyAndTrackback a#toggleReply { background:url(../images/common/buttonToggleReply.gif) no-repeat right top;} +.blogRead .replyAndTrackback a#toggleTrackback { background:url(../images/common/buttonToggleReply.gif) no-repeat right -13px;} + +.blogRead #reply, +.blogRead #trackback { color:#666666; border-left:1px solid #EAEAEA; border-right:1px solid #EAEAEA; border-bottom:1px solid #EAEAEA; padding-top:1em;} +.blogRead #reply { } +.blogRead #trackback { display:none;} + +.blogRead .topBorder { border-top:1px solid #EAEAEA; } + +.blogRead #reply .contentBox, +.blogRead #trackback .contentBox { line-height:1.25em; color:#676767; clear:both; padding:1em; overflow:hidden;} +.blogRead #reply .top_border, +.blogRead #trackback .top_border { border-top:1px dashed #d8d8d8; } + +.blogRead .contentBox .content { width:100%; overflow:hidden; clear:both; margin-bottom:1em; } +.blogRead .contentBox .author { float:left; overflow:hidden; color:#3173a3;} +.blogRead .contentBox .date { float:right; font:.8em Tahoma; color:#cccccc; margin-left:.5em; } +.blogRead .contentBox .replyOption { float:right; display:inline; white-space:nowrap; margin-left:.5em; } +.blogRead .contentBox .replyOption img { vertical-align:middle;} + +.blogRead .contentBox .fileAttached { position:relative; _width:100%; overflow:hidden; clear:both; } +.blogRead .contentBox .fileAttached h5 {} +.blogRead .contentBox .fileAttached ul { margin-bottom:.5em;} +.blogRead .contentBox .fileAttached li { float:left; margin-right:.75em; line-height:1.6em; color:#888888; white-space:nowrap; list-style:none;} +.blogRead .contentBox .fileAttached li a { font-size:.9em; padding:.1em 0 .1em .2em; white-space:nowrap; position:relative; color:#888888; text-decoration:none; } +.blogRead .contentBox .fileAttached li a:visited { color:#777777;} + +.blogRead .contentBox .title a { color:#676767 ; margin-right:.3em; text-decoration:none;} +.blogRead .contentBox address a { font-size:.9em; color:#3173a3; margin-right:.3em; text-decoration:none; } +.blogRead .contentBox address .trackback_date { font:.8em Tahoma; color:#cccccc; margin-left:.5em; } +.blogRead .indent_box { background-color:#FBFBFB; } +.blogRead .contentBox .indent {padding-left:1.5em; background:url(../images/common/icon_arrow_reply.gif) no-repeat left .1em;} + +/* blogEditor */ +.blogEditor { padding:.5em 0 1em 0; width:100%; overflow:hidden;} +.blogEditor.reply { padding:.5em 1em 1em 1em; width:auto; overflow:hidden;} +.blogEditor legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em;} +.blogEditor fieldset { _width:100%; border:0px solid #eaeae7; border-top:none;} +.blogEditor .userNameAndPw { position:relative; background:#fbfbfb; border-top:1px solid #eaeae7; border-bottom:1px solid #e1e1e1; padding:.5em 1em; white-space:nowrap;} +.blogEditor .userNameAndPw * { vertical-align:middle;} +.blogEditor .userNameAndPw label { margin-right:.2em; color:#666760;} +.blogEditor .userNameAndPw input { color:#aaaaaa;} +.blogEditor .userNameAndPw .userName { width:6em; margin-right:.8em;} +.blogEditor .userNameAndPw .userPw { width:5em;} +.blogEditor .userNameAndPw .emailAddress { width:6em;} +.blogEditor .userNameAndPw .homePage { width:6em;} +.blogEditor .userNameAndPw .checkSecret { position:absolute; right:2em; top:.7em;} +.blogEditor .commentForm { width:100%; padding-bottom:.5em;} +.blogEditor .commentForm textarea { width:632px; margin:.3em; height:100px;} + +/* blogWrite */ +.blogWrite { width:100%; position:relative;} +.blogWrite .userNameAndPw { margin-bottom:-1px;} + +.blogWrite div.title label.title { display:block; float:left; font-weight:bold; padding:.4em 0 0 1.5em; width:9.5em; white-space:nowrap;} +.blogWrite div.title input#title { width:350px;} + +.blogWrite .option dt { display:block; float:left; font-weight:bold; padding:.3em 0 0 1.5em; width:9.5em; white-space:nowrap;} +.blogWrite .option dd { float:left; margin-right:1em; padding-top:.2em; _padding-top:.1em;} +.blogWrite .option dd * { vertical-align:middle;} +.blogWrite .inputTypeText { background:#fbfbfb;} +.blogWrite .trackbackURI { clear:both; border-top:1px solid #eff0ed; padding:4px 0 .8em 0;} +.blogWrite .trackbackURI label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.blogWrite .trackbackURI .inputTypeText { width:50%;} +.blogWrite .tag { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;} +.blogWrite .tag label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.blogWrite .tag .inputTypeText { width:50%;} +.blogWrite .tag .help { vertical-align:middle;} +.blogWrite .tag .info { padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;} +.blogWrite .extra_vars { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;} +.blogWrite .extra_vars label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.blogWrite .extra_vars .info { clear:both; padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;} +.blogWrite .extra_vars ul li { float:left; margin-right:1em; } + +/* ----- List+Read+Write+Modify | End ----- */ + + +/* ----- Member | Start ----- */ + +.memberHeader { position:relative; _width:100%; background:#ED2027 url(../images/common/bg_top_title.gif) no-repeat 23px -6px; overflow:hidden;} +.memberHeader h3 { float:left; clear:both; padding:1.2em 0 1em 1.7em; font-size:1.1em; color:#FFFFFF;} +.memberInformation { width:100%; clear:both; margin:0 0 .5em 0; background:#EFEFEF; color:#8D8D8D; overflow:hidden;} +.memberInformation .friendNum { float:left; padding:.7em 0 .7em 2em; background:url(../images/common/iconFriend.gif) no-repeat .5em .4em;} +.memberInformation .friendNum strong { font:bold 11px Tahoma; color:#ec2127;} +.memberInformation .addGroup { float:right; margin:.8em 1em .7em 0;} +.memberInformation .instantMessage { float:right; margin:.7em; overflow:hidden;} +.memberInformation .instantMessage li { float:left; margin:0 0 0 -.1em; padding:0 .5em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left .25em;} +.memberInformation .instantMessage li a {white-space:nowrap; color:#666666;} +.memberInformation .instantMessage li.on a { background-position:left -14px; font-weight:bold;} +.memberInformation .instantMessage li a strong { font:bold 0.75em tahoma; color:#ee202a;} + +/* 친구목록 */ +.memberList { width:100%; position:relative; border-bottom:2px solid #ED2A32; border-collapse:collapse;} + +.memberList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/common/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.memberList th.check { padding:0;} +.memberList th.friendGroup { padding:0 0 0 .3em; text-align:left;} +.memberList th select, +.memberList th input { vertical-align:middle;} +.memberList th.repeat_bg { background:#ffffff url(../images/common/bg_title_repeat_x.gif) repeat-x left bottom;} + +.memberList td { padding:.3em; border-bottom:1px solid #e4e4e2;} +.memberList td.noline { border-bottom:none;} +.memberList td.check { text-align:center;} +.memberList td.friendGroup { } +.memberList td.userId { text-align:center; font:.9em Tahoma;} +.memberList td.userName { text-align:center;} +.memberList td.userNick { text-align:center; color:#999999;} +.memberList td.registDate { text-align:center; font:.8em Tahoma;} +.memberList td.sendMessage { text-align:center;} + + +.smallBox { margin:5em auto 1em auto;} +.smallBox.w268 { width:268px;} +.smallBox.w298 { width:298px;} +.smallBox.w498 { width:498px;} +.smallBox .header { position:relative; _width:100%; background:#ed2027; overflow:hidden;} +.smallBox .header h3 { font-size:1.2em; color:#FFFFFF; padding:1em 2em .8em 1em;} +.smallBox .login { position:relative; border:none; padding:2.4em 0 2em 2.3em;} +.smallBox .login legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} +.smallBox .login dl { overflow:hidden; width:162px; float:left;} +.smallBox .login dl dt { float:left; width:55px; color:#54564b; height:22px; padding-top:5px;} +.smallBox .login dl dd { float:left; width:105px; height:27px;} +.smallBox .login dl dd input { width:90px;} +.smallBox .login .loginButton { display:block; float:left; margin-top:27px; _margin-top:28px;} +*:first-child+html .smallBox .login .loginButton { margin-top:28px;} +.smallBox .login .keep { float:left; clear:both; white-space:nowrap; position:relative; left:55px; _left:52px;} +*:first-child+html .smallBox .login .keep { left:52px;} +.smallBox .login .keep input { vertical-align:middle;} +.smallBox .login .keep label { font-size:11px; color:#999999;} +.smallBox .help { background:#F7F7F7; border-top:1px solid #ed2a32; border-bottom:2px solid #ee2b33; overflow:hidden; padding:1.1em; text-align:center; height:1em;} +.smallBox .help li { display:inline; padding:0 .3em 0 .7em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left center;} +.smallBox .help li:first-child { background:none;} +.smallBox .help li.first-child { _background:none;} +.smallBox .help li a { font-size:11px; color:#54564b;} +.smallBox .text { color:#54564b; text-align:center; padding:4.25em 2em 4.8em 2em;} +.smallBox .text p { margin-bottom:.5em;} +.smallBox .button img { vertical-align:top;} +.smallBox.w268 .button ul { position:absolute; left:79px; } +.smallBox.w298 .button ul { position:absolute; left:110px; } +.smallBox.w498 .button ul { position:absolute; left:220px; } +.smallBox .button ul li { float:left; margin-right:.3em;} +.smallBox .complex { padding:1.5em 2em 2em 2em;} +.smallBox .friend { width:100%;} +.smallBox .friend th { width:7em; padding:.9em; border-bottom:1px solid #e4e5e0;} +.smallBox .friend td { padding:.9em; border-bottom:1px solid #e4e5e0; background:url(../images/common/bar_1x18_e4e5e0.gif) no-repeat left bottom;} +.smallBox .leftHeaderType { border-top:1px solid #e0e1db; border-left:1px solid #e0e1db; width:100%;} +.smallBox .leftHeaderType th, +.smallBox .leftHeaderType td { border-right:1px solid #e0e1db; border-bottom:1px solid #e0e1db; padding:.8em 1em .6em 1em;} +.smallBox .leftHeaderType th { color:#333333; text-align:left; background:#f5f5f3;} +.smallBox .leftHeaderType td { color:#444444;} +.smallBox .inputTypeText { background:#fbfbfb;} +.smallBox .group { overflow:hidden; padding:.5em 0; margin-top:.7em;} +.smallBox .group select { float:left; width:180px; margin-top:1px;} +.smallBox .pwModify { border:none;} +.smallBox .pwModify legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} +.smallBox .pwModify input { width:9em;} +.smallBox .pwModify br { display:block; margin-bottom:.2em} +.smallBox .pwModify p { text-align:center; margin-top:1em; color:#54564b;} + + +/* messageList */ +.messageList { width:100%; position:relative; border-bottom:2px solid #ed2a32; border-collapse:collapse;} +.messageList tr.notice .num { font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; font-weight:bold;} + +.messageList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/common/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.messageList th:first-child, +.messageList th.first-child { background-position:-3px bottom;} +.messageList th.author { background:url(../images/common/bg_title_repeat_x.gif) repeat-x left bottom; text-align:left;} +.messageList th.check { padding:0;} +.messageList th select, +.messageList th input { vertical-align:middle;} + +.messageList td { padding:.3em; border-bottom:1px solid #EFEFEF;} +.messageList td.noline { border-bottom:none;} +.messageList td.category {} +.messageList tr.notice td { padding:.7em .7em .7em .9em; white-space:nowrap;} +.messageList tr.notice td img { margin:-.1em .3em 0 0;} +.messageList td.thumb { padding:.5em 0 .5em .5em; width:145px; table-layout:fixed; white-space:nowrap;} +.messageList td.thumb * { vertical-align:middle;} +.messageList td.title {} +.messageList td.title.bold { font-size:1em; font-weight:bold;} +.messageList td.title.bold a { position:relative; top:.3em;} +.messageList td.title * { vertical-align:middle;} +.messageList td.title, +.messageList td.title a { color:#444444;} +.messageList td.title a:visited { color:#777777;} +.messageList td.author { padding:0 .5em 0 1.3em; color:#333333; font:.95em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;} +.messageList td.author a { font-size:1em; color:#333333;} +.messageList td.reading { font:.8em Tahoma; color:#999999; text-align:center;} +.messageList td.recommend { font:bold .8em Tahoma; color:#ec2127; text-align:center;} +.messageList td.reply { font:bold .8em Tahoma; color:#ff6600; text-align:center;} +.messageList td.date { font:.8em Tahoma; color:#999999; text-align:center;} +.messageList td.registDate { font:.8em Tahoma; color:#999999; text-align:center;} +.messageList td.checkDate { font:.8em Tahoma; color:#333333; text-align:center;} +.messageList td.summary { border-top:none; vertical-align:top; color:#666666; line-height:1.25em;} +.messageList td.summary a { color:#666666; text-decoration:none; line-height:inherit;} +.messageList td.summary a:visited { color:#999999;} +.messageList td.check { text-align:center;} +.messageList td.user { color:#333333; font-size:.9em;} +.messageList td.user a { color:#333333;} +.messageList td.userId { font:.9em Tahoma;} +.messageList td.userNick { font-size:.9em; color:#999999;} +.messageList td.sendMessage { text-align:center; padding:0;} +.messageList td.sendMessage .buttonFixedLeft { position:relative; left:20%; _left:0;} + +.readMessage { margin-bottom:2em;} +.readMessage .messageHeader { padding:1.5em; height:1em; overflow:hidden;} +.readMessage .messageHeader h4 { float:left; padding-left:.5em; font-size:1em; background:url(../images/common/iconArrow99.gif) no-repeat left .3em;} +.readMessage .messageHeader address { float:right; white-space:nowrap;} +.readMessage .messageHeader address em { font-size:.9em; font-style:normal; color:#333333; margin-right:.3em;} +.readMessage .messageHeader address em a { color:#333333;} +.readMessage .messageHeader address .date { font:.8em Tahoma; color:#999999;} +.readMessage .messageBody { border:1px solid #e0e1db; margin:0 1.5em 1.5em 1.5em; padding:1em; position:relative; color:#666666;} +.readMessage .deleteOrKeep { padding:.5em 0; overflow:hidden; background:#f5f5f3; border-top:1px solid #eaebe7; _width:100%;} +.readMessage .deleteOrKeep li { position:relative; left:40%; float:left; margin-right:.5em;} +.readMessage .button { position:relative; background:#f7f7f7; border-top:1px solid #ee2b33; border-bottom:2px solid #ee2b33; overflow:hidden; padding:.7em; text-align:center;} + + +.joinTable.typeA { border-top:2px solid #ee1b24; border-collapse:collapse;} +.joinTable.typeB { border-bottom:2px solid #ee1b24; background:#f9f9f9;} +.joinTable.typeC { border-top:2px solid #ee2b33; border-bottom:2px solid #ee2b33; border-collapse:collapse;} +.joinTable.typeB caption { border-top:1px dashed #919191; background:#f9f9f9;} +.joinTable { width:100%;} +.joinTable caption { padding:2em 0 .5em 1.5em; font-weight:bold; text-align:left; background:url(../images/common/iconH3.gif) no-repeat .5em 2em;} +.joinTable th, +.joinTable td { padding:.7em .5em .7em 1.5em; text-align:left; border-top:1px solid #eff0eb;} +.joinTable td { background:url(../images/common/bar_1x18_e4e5e0.gif) no-repeat left bottom;} +.joinTable th { width:10em;} +.joinTable td textarea { width:40em; height:4.5em; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:3px; line-height:1em; background:#fbfbfb; vertical-align:middle; float:left; margin-right:.5em; margin-bottom:.5em; color:#666666; overflow:auto;} +.joinTable td input { border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:3px; height:1em; line-height:1em; background:#fbfbfb; vertical-align:middle; float:left; margin-right:.5em; margin-bottom:.5em; color:#666666;} +.joinTable td input.radio, +.joinTable td input.check { border:none; padding:0; margin:0; background:none; margin-top:.4em;} +.joinTable td input.w4em { width:4em;} +.joinTable td input.w2em { width:2em;} +.joinTable td select { float:left; margin-right:.5em;} +.joinTable td .fl { margin-right:.5em;} +.joinTable td br { clear:both;} +.joinTable td p { float:left; font-size:.9em; color:#999999; padding-top:.5em; margin-right:.5em;} +.joinTable td label { float:left; color:#3f4040; padding-top:.3em; margin-right:.5em;} +.joinTable td a { color:#333333;} +.joinTable .no_line { border:none;} +.join_button { margin:1em 0 0 0; text-align:center;} +.joinTable .add_info { padding:2.5em .5em .7em 1.5em; background:#f9f9f9; border-top:1px dashed #919191;} +.buttonTypeWrite.join { margin-top:1.2em;} + +/* ----- Member | End ----- */ + + +.smallBox .inputPassword { position:relative; border:none; padding:2em 2em 1.5em 2em;} +.smallBox .inputPassword .inputTypeText { float:left; margin-right:.5em; width:8em;} +.smallBox .inputPassword legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} diff --git a/modules/blog/skins/cozy_simple/css/green.css b/modules/blog/skins/cozy_simple/css/green.css new file mode 100644 index 000000000..dcab06c12 --- /dev/null +++ b/modules/blog/skins/cozy_simple/css/green.css @@ -0,0 +1,26 @@ +@charset "utf-8"; + +/* Blog Layout - Header */ +#header { margin:0 9px .8em 9px; clear:both; margin-top:.6em; background:#8dc63f url(../images/green/bg_header.gif) no-repeat 2.5em top; border:1px solid #FFFFFF; overflow:hidden;} +#blog_category .selected { font-weight:bold; cursor:default; font-size:1em; color:#8dc63f; } +#header #globalNavigation li.on a { color:#8dc63f;} +#header #tagLine { padding:0 0 0 30px; color:#e2f1cf;} + +/* blogHeader */ +.blogHeader { position:relative; _width:100%; background:#8dc63f url(../images/green/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.blogList { width:100%; position:relative; border-bottom:2px solid #8dc63f; border-collapse:collapse; } + +.blogList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/green/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.blogList td .replyAndTrackback { font:.8em Tahoma; color:#27a939; cursor:default; position:relative; top:-.2em;} +.blogList td.recommend { font:bold .8em Tahoma; color:#27a939; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#27a939; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.blogRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #8dc63f;} +.blogRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #8dc63f; overflow:hidden;} +.blogRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#8dc63f;} + +.blogWrite fieldset.bottomBorder { border-bottom:2px solid #8dc63f;} +.blogWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/green/bg_title_norepeat.gif) no-repeat left bottom;} +.blogWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/green/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} + diff --git a/modules/blog/skins/cozy_simple/css/layout.css b/modules/blog/skins/cozy_simple/css/layout.css new file mode 100644 index 000000000..805337694 --- /dev/null +++ b/modules/blog/skins/cozy_simple/css/layout.css @@ -0,0 +1,94 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +li { list-style:none; } +a { text-decoration:none; } + +/* Common Layout of Content Group */ +#content { width:100%; position:relative; padding-bottom:2em;} + +/* Blog Layout - Common */ +#bodyWrap { width:860px; margin:0 auto; overflow:hidden; background-color:#FFFFFF;} + +/* Blog Layout - Content Body */ +#contentBody { overflow:hidden; padding-bottom:2em; _width:100%;} + +/* Blog Layout - ColumnLeft */ +#columnLeft { float:left; width:182px; margin:0px 8px 0px 10px; _margin-left:5px;padding:0px;} + +/* Blog Layout - ColumnRight */ +#columnRight {} + +/* Blog Layout - Content */ +#content { float:left; width:650px; overflow:hidden; padding-right:10px; _width:640px; } + +/* ----- Blog | Start ----- */ +#headerWrap { width:860px; margin:0 auto; overflow:hidden;} +#headerWrap #login_menu { margin-top:20px; padding:0 1.2em;} +#headerWrap #login_menu .login {float:right} +#headerWrap #login_menu .member { float:right} +#headerWrap #login_menu .member li {display:inline; margin:0 0 0 -.1em; padding:0 .6em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left center;} + +/* Blog header Child*/ +#header h1 { font:bold 1.3em 돋움; margin:2em 0 .4em 30px; letter-spacing:-.05em; } +#header h1 a { color:#FFFFFF;} +#header #globalNavigation { width:100%; margin:2.4em 0 0 0; padding:.8em 0 .8em 0; background:#e4e4e4; overflow:hidden;} +#header #globalNavigation ul { float:right; } +#header #globalNavigation li { float:left; margin-left:-1px; background:url(../images/common/bar_1x10_c0c0c0.gif) no-repeat left bottom;} +#header #globalNavigation li.no_bg { background:none;} +#header #globalNavigation li a { display:block; float:left; padding:0 1.2em; font:bold .8em Tahoma; color:#54564b; white-space:nowrap;} + +/* Column Left & Right Common Child */ +.boxTypeA { position:relative; border:5px solid #F2F2F2; margin-bottom:.7em;} +.boxTypeB { position:relative; margin-bottom:.7em;} +.boxTypeB h2 { position:relative; padding:7px 0 0 12px; height:21px; _height:20px; background:#f5f5f5; font-size:1em; color:#ef2121; font-family:Tahoma;} +*:first-child+html .boxTypeB h2 { height:20px; color:#ef2121;} +.boxTypeB .toggleMask {position:absolute; top:8px; right:5px; cursor:pointer; width:13px; height:13px; overflow:hidden;} +.boxTypeB .showHide { position:relative;} +.boxTypeB .optionList { position:absolute; top:8px; right:0; overflow:hidden;} +.boxTypeB .optionList li { float:left; padding:0 .5em; margin-left:-1px; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left center;} +.boxTypeB .optionList li a { color:#a4a4a4; font-size:.9em;} +.boxTypeB .optionList li.on a { color:#000000;} +.boxTypeB .showAll { color:#737373; font:bold .9em tahoma; white-space:nowrap; display:inline-block; padding:.4em .8em; background:url(../images/common/bar_1x8_c0c0c0.gif) no-repeat right center;} +.boxTypeB .showAll.no_bg { background:none;} + +/* Profile */ +div#profile { padding:6px; overflow:hidden;} +div#profile img.profile { width:153px; display:block; margin-bottom:1.2em;} +div#profile dl#hello {} +div#profile dl#hello dt { color:#333333; margin-bottom:.5em;} +div#profile dl#hello dt a { color:#333333;} +div#profile dl#hello dd { color:#777777; margin-bottom:1em;} +div#profile ul#admin { overflow:hidden; height:1.2em;} +div#profile ul#admin li { float:left; padding:0 .4em; font-size:.8em;} +div#profile ul#admin li a { display:block;} +div#profile ul#admin li.write a {} +div#profile ul#admin li.setup { border-left:1px solid #e3e3e3;} +div#profile ul#admin li.setup a {} +div#profile ul#admin li a { color:#666666;} + +/* Category */ +div#category {} +div#category #categoryList { padding:1em .8em .5em .8em;} +div#category #categoryList li { position:relative; padding:0 0 0 15px; background:url(../images/common/iconFolderClose.gif) no-repeat 2px top;} +div#category #categoryList li li {} +div#category #categoryList li li li { background:url(../images/common/iconList.gif) no-repeat 5px top;} +div#category #categoryList a { display:block; _display:inline-block; color:#6b6b6b; margin:0 0 6px 5px;} + +/* Search Box */ +div#searchBox { margin-bottom:.7em; padding:.6em; background:#f5f5f5; overflow:hidden; _height:25px;} +div#searchBox fieldset { border:none;} +div#searchBox fieldset legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} + +.blogWrite div.title { border-top:2px solid #ed1b24;} +.write_post h3 {margin:1.5em 1em 1em 1em; font:bold 1.2em 돋움;} +/* ----- Blog | End ----- */ + +.blogHeader2 { width:100%; overflow:hidden; padding:2em 0 2em 0; color:#333333;} +.blogHeader2 h3 { float:left; font-size:1.2em; padding-left:1em; background:url(../images/common/iconH3.gif) no-repeat .5em center;} +.blogHeader2 .info { float:right; position:relative; right:1.2em; top:.3em; font-size:.8em; color:#8d8d8d;} +.blogHeader2 .info q { quotes:none; font-weight:bold; font:bold 1.2em 돋움; color:#676767;} +.blogHeader2 .info strong { font:bold .9em Tahoma; color:#696969;} diff --git a/modules/blog/skins/cozy_simple/css/pink.css b/modules/blog/skins/cozy_simple/css/pink.css new file mode 100644 index 000000000..6cce40855 --- /dev/null +++ b/modules/blog/skins/cozy_simple/css/pink.css @@ -0,0 +1,25 @@ +@charset "utf-8"; + +/* Blog Layout - Header */ +#header { margin:0 9px .8em 9px; clear:both; margin-top:.6em; background:#f70795 url(../images/pink/bg_header.gif) no-repeat 2.5em top; border:1px solid #FFFFFF; overflow:hidden;} +#blog_category .selected { font-weight:bold; cursor:default; font-size:1em; color:#f70795; } +#header #globalNavigation li.on a { color:#f70795;} +#header #tagLine { padding:0 0 0 30px; color:#fdc1e4;} + +/* blogHeader */ +.blogHeader { position:relative; _width:100%; background:#f70795 url(../images/pink/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.blogList { width:100%; position:relative; border-bottom:2px solid #f70795; border-collapse:collapse; } + +.blogList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/pink/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.blogList td .replyAndTrackback { font:.8em Tahoma; color:#f70795; cursor:default; position:relative; top:-.2em;} +.blogList td.recommend { font:bold .8em Tahoma; color:#f70795; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#f70795; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.blogRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #f70795;} +.blogRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #f70795; overflow:hidden;} +.blogRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#f70795;} + +.blogWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;} +.blogWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/pink/bg_title_norepeat.gif) no-repeat left bottom;} +.blogWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/pink/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} diff --git a/modules/blog/skins/cozy_simple/css/red.css b/modules/blog/skins/cozy_simple/css/red.css new file mode 100644 index 000000000..9e9e808c6 --- /dev/null +++ b/modules/blog/skins/cozy_simple/css/red.css @@ -0,0 +1,25 @@ +@charset "utf-8"; + +/* Blog Layout - Header */ +#header { margin:0 9px .8em 9px; clear:both; margin-top:.6em; background:#ed2027 url(../images/red/bg_header.gif) no-repeat 2.5em top; border:1px solid #FFFFFF; overflow:hidden;} +#blog_category .selected { font-weight:bold; cursor:default; font-size:1em; color:#ed2027; } +#header #globalNavigation li.on a { color:#ee2126;} +#header #tagLine { padding:0 0 0 30px; color:#f6c8c8;} + +/* blogHeader */ +.blogHeader { position:relative; _width:100%; background:#ED2027 url(../images/red/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.blogList { width:100%; position:relative; border-bottom:2px solid #ed2a32; border-collapse:collapse; } + +.blogList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/red/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.blogList td .replyAndTrackback { font:.8em Tahoma; color:#ed1f29; cursor:default; position:relative; top:-.2em;} +.blogList td.recommend { font:bold .8em Tahoma; color:#ec2127; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#ff6600; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.blogRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #ed2228;} +.blogRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #ee202a; overflow:hidden;} +.blogRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#eb1c22;} + +.blogWrite fieldset.bottomBorder { border-bottom:2px solid #ed1b24;} +.blogWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/red/bg_title_norepeat.gif) no-repeat left bottom;} +.blogWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/red/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} diff --git a/modules/blog/skins/cozy_simple/delete_comment_form.html b/modules/blog/skins/cozy_simple/delete_comment_form.html new file mode 100644 index 000000000..984c3ac8e --- /dev/null +++ b/modules/blog/skins/cozy_simple/delete_comment_form.html @@ -0,0 +1,24 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + + +
+
+ + diff --git a/modules/blog/skins/cozy_simple/delete_form.html b/modules/blog/skins/cozy_simple/delete_form.html new file mode 100644 index 000000000..1ca638c93 --- /dev/null +++ b/modules/blog/skins/cozy_simple/delete_form.html @@ -0,0 +1,23 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + +
+
+ + diff --git a/modules/blog/skins/cozy_simple/delete_trackback_form.html b/modules/blog/skins/cozy_simple/delete_trackback_form.html new file mode 100644 index 000000000..f907b6793 --- /dev/null +++ b/modules/blog/skins/cozy_simple/delete_trackback_form.html @@ -0,0 +1,25 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + + +
+
+ + + diff --git a/modules/blog/skins/cozy_simple/extra_var_form.html b/modules/blog/skins/cozy_simple/extra_var_form.html new file mode 100644 index 000000000..564cec9d9 --- /dev/null +++ b/modules/blog/skins/cozy_simple/extra_var_form.html @@ -0,0 +1,65 @@ + + + + + {@ $val->default = explode(',',$val->default) } + + + +{@ $val->column_name = "extra_vars".$key} + + +{@ $val->value = $oDocument->getExtraValue($key)} + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
  • value)&&in_array($v, $val->value))-->checked="checked"/> {$v}
  • + +
+ + + + + + + + + +
{zdate($val->value,"Y-m-d")}
+ {$lang->cmd_open_calendar} + + + +

{$val->desc}

+ diff --git a/modules/blog/skins/cozy_simple/extra_var_value.html b/modules/blog/skins/cozy_simple/extra_var_value.html new file mode 100644 index 000000000..0d5b21657 --- /dev/null +++ b/modules/blog/skins/cozy_simple/extra_var_value.html @@ -0,0 +1,57 @@ + + + +{@ $val->column_name = "extra_vars".$key} + + +{@ $val->value = $oDocument->getExtraValue($key)} + + + + {htmlspecialchars($val->value)} + + + + + {$val->value} + +   + + + + + + {$val->value} + +   + + + + + {htmlspecialchars($val->value[0])} + - + {htmlspecialchars($val->value[1])} + - + {htmlspecialchars($val->value[2])} + + + + {nl2br(htmlspecialchars($val->value))} + + + + + {@ $_tmp_value[] = htmlspecialchars($v)} + + {implode(",",$_tmp_value)} + + + + {htmlspecialchars($val->value)} + + + + {zdate($val->value,"Y-m-d")} + + +  diff --git a/modules/blog/skins/cozy_simple/filter/delete_comment.xml b/modules/blog/skins/cozy_simple/filter/delete_comment.xml new file mode 100644 index 000000000..86ca3fb71 --- /dev/null +++ b/modules/blog/skins/cozy_simple/filter/delete_comment.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/blog/skins/cozy_simple/filter/delete_document.xml b/modules/blog/skins/cozy_simple/filter/delete_document.xml new file mode 100644 index 000000000..263ca7e86 --- /dev/null +++ b/modules/blog/skins/cozy_simple/filter/delete_document.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/blog/skins/cozy_simple/filter/delete_trackback.xml b/modules/blog/skins/cozy_simple/filter/delete_trackback.xml new file mode 100644 index 000000000..1d8841ba3 --- /dev/null +++ b/modules/blog/skins/cozy_simple/filter/delete_trackback.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/blog/skins/cozy_simple/filter/input_password.xml b/modules/blog/skins/cozy_simple/filter/input_password.xml new file mode 100644 index 000000000..f2d1c0c42 --- /dev/null +++ b/modules/blog/skins/cozy_simple/filter/input_password.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/blog/skins/cozy_simple/filter/insert.xml b/modules/blog/skins/cozy_simple/filter/insert.xml new file mode 100644 index 000000000..3938eaf42 --- /dev/null +++ b/modules/blog/skins/cozy_simple/filter/insert.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/blog/skins/cozy_simple/filter/insert_comment.xml b/modules/blog/skins/cozy_simple/filter/insert_comment.xml new file mode 100644 index 000000000..1a3245e34 --- /dev/null +++ b/modules/blog/skins/cozy_simple/filter/insert_comment.xml @@ -0,0 +1,28 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/blog/skins/cozy_simple/footer.html b/modules/blog/skins/cozy_simple/footer.html new file mode 100644 index 000000000..c6171637a --- /dev/null +++ b/modules/blog/skins/cozy_simple/footer.html @@ -0,0 +1,2 @@ + +{$module_info->footer_text} diff --git a/modules/blog/skins/cozy_simple/header.html b/modules/blog/skins/cozy_simple/header.html new file mode 100644 index 000000000..5de3a6ef1 --- /dev/null +++ b/modules/blog/skins/cozy_simple/header.html @@ -0,0 +1,2 @@ + +{$module_info->header_text} diff --git a/modules/blog/skins/cozy_simple/images/blue/bg_header.gif b/modules/blog/skins/cozy_simple/images/blue/bg_header.gif new file mode 100644 index 000000000..78d56c054 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/blue/bg_header.gif differ diff --git a/modules/blog/skins/cozy_simple/images/blue/bg_title.gif b/modules/blog/skins/cozy_simple/images/blue/bg_title.gif new file mode 100644 index 000000000..ff67b452b Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/blue/bg_title.gif differ diff --git a/modules/blog/skins/cozy_simple/images/blue/bg_title_norepeat.gif b/modules/blog/skins/cozy_simple/images/blue/bg_title_norepeat.gif new file mode 100644 index 000000000..aec4de0b0 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/blue/bg_title_norepeat.gif differ diff --git a/modules/blog/skins/cozy_simple/images/blue/bg_top_title.gif b/modules/blog/skins/cozy_simple/images/blue/bg_top_title.gif new file mode 100644 index 000000000..99eecde67 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/blue/bg_top_title.gif differ diff --git a/modules/blog/skins/cozy_simple/images/bluish_green/bg_header.gif b/modules/blog/skins/cozy_simple/images/bluish_green/bg_header.gif new file mode 100644 index 000000000..d21c552ad Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/bluish_green/bg_header.gif differ diff --git a/modules/blog/skins/cozy_simple/images/bluish_green/bg_title.gif b/modules/blog/skins/cozy_simple/images/bluish_green/bg_title.gif new file mode 100644 index 000000000..c5cf6b136 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/bluish_green/bg_title.gif differ diff --git a/modules/blog/skins/cozy_simple/images/bluish_green/bg_title_norepeat.gif b/modules/blog/skins/cozy_simple/images/bluish_green/bg_title_norepeat.gif new file mode 100644 index 000000000..227cf252b Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/bluish_green/bg_title_norepeat.gif differ diff --git a/modules/blog/skins/cozy_simple/images/bluish_green/bg_top_title.gif b/modules/blog/skins/cozy_simple/images/bluish_green/bg_top_title.gif new file mode 100644 index 000000000..160682e41 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/bluish_green/bg_top_title.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/bar_1x7_c0c0c0.gif b/modules/blog/skins/cozy_simple/images/common/bar_1x7_c0c0c0.gif new file mode 100644 index 000000000..1d2f92ff7 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/bar_1x7_c0c0c0.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/bar_1x8_c0c0c0.gif b/modules/blog/skins/cozy_simple/images/common/bar_1x8_c0c0c0.gif new file mode 100644 index 000000000..f37814f58 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/bar_1x8_c0c0c0.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/bg_repeat_x_eaeaea.gif b/modules/blog/skins/cozy_simple/images/common/bg_repeat_x_eaeaea.gif new file mode 100644 index 000000000..0b011fe5d Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/bg_repeat_x_eaeaea.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn2_search.gif b/modules/blog/skins/cozy_simple/images/common/btn2_search.gif new file mode 100644 index 000000000..d521e671c Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn2_search.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn4_join_us.gif b/modules/blog/skins/cozy_simple/images/common/btn4_join_us.gif new file mode 100644 index 000000000..dbbea00f7 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn4_join_us.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn4_login.gif b/modules/blog/skins/cozy_simple/images/common/btn4_login.gif new file mode 100644 index 000000000..e649de24a Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn4_login.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn4_logout.gif b/modules/blog/skins/cozy_simple/images/common/btn4_logout.gif new file mode 100644 index 000000000..36f1d6ec1 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn4_logout.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn4_rss.gif b/modules/blog/skins/cozy_simple/images/common/btn4_rss.gif new file mode 100644 index 000000000..50584f6d5 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn4_rss.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn4_rss.gif.1 b/modules/blog/skins/cozy_simple/images/common/btn4_rss.gif.1 new file mode 100644 index 000000000..50584f6d5 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn4_rss.gif.1 differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_admin.gif b/modules/blog/skins/cozy_simple/images/common/btn_admin.gif new file mode 100644 index 000000000..bea6e158e Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_admin.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_cancel.gif b/modules/blog/skins/cozy_simple/images/common/btn_cancel.gif new file mode 100644 index 000000000..65b303e06 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_cancel.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_cancel3.gif b/modules/blog/skins/cozy_simple/images/common/btn_cancel3.gif new file mode 100644 index 000000000..5dfcfd0b7 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_cancel3.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_delete.gif b/modules/blog/skins/cozy_simple/images/common/btn_delete.gif new file mode 100644 index 000000000..84a26c508 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_delete.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_delete2.gif b/modules/blog/skins/cozy_simple/images/common/btn_delete2.gif new file mode 100644 index 000000000..1fcb5e906 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_delete2.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_edit.gif b/modules/blog/skins/cozy_simple/images/common/btn_edit.gif new file mode 100644 index 000000000..3f7bd62b1 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_edit.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_findid.gif b/modules/blog/skins/cozy_simple/images/common/btn_findid.gif new file mode 100644 index 000000000..de53c3d16 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_findid.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_findpw.gif b/modules/blog/skins/cozy_simple/images/common/btn_findpw.gif new file mode 100644 index 000000000..26f254d9a Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_findpw.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_joinus.gif b/modules/blog/skins/cozy_simple/images/common/btn_joinus.gif new file mode 100644 index 000000000..beed35641 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_joinus.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_list.gif b/modules/blog/skins/cozy_simple/images/common/btn_list.gif new file mode 100644 index 000000000..8e56215c8 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_list.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_login.gif b/modules/blog/skins/cozy_simple/images/common/btn_login.gif new file mode 100755 index 000000000..b5e6a3e9e Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_login.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_logout.gif b/modules/blog/skins/cozy_simple/images/common/btn_logout.gif new file mode 100644 index 000000000..0233282e6 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_logout.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_manage.gif b/modules/blog/skins/cozy_simple/images/common/btn_manage.gif new file mode 100755 index 000000000..6f5cd05b7 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_manage.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_modify.gif b/modules/blog/skins/cozy_simple/images/common/btn_modify.gif new file mode 100644 index 000000000..7b4321472 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_modify.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_my.gif b/modules/blog/skins/cozy_simple/images/common/btn_my.gif new file mode 100644 index 000000000..72e626189 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_my.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_preview.gif b/modules/blog/skins/cozy_simple/images/common/btn_preview.gif new file mode 100755 index 000000000..e66ee6ca5 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_preview.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_print.gif b/modules/blog/skins/cozy_simple/images/common/btn_print.gif new file mode 100755 index 000000000..56e0efb04 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_print.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_reply.gif b/modules/blog/skins/cozy_simple/images/common/btn_reply.gif new file mode 100644 index 000000000..1482218b6 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_reply.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_reply2.gif b/modules/blog/skins/cozy_simple/images/common/btn_reply2.gif new file mode 100644 index 000000000..5f34a2ea8 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_reply2.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_rss.gif b/modules/blog/skins/cozy_simple/images/common/btn_rss.gif new file mode 100755 index 000000000..424624cfd Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_rss.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_scrap.gif b/modules/blog/skins/cozy_simple/images/common/btn_scrap.gif new file mode 100755 index 000000000..29d9beb44 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_scrap.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_search.gif b/modules/blog/skins/cozy_simple/images/common/btn_search.gif new file mode 100644 index 000000000..0a12014d3 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_search.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_vote.gif b/modules/blog/skins/cozy_simple/images/common/btn_vote.gif new file mode 100755 index 000000000..5a637cb0e Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_vote.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/btn_write.gif b/modules/blog/skins/cozy_simple/images/common/btn_write.gif new file mode 100644 index 000000000..53a2e1cf0 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/btn_write.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/buttonAscending.gif b/modules/blog/skins/cozy_simple/images/common/buttonAscending.gif new file mode 100644 index 000000000..b405cc323 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/buttonAscending.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/buttonDescending.gif b/modules/blog/skins/cozy_simple/images/common/buttonDescending.gif new file mode 100644 index 000000000..2dc5575ff Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/buttonDescending.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/buttonTypeInput24.gif b/modules/blog/skins/cozy_simple/images/common/buttonTypeInput24.gif new file mode 100644 index 000000000..0dcfc0e3d Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/buttonTypeInput24.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/iconArrow.gif b/modules/blog/skins/cozy_simple/images/common/iconArrow.gif new file mode 100644 index 000000000..267b36495 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/iconArrow.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/iconFile.gif b/modules/blog/skins/cozy_simple/images/common/iconFile.gif new file mode 100644 index 000000000..d48f9c181 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/iconFile.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/iconFolderClose.gif b/modules/blog/skins/cozy_simple/images/common/iconFolderClose.gif new file mode 100644 index 000000000..169ca65d6 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/iconFolderClose.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/iconH3.gif b/modules/blog/skins/cozy_simple/images/common/iconH3.gif new file mode 100644 index 000000000..8ea0cec82 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/iconH3.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/iconList.gif b/modules/blog/skins/cozy_simple/images/common/iconList.gif new file mode 100644 index 000000000..74ede5564 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/iconList.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/iconTag.gif b/modules/blog/skins/cozy_simple/images/common/iconTag.gif new file mode 100644 index 000000000..ecfdb5585 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/iconTag.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/icon_arrow_reply.gif b/modules/blog/skins/cozy_simple/images/common/icon_arrow_reply.gif new file mode 100644 index 000000000..bbabbd7ea Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/icon_arrow_reply.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/icon_gofirst.gif b/modules/blog/skins/cozy_simple/images/common/icon_gofirst.gif new file mode 100644 index 000000000..68ba6ef96 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/icon_gofirst.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/icon_golast.gif b/modules/blog/skins/cozy_simple/images/common/icon_golast.gif new file mode 100644 index 000000000..f2450047d Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/icon_golast.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/icon_notice.gif b/modules/blog/skins/cozy_simple/images/common/icon_notice.gif new file mode 100644 index 000000000..d9fb255f3 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/icon_notice.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/txt_admin.gif b/modules/blog/skins/cozy_simple/images/common/txt_admin.gif new file mode 100644 index 000000000..bf301b8a6 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/txt_admin.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/txt_date.gif b/modules/blog/skins/cozy_simple/images/common/txt_date.gif new file mode 100644 index 000000000..524d2d782 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/txt_date.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/txt_friend.gif b/modules/blog/skins/cozy_simple/images/common/txt_friend.gif new file mode 100644 index 000000000..178b5ffe0 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/txt_friend.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/txt_hit.gif b/modules/blog/skins/cozy_simple/images/common/txt_hit.gif new file mode 100644 index 000000000..cc9771319 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/txt_hit.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/txt_hot.gif b/modules/blog/skins/cozy_simple/images/common/txt_hot.gif new file mode 100644 index 000000000..34e12c1ee Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/txt_hot.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/txt_message.gif b/modules/blog/skins/cozy_simple/images/common/txt_message.gif new file mode 100644 index 000000000..54560b9e3 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/txt_message.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/txt_my.gif b/modules/blog/skins/cozy_simple/images/common/txt_my.gif new file mode 100644 index 000000000..3c1687494 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/txt_my.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/txt_name.gif b/modules/blog/skins/cozy_simple/images/common/txt_name.gif new file mode 100644 index 000000000..789dba359 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/txt_name.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/txt_option.gif b/modules/blog/skins/cozy_simple/images/common/txt_option.gif new file mode 100644 index 000000000..9cb5202b7 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/txt_option.gif differ diff --git a/modules/blog/skins/cozy_simple/images/common/txt_title.gif b/modules/blog/skins/cozy_simple/images/common/txt_title.gif new file mode 100644 index 000000000..34125f7a7 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/common/txt_title.gif differ diff --git a/modules/blog/skins/cozy_simple/images/green/bg_header.gif b/modules/blog/skins/cozy_simple/images/green/bg_header.gif new file mode 100644 index 000000000..8f2419252 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/green/bg_header.gif differ diff --git a/modules/blog/skins/cozy_simple/images/green/bg_title.gif b/modules/blog/skins/cozy_simple/images/green/bg_title.gif new file mode 100644 index 000000000..9223e8058 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/green/bg_title.gif differ diff --git a/modules/blog/skins/cozy_simple/images/green/bg_title_norepeat.gif b/modules/blog/skins/cozy_simple/images/green/bg_title_norepeat.gif new file mode 100644 index 000000000..57aa0ebea Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/green/bg_title_norepeat.gif differ diff --git a/modules/blog/skins/cozy_simple/images/green/bg_top_title.gif b/modules/blog/skins/cozy_simple/images/green/bg_top_title.gif new file mode 100644 index 000000000..95cfa0245 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/green/bg_top_title.gif differ diff --git a/modules/blog/skins/cozy_simple/images/pink/bg_header.gif b/modules/blog/skins/cozy_simple/images/pink/bg_header.gif new file mode 100644 index 000000000..a8dd48b31 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/pink/bg_header.gif differ diff --git a/modules/blog/skins/cozy_simple/images/pink/bg_title.gif b/modules/blog/skins/cozy_simple/images/pink/bg_title.gif new file mode 100644 index 000000000..4c587d473 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/pink/bg_title.gif differ diff --git a/modules/blog/skins/cozy_simple/images/pink/bg_title_norepeat.gif b/modules/blog/skins/cozy_simple/images/pink/bg_title_norepeat.gif new file mode 100644 index 000000000..80a473e84 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/pink/bg_title_norepeat.gif differ diff --git a/modules/blog/skins/cozy_simple/images/pink/bg_top_title.gif b/modules/blog/skins/cozy_simple/images/pink/bg_top_title.gif new file mode 100644 index 000000000..d218b2a9e Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/pink/bg_top_title.gif differ diff --git a/modules/blog/skins/cozy_simple/images/poweredbyzbxe.png b/modules/blog/skins/cozy_simple/images/poweredbyzbxe.png new file mode 100644 index 000000000..e15f5af89 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/poweredbyzbxe.png differ diff --git a/modules/blog/skins/cozy_simple/images/red/bg_header.gif b/modules/blog/skins/cozy_simple/images/red/bg_header.gif new file mode 100644 index 000000000..cdb5ebffa Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/red/bg_header.gif differ diff --git a/modules/blog/skins/cozy_simple/images/red/bg_title.gif b/modules/blog/skins/cozy_simple/images/red/bg_title.gif new file mode 100644 index 000000000..f693fc693 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/red/bg_title.gif differ diff --git a/modules/blog/skins/cozy_simple/images/red/bg_title_norepeat.gif b/modules/blog/skins/cozy_simple/images/red/bg_title_norepeat.gif new file mode 100644 index 000000000..f1b2417f5 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/red/bg_title_norepeat.gif differ diff --git a/modules/blog/skins/cozy_simple/images/red/bg_top_title.gif b/modules/blog/skins/cozy_simple/images/red/bg_top_title.gif new file mode 100644 index 000000000..c4ae66243 Binary files /dev/null and b/modules/blog/skins/cozy_simple/images/red/bg_top_title.gif differ diff --git a/modules/blog/skins/cozy_simple/input_password_form.html b/modules/blog/skins/cozy_simple/input_password_form.html new file mode 100644 index 000000000..985f1ffd5 --- /dev/null +++ b/modules/blog/skins/cozy_simple/input_password_form.html @@ -0,0 +1,27 @@ + + + +
+ +
+

{$lang->msg_input_password}

+
+ +
+ + + + + + + +
+ +
+ + + diff --git a/modules/blog/skins/cozy_simple/js/blog.js b/modules/blog/skins/cozy_simple/js/blog.js new file mode 100644 index 000000000..9e448a914 --- /dev/null +++ b/modules/blog/skins/cozy_simple/js/blog.js @@ -0,0 +1,120 @@ +/** + * @file modules/blog/js/blog.js + * @author zero (zero@nzeo.com) + * @brief blog 모듈의 javascript + **/ + +/* 글쓰기 작성후 */ +function completeDocumentInserted(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var category_srl = ret_obj['category_srl']; + + alert(message); + + var url = current_url.setQuery('mid',mid).setQuery('document_srl',document_srl).setQuery('act',''); + if(category_srl) url = url.setQuery('category',category_srl); + location.href = url; +} + +/* 글 삭제 */ +function completeDeleteDocument(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var page = ret_obj['page']; + + var url = "./?mid="+mid; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 검색 실행 */ +function completeSearch(fo_obj, params) { + fo_obj.submit(); +} + +// 현재 페이지 reload +function completeReload(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + location.href = location.href; +} + +/* 댓글쓰기 submit */ +function doCommentSubmit() { + var fo_obj = xGetElementById('fo_comment_write'); + procFilter(fo_obj, insert); +} + +/* 댓글 글쓰기 작성후 */ +function completeInsertComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var comment_srl = ret_obj['comment_srl']; + + alert(message); + var url = current_url.setQuery('comment_srl','').setQuery('act','').setQuery('rnd',comment_srl); + if(comment_srl) url += '#comment_'+comment_srl; + location.href = url; +} + +/* 댓글 삭제 */ +function completeDeleteComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 트랙백 삭제 */ +function completeDeleteTrackback(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 카테고리 이동 */ +function doChangeCategory(sel_obj, url) { + var category_srl = sel_obj.options[sel_obj.selectedIndex].value; + if(!category_srl) location.href=url; + else location.href=url+'&category='+category_srl; +} + +// Editor Reply And Trackback Toggle +function toggleReply() { + xGetElementById('reply').style.display = 'block'; + xGetElementById('trackback').style.display = 'none'; + xGetElementById('toggleReply').parentNode.className = 'selected'; + xGetElementById('toggleTrackback').parentNode.className = ''; +} + +function toggleTrackback() { + xGetElementById('reply').style.display = 'none'; + xGetElementById('trackback').style.display = 'block'; + xGetElementById('toggleReply').parentNode.className = ''; + xGetElementById('toggleTrackback').parentNode.className = 'selected'; +} diff --git a/modules/blog/skins/cozy_simple/js/blog_tree_menu.js b/modules/blog/skins/cozy_simple/js/blog_tree_menu.js new file mode 100644 index 000000000..167ba1734 --- /dev/null +++ b/modules/blog/skins/cozy_simple/js/blog_tree_menu.js @@ -0,0 +1,282 @@ +/** + * @file blog_tree_menu.js + * @author zero (zero@nzeo.com) + * @brief xml파일을 읽어서 트리 메뉴를 그려줌 + * + * common/tpl/tree_menu.js 를 서비스용으로만 사용하기 위해서 수정한 것. + * 관리 기능이 없고 css 적용이 가능 + **/ + +// 폴더를 모두 열고/닫기 위한 변수 설정 +var blog_tree_menu_folder_list = new Array(); + +// 노드의 정보를 가지고 있을 변수 +var blog_node_info_list = new Array(); + +// 카테고리별 문서 수를 가지고 있는 전역 변수 +var category_document_count = new Array(); +var total_document_count = 0; + +// 카테고리의 문서 갯수를 세팅하는 함수 +function setDocumentCount(node_srl, document_count) { + category_document_count[node_srl] = document_count; + total_document_count += document_count; +} + +// 카테고리의 node_srl로 문서 갯수를 리턴하는 함수 +function getDocumentCount(node_srl) { + return parseInt(category_document_count[node_srl],10); +} + +// 트리메뉴의 정보를 담고 있는 xml파일을 읽고 drawTreeMenu()를 호출하는 함수 +function blogLoadTreeMenu(xml_url, title, index_url) { + // 일단 그릴 곳을 찾아서 사전 작업을 함 (그릴 곳이 없다면 아예 시도를 안함) + var zone = xGetElementById("blog_category"); + if(typeof(zone)=="undefined") return; + + // 제목이 없으면 제목을 category로 지정 + if(typeof(title)=="undefined" || !title) title = "category"; + + // index url이 없으면 현재 # 으로 대체 + if(!index_url) index_url= "#"; + + // xml_handler를 이용해서 직접 메뉴 xml파일를 읽음 + if(!xml_url) return; + var oXml = new xml_handler(); + oXml.reset(); + oXml.xml_path = xml_url; + + var param = {"title":title, "index_url":index_url} + + // 요청후 drawTreeMenu()함수를 호출 (xml_handler.js에서 request method를 직접 이용) + oXml.request(blogDrawTreeMenu, oXml, null, null, null, param); +} + +// 트리메뉴 XML정보를 이용해서 정해진 zone에 출력 +var blog_menu_selected = false; +function blogDrawTreeMenu(oXml, callback_func, resopnse_tags, null_func, param) { + var title = param.title; + var index_url = param.index_url; + + var zone = xGetElementById("blog_category"); + var html = ""; + + // 받아온 xml내용을 이용하여 트리 메뉴 그림 + var xmlDoc = oXml.getResponseXml(); + if(!xmlDoc) { + xInnerHtml(zone, html); + return null; + } + + // node 태그에 해당하는 값들을 가져와서 html을 작성 + var node_list = xmlDoc.getElementsByTagName("node"); + if(node_list.length>0) { + var root = xmlDoc.getElementsByTagName("root")[0]; + var output = blogDrawNode(root,0); + html += output.html; + } + + // 제목 지정 + var title_class = "selected"; + if(blog_menu_selected) title_class = "unselected"; + var title_html = '
'+title+' '; + if(total_document_count) title_html += '('+total_document_count+')'; + html = title_html+'
'+html+'
'; + + // 출력하려는 zone이 없다면 load후에 출력하도록 함 + if(!zone) { + xAddEventListener(window, 'load', function() { blogDrawTeeMenu(html); }); + + // 출력하려는 zone을 찾아졌다면 바로 출력 + } else { + xInnerHtml(zone, html); + } + + return null; +} + +// 페이지 랜더링 중에 메뉴의 html이 완성되었을때 window.onload event 후에 그리기 재시도를 하게 될 함수 +function blogDrawTeeMenu(html) { + xInnerHtml("blog_category", html); +} + +// root부터 시작해서 recursive하게 노드를 표혐 +function blogDrawNode(parent_node, depth) { + var output = {html:"", expand:"N"} + + for (var i=0; i< parent_node.childNodes.length; i++) { + var html = ""; + var selected = false; + + // nodeName이 node가 아니면 패스~ + var node = parent_node.childNodes.item(i); + if(node.nodeName!="node") continue; + + // node의 기본 변수들 체크 + var node_srl = node.getAttribute("node_srl"); + var text = node.getAttribute("text"); + var url = node.getAttribute("url"); + var expand = node.getAttribute("expand"); + if(!text) continue; + + // 자식 노드가 있는지 확인 + var hasChild = false; + if(node.hasChildNodes()) hasChild = true; + + // nextSibling가 있는지 확인 + var hasNextSibling = false; + if(i==parent_node.childNodes.length-1) hasNextSibling = true; + + // 후에 사용하기 위해 blog_node_info_list에 node_srl을 값으로 하여 node object 추가 + blog_node_info_list[node_srl] = node; + + // zone_id 값을 세팅 + var zone_id = "blog_category_"+node_srl; + blog_tree_menu_folder_list[blog_tree_menu_folder_list.length] = zone_id; + + var current_category = current_url.getQuery('category'); + if(current_category == node_srl) { + selected = true; + blog_menu_selected = true; + } + + // blog_selected_node이 node_srl과 같으면 펼침으로 처리 + if(selected) expand = "Y"; + + // 아이콘 설정 + var line_class = null; + var folder_class = null; + + // 자식 노드가 있을 경우 자식 노드의 html을 구해옴 + var child_output = null; + var child_html = ""; + + if(hasChild) { + // 자식 노드의 zone id를 세팅 + var child_zone_id = zone_id+"_child"; + blog_tree_menu_folder_list[blog_tree_menu_folder_list.length] = child_zone_id; + + // html을 받아옴 + child_output = blogDrawNode(node, depth+1); + var chtml = child_output.html; + var cexpand = child_output.expand; + if(cexpand == "Y") expand = "Y"; + + // 무조건 펼침이 아닐 경우 + if(expand!="Y") { + var line_class = "line_close"; + if(hasNextSibling) line_class = "item_close"; + //if(depth==0) line_class = "line_null"; + child_html += '
'+chtml+'
'; + + // 무조건 펼침일 경우 + } else { + var line_class = "line_open"; + if(hasNextSibling) line_class = "item_open"; + //if(depth==0) line_class = "line_null"; + child_html += '
'+chtml+'
'; + } + } + + // 자식 노드가 있는지 확인하여 있으면 아이콘을 바꿈 + if(hasChild) { + + // 무조건 펼침이 아닐 경우 + if(expand != "Y") { + if(!hasNextSibling) { + line_class = "minus"; + folder_class = "folder_close"; + } else { + line_class = "minus_bottom"; + folder_class = "folder_close"; + } + // 무조건 펼침일 경우 + } else { + if(!hasNextSibling) { + line_class = "plus"; + folder_class = "folder_open"; + } else { + line_class = "plus_bottom"; + folder_class = "folder_open"; + } + } + + // 자식 노드가 없을 경우 + } else { + if(hasNextSibling) { + line_class = "join_bottom"; + folder_class = "page"; + } else { + line_class = "join"; + folder_class = "page"; + } + } + + if(depth==0) line_class = 'line_null'; + + + // html 작성 + var click_str = ' class="'+folder_class+'"' ; + if(hasChild) click_str += ' onclick="blogToggleFolder(\''+zone_id+'\');return false;" '; + + var text_class = "unselected"; + if(selected) text_class = "selected"; + + var document_count_text = ""; + var document_count = getDocumentCount(node_srl); + if(document_count>0) document_count_text = '('+document_count+')'; + + // 왼쪽 폴더/페이지와 텍스트 위치를 맞추기 위해;;; table태그 일단 사용. 차후 바꾸자.. + html += '
'+ + '
'+ + ''+ + '
'+text+''+document_count_text+'
'+ + '
'; + + if(hasChild && child_html) html += child_html; + + html += '
'; + + output.html += html; + + if(expand=="Y") output.expand = "Y"; + } + return output; +} + +// 노드의 폴더 아이콘 클릭시 +function blogToggleFolder(zone_id) { + // 아이콘을 클릭한 대상을 찾아봄 + var child_zone = xGetElementById(zone_id+"_child"); + if(!child_zone) return; + + var line_obj = xGetElementById(zone_id+'_line'); + var folder_obj = xGetElementById(zone_id+'_folder'); + + + // 대상의 자식 노드들이 숨겨져 있다면 열고 아니면 닫기 + if(folder_obj.className == "folder_open") { + child_zone.style.display = "none"; + + if(!line_obj.className.search('null')) { + if(line_obj.className.indexOf('bottom')>0) line_obj.className = 'plus_bottom'; + else line_obj.className = 'plus'; + } + + folder_obj.className = 'folder_close' + } else { + child_zone.style.display = "block"; + + if(!line_obj.className.search('null')) { + if(line_obj.className.indexOf('bottom')>0) line_obj.className = 'minus_bottom'; + else line_obj.className = 'minus'; + } + + folder_obj.className = 'folder_open'; + } +} + +// 노드 클릭시 +function blogSelectNode(url) { + location.href = url; +} diff --git a/modules/blog/skins/cozy_simple/layout.html b/modules/blog/skins/cozy_simple/layout.html new file mode 100644 index 000000000..4605404d0 --- /dev/null +++ b/modules/blog/skins/cozy_simple/layout.html @@ -0,0 +1,170 @@ + + + + + + + + + + + {@$layout_info->colorset = "red"} + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
    +
  • {$lang->cmd_view_message_box}
  • +
  • {$lang->cmd_view_friend}
  • +
  • {$lang->cmd_view_member_info}
  • + +
  • {$lang->cmd_management}
  • + +
+ +
+
+ +
+ + + + +
+
+ + +
+ + my profile image + + + + +
+
{$layout_info->profile}
+
+ + + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ powered by zeroboard XE +
+ +
+ + +
{$content}
+ +
+ +
diff --git a/modules/blog/skins/cozy_simple/list.html b/modules/blog/skins/cozy_simple/list.html new file mode 100644 index 000000000..3f4fb04ad --- /dev/null +++ b/modules/blog/skins/cozy_simple/list.html @@ -0,0 +1,67 @@ + + + + + + + +
+

{$lang->search_result}

+ + "{$search_keyword}" {$lang->search_result} : {$total_count} + +
+ + + + + + + + + + + + + + + + + + + +
{$lang->title}{$lang->readed_count}{$lang->regdate}
{$no} + {$document->getTitleText()} + + [R{$document->getCommentCount()}] + + + [T{$document->getTrackbackCount()}] + + + {$document->get('readed_count')}{$document->getRegdate('Y-m-d')}
+ + + + + + + + + + + + + + diff --git a/modules/blog/skins/cozy_simple/message.html b/modules/blog/skins/cozy_simple/message.html new file mode 100644 index 000000000..00bf01814 --- /dev/null +++ b/modules/blog/skins/cozy_simple/message.html @@ -0,0 +1,11 @@ + + +
+ {$message} +
+ + + {$lang->cmd_login} + + + diff --git a/modules/blog/skins/cozy_simple/screenshot/blue.gif b/modules/blog/skins/cozy_simple/screenshot/blue.gif new file mode 100644 index 000000000..af9f7f695 Binary files /dev/null and b/modules/blog/skins/cozy_simple/screenshot/blue.gif differ diff --git a/modules/blog/skins/cozy_simple/screenshot/bluish_green.gif b/modules/blog/skins/cozy_simple/screenshot/bluish_green.gif new file mode 100644 index 000000000..d2a805bf4 Binary files /dev/null and b/modules/blog/skins/cozy_simple/screenshot/bluish_green.gif differ diff --git a/modules/blog/skins/cozy_simple/screenshot/green.gif b/modules/blog/skins/cozy_simple/screenshot/green.gif new file mode 100644 index 000000000..e88a23d4f Binary files /dev/null and b/modules/blog/skins/cozy_simple/screenshot/green.gif differ diff --git a/modules/blog/skins/cozy_simple/screenshot/pink.gif b/modules/blog/skins/cozy_simple/screenshot/pink.gif new file mode 100644 index 000000000..2a9caf480 Binary files /dev/null and b/modules/blog/skins/cozy_simple/screenshot/pink.gif differ diff --git a/modules/blog/skins/cozy_simple/screenshot/red.gif b/modules/blog/skins/cozy_simple/screenshot/red.gif new file mode 100644 index 000000000..27402a75b Binary files /dev/null and b/modules/blog/skins/cozy_simple/screenshot/red.gif differ diff --git a/modules/blog/skins/cozy_simple/skin.xml b/modules/blog/skins/cozy_simple/skin.xml new file mode 100644 index 000000000..3a881a139 --- /dev/null +++ b/modules/blog/skins/cozy_simple/skin.xml @@ -0,0 +1,158 @@ + + + cozy simple style + Cozyシンプルスタイル + cozy simple style + Cozy样式皮肤 + + (주)NHN + (株)NHN + (株)NHN + NHN Corp + + cozy simple 스킨의 목록형입니다. + 디자인 : 서기정 (http://blog.naver.com/addcozy) + HTML/CSS : 소지훈 + + + Cozyシンプルスキンのリストスタイルです。 + デザイン:ソギジョン(http://blog.naver.com/addcozy) + HTML/CSS:ソジフン + + + This is list style blog of cozy simple skin. + Design : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + Cozy样式目录型皮肤。 + 设计 : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + + + 빨간색(기본) + + Red (default) + 红色(默认) + + + 녹색 + + Green + 绿色 + + + 파란색 + + Blue + 蓝色 + + + 분홍색 + ピンク + Pink + 粉红色 + + + 청록색 + 青緑 + Cyan + 青绿色 + + + + + 상단 제목 + 上段タイトル + 顶部标题 + Top Title + 레이아웃의 상단에 표시할 제목을 입력하세요. + レイアウト上段に表示させるタイトルを入力してください。 + 请输入布局顶部显示的标题。 + Please input title which will be displayed on top of layout. + + + 부제 + サブタイトル + 副标题 + Subtitle + 레이아웃의 상단에 큰 제목 아래 부제목을 입력하세요. + レイアウトの上段にメインタイトルの下のサブタイトルを入力してください。 + 请输入显示在布局顶部主标题下面的副标题。 + Please input subtitle which will be displayed under the top title. + + + 로고이미지 + ロゴイメージ + LOGO图片 + Logo Image + 레이아웃의 상단에 표시될 로고이미지를 입력하세요. + レイアウトの上段に表示されるロゴイメージを入力してください。 + 布局顶部显示的LOGO图片。 + Please input logo image which will be displayed on top of layout. + + + 프로필 이미지 + プロフィールイメージ + 博客个性图片 + Profile Image + 프로필 이미지를 입력해 주세요 (가로 사이즈는 160px이 가장 보기 좋습니다) + プロフィールイメージを入力してください(横幅は「160px」が一番適しています)。 + 请输入博客个性图片。(宽度160px图片为适) + Please input profile image (It is recommended to set width as 160px) + + + 배경 이미지 + 背景イメージ + 背景图片 + Background Image + 배경 이미지를 사용하시려면 등록해주세요. + 背景イメージを使う場合は、登録してください。 + 要想使用背景图片请在这里上传。 + Please input if you want to use background image. + + + 프로필 + プロフィール + 简介 + Profile + 간단한 프로필을 입력해주세요 + 簡単なプロフィールを入力してください。 + 请输入简单介绍。 + Please input your simple profile + + + 카테고리명 + カテゴリ名 + 分类名 + Category + 카테고리의 이름을 입력해주세요. + カテゴリ名を入力してください。 + 请输入分类名。 + Please input the name of category. + + + 글쓴이 표시 + 投稿者表示 + 显示作者 + Display Author + 다수가 블로그를 함께 운영시에 글쓴이의 이름을 표시할 수 있습니다. + 多数の人が一緒に運営している場合、投稿者の名前を表示させることができます。 + 多数人一起管理并使用同一个博客时,可以显示发表文章的作者。 + It can display authors' name when the blog is being administrated by many administrators. + off + on + + + + + 상단 메뉴 + 上段メニュー + 主菜单 + Top Menu + 1 + + + diff --git a/modules/blog/skins/cozy_simple/trackback.html b/modules/blog/skins/cozy_simple/trackback.html new file mode 100644 index 000000000..041158cc0 --- /dev/null +++ b/modules/blog/skins/cozy_simple/trackback.html @@ -0,0 +1,25 @@ + + +
+ + + {@ $idx = 0 } + + +
+ +
+ {htmlspecialchars($val->blog_name)} + + {zdate($val->regdate, "Y.m.d H:i")} + ({$val->ipaddress}) + +
+
+ {@ $idx++} + + +
diff --git a/modules/blog/skins/cozy_simple/view_document.html b/modules/blog/skins/cozy_simple/view_document.html new file mode 100644 index 000000000..fa29547e9 --- /dev/null +++ b/modules/blog/skins/cozy_simple/view_document.html @@ -0,0 +1,126 @@ + + + +
+ + +
+ + +
+
+
+
+

{$oDocument->getTitleText()}

+ |{$category_list[$oDocument->get('category_srl')]->title} +
+ +
+ + {$oDocument->getRegdate('Y.m.d')} {$oDocument->getRegdate('H:i:s')} + + + {$lang->cmd_modify} + {$lang->cmd_delete} + +
+
+ +
+
{$lang->document_url} : {$oDocument->getPermanentUrl()}
+ +
{$lang->trackback_url} : {$oDocument->getTrackbackUrl()}
+ +
+ + +
+
{$oDocument->getNickName()}
+ +
{$oDocument->get('ipaddress')}
+ +
+ +
+ + + + + + + + + + + + + +
{$val->name} + + +
+ + +
{$oDocument->getContent()}
+ +
+ {@ $tag_list = $oDocument->get('tag_list') } + +
+
{$lang->tag}
+ +
+ + + + + +
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + {@ $document_srl = $oDocument->document_srl; } + + + +
diff --git a/modules/blog/skins/cozy_simple/write_form.html b/modules/blog/skins/cozy_simple/write_form.html new file mode 100644 index 000000000..289d37553 --- /dev/null +++ b/modules/blog/skins/cozy_simple/write_form.html @@ -0,0 +1,113 @@ + + + +
+
fileupload)-->enctype="multipart/form-data" class="blogEditor" id="fo_write"> +
+ + + + + +
+ + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+
{$lang->setup}
+ +
+ isNotice())-->checked="checked" id="is_notice" /> + +
+
+ isLocked())-->checked="checked" id="lock_comment" /> + +
+ +
+ isSecret())-->checked="checked" id="is_secret" /> + +
+
+ allowComment())-->checked="checked" id="allow_comment" /> + +
+
+ allowTrackback())-->checked="checked" id="allow_trackback" /> + +
+ +
+ useNotify())-->checked="checked" id="notify_message" /> + +
+ +
+ +
{$editor}
+ +
+ + + +
+ +
+ + +

{$lang->about_tag}

+
+ + + +
+ + + +
+ + + +
+ +
+ {$lang->cmd_preview} + + {$lang->cmd_back} +
+
+
+ diff --git a/modules/blog/skins/default/comment.html b/modules/blog/skins/default/comment.html new file mode 100644 index 000000000..461e5d764 --- /dev/null +++ b/modules/blog/skins/default/comment.html @@ -0,0 +1,63 @@ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->date}{zdate($val->regdate, "Y-m-d H:i:s")}
{$lang->writer}
{htmlspecialchars($val->nick_name)}
{$lang->homepage}{htmlspecialchars($val->homepage)}
{$lang->content}{$val->content}
ipaddress{$val->ipaddress}
{$lang->uploaded_file} + + + +
+ [{$lang->cmd_reply}] + + [{$lang->cmd_modify}] + [{$lang->cmd_delete}] + +
+
+ + + + + + + + diff --git a/modules/blog/skins/default/comment_form.html b/modules/blog/skins/default/comment_form.html new file mode 100644 index 000000000..2506a0652 --- /dev/null +++ b/modules/blog/skins/default/comment_form.html @@ -0,0 +1,77 @@ + + + + + + + + + +
+ + + + + + + + + + + + + + + +
{$lang->date}{$source_comment->regdate}
{$lang->writer}
{htmlspecialchars($source_comment->nick_name)}
{$lang->content}{$source_comment->content}
+
+ + + +
fileupload)-->enctype="multipart/form-data"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->writer}
{$lang->password}
{$lang->email_address}
{$lang->homepage}
+ + + + + +
+
+ + + + diff --git a/modules/blog/skins/default/css/blog_tree_menu.css b/modules/blog/skins/default/css/blog_tree_menu.css new file mode 100644 index 000000000..d2778b438 --- /dev/null +++ b/modules/blog/skins/default/css/blog_tree_menu.css @@ -0,0 +1,102 @@ +#blog_category .title_box { + cursor:pointer; + padding-left:18px; + background:url(../images/tree_menu/folder.gif) no-repeat left; + margin-bottom:3px; +} + +#blog_category .node_item A { + text-decoration:none; +} + +#blog_category .selected { + background-color:#0E078F; + font-weight:bold; + color:#FFFFFF; + font-size:9pt; + cursor:pointer; + padding:1px 2px 1px 2px; +} + +#blog_category .unselected { + background-color:#FFFFFF; + font-weight:normal; + color:#000000; + font-size:9pt; + cursor:pointer; + padding:1px 2px 1px 2px; +} + +#blog_category .document_count { + margin-left:5px; + color:#AAAAAA; + font-size:9px; +} + +#blog_category .page { + cursor:pointer; + background:url(../images/tree_menu/page.gif) no-repeat left; +} + +#blog_category .folder_open { + cursor:pointer; + background:url(../images/tree_menu/page_folder.gif) no-repeat left; +} + +#blog_category .folder_close { + cursor:pointer; + background:url(../images/tree_menu/folder.gif) no-repeat left; +} + +#blog_category .item_open { + display:block; + padding-left:18px; +} + +#blog_category .item_close { + display:none; + padding-left:18px; +} + +#blog_category .line_open { + display:block; + padding-left:18px; + background:url(../images/tree_menu/line.gif) repeat-y left; +} + +#blog_category .line_close { + display:none; + padding-left:18px; + background:url(../images/tree_menu/line.gif) repeat-y left; +} + +#blog_category .plus { + padding-left:18px; + background:url(../images/tree_menu/plus.gif) repeat-y left; +} + +#blog_category .plus_bottom { + padding-left:18px; + background:url(../images/tree_menu/plusbottom.gif) no-repeat left; +} + +#blog_category .minus { + padding-left:18px; + background:url(../images/tree_menu/minus.gif) repeat-y left; +} + +#blog_category .minus_bottom { + padding-left:18px; + background:url(../images/tree_menu/minusbottom.gif) no-repeat left; +} + +#blog_category .join { + padding-left:18px; + background:url(../images/tree_menu/join.gif) repeat-y left; +} + +#blog_category .join_bottom { + padding-left:18px; + background:url(../images/tree_menu/joinbottom.gif) no-repeat left; +} + diff --git a/modules/blog/skins/default/css/layout.css b/modules/blog/skins/default/css/layout.css new file mode 100644 index 000000000..88774b3fd --- /dev/null +++ b/modules/blog/skins/default/css/layout.css @@ -0,0 +1,148 @@ +@charset "utf-8"; + +body { + margin:0px; + padding:0px; +} + +/** + * 블로그 기본 기능 + **/ +.blog_default_menu { + margin:5px 10px 0px 10px; + width:890px; + text-align:right; +} + +/** + * 상단 로고 및 메인 1차 메뉴 + **/ +.layout_top { + margin:10px 10px 0px 10px; + width:890px; +} + +/* 상단 로고 부분 */ +.layout_logo A { + font-weight:bold; + font-size:16pt; + color:#888888; + text-decoration:none; +} + +/* 상단 1차 메뉴 */ +.layout_first_menu { + border-bottom:2px solid #DDDDDD; + width:100%; + text-align:right; + padding:3px 0px 3px 0px; +} + +/** + * 좌측 메뉴 및 메인 2차 메뉴, 로그인 위젯 및 기타 + **/ +.layout_left { + width:220px; + float:left; + margin-top:10px; + position:absolute; + left:10px; + z-index:10; +} + +#blog_category { + padding:10px; + margin-bottom:10px; +} + +/* 컨텐츠 */ +.layout_content { + position:absolute; + left:0px; + padding:10px 10px 0px 240px; + z-index:1; + width:660px; +} + +/* 상단 메뉴 */ +.first_menu { + background-color:#999999; + padding:3px 10px 3px 10px; + margin-left:5px; +} + +.first_menu A { + font-weight:normal; + color:#FFFFFF; + text-decoration:none; +} + +.first_menu_selected { + background-color:#000000; + padding:3px 10px 3px 10px; + margin-left:5px; +} + +.first_menu_selected A { + color:#FFFFFF; + font-weight:bold; + text-decoration:none; +} + +/* 프로필 영역 */ +.layout_profile { + border:2px solid #EEEEEE; + text-align:center; + padding:10px 0px 10px 0px; + margin-bottom:10px; +} + +.layout_profile .profile_image { + margin-bottom:10px; +} + +.layout_profile .profile{ + color:#555555; + text-align:left; + padding:0px 10px 10px 10px; +} + +/* 검색 */ +.layout_search { + border-top:2px solid #EEEEEE; + padding:10px; + margin-bottom:10px; +} + +.layout_search .search_keyword { + border:1px solid #EEEEEE; + width:100px; +} + +.layout_search .search_button { + border:1px solid #AAAAAA; + background-color:#FFFFFF; + width:40px; +} + +/* 좌측 관리자 메뉴 */ +.layout_admin { + border-top:1px solid #EEEEEE; + text-align:center; + padding-top:10px; + margin:10px 5px 0px 10px; +} + +.layout_admin A { + color:#AAAAAA; + text-decoration:none; +} + + +/* 내용 */ +#content { +} + +/* powered by zbxe */ +#poweredbyzbxe { text-align:center; margin-top:2em; } +#poweredbyzbxe img { width:138px; height:35px; border:0;} diff --git a/modules/blog/skins/default/delete_comment_form.html b/modules/blog/skins/default/delete_comment_form.html new file mode 100644 index 000000000..a3ed7cf27 --- /dev/null +++ b/modules/blog/skins/default/delete_comment_form.html @@ -0,0 +1,23 @@ + + + +
+ + + + + + + + + + + + +
{$lang->confirm_delete}
+ + +
+
+ + diff --git a/modules/blog/skins/default/delete_form.html b/modules/blog/skins/default/delete_form.html new file mode 100644 index 000000000..e0890106c --- /dev/null +++ b/modules/blog/skins/default/delete_form.html @@ -0,0 +1,27 @@ + + + +
+ + + + + + + + + + + + + + + +
{$lang->confirm_delete}
{$lang->title}{$oDocument->getTitleText()}
+ + +
+ +
+ + diff --git a/modules/blog/skins/default/delete_trackback_form.html b/modules/blog/skins/default/delete_trackback_form.html new file mode 100644 index 000000000..4ca0aabfc --- /dev/null +++ b/modules/blog/skins/default/delete_trackback_form.html @@ -0,0 +1,23 @@ + + + +
+ + + + + + + + + + + + +
{$lang->confirm_delete}
+ + +
+
+ + diff --git a/modules/blog/skins/default/filter/delete_comment.xml b/modules/blog/skins/default/filter/delete_comment.xml new file mode 100644 index 000000000..86ca3fb71 --- /dev/null +++ b/modules/blog/skins/default/filter/delete_comment.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/blog/skins/default/filter/delete_document.xml b/modules/blog/skins/default/filter/delete_document.xml new file mode 100644 index 000000000..263ca7e86 --- /dev/null +++ b/modules/blog/skins/default/filter/delete_document.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/blog/skins/default/filter/delete_trackback.xml b/modules/blog/skins/default/filter/delete_trackback.xml new file mode 100644 index 000000000..1d8841ba3 --- /dev/null +++ b/modules/blog/skins/default/filter/delete_trackback.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/blog/skins/default/filter/input_password.xml b/modules/blog/skins/default/filter/input_password.xml new file mode 100644 index 000000000..f2d1c0c42 --- /dev/null +++ b/modules/blog/skins/default/filter/input_password.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/blog/skins/default/filter/insert.xml b/modules/blog/skins/default/filter/insert.xml new file mode 100644 index 000000000..3938eaf42 --- /dev/null +++ b/modules/blog/skins/default/filter/insert.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/blog/skins/default/filter/insert_comment.xml b/modules/blog/skins/default/filter/insert_comment.xml new file mode 100644 index 000000000..1a3245e34 --- /dev/null +++ b/modules/blog/skins/default/filter/insert_comment.xml @@ -0,0 +1,28 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/blog/skins/default/footer.html b/modules/blog/skins/default/footer.html new file mode 100644 index 000000000..9d5404ca8 --- /dev/null +++ b/modules/blog/skins/default/footer.html @@ -0,0 +1 @@ +{$module_info->footer_text} diff --git a/modules/blog/skins/default/header.html b/modules/blog/skins/default/header.html new file mode 100644 index 000000000..ea9306d6b --- /dev/null +++ b/modules/blog/skins/default/header.html @@ -0,0 +1,2 @@ + +{$module_info->header_text} diff --git a/modules/blog/skins/default/images/poweredbyzbxe.png b/modules/blog/skins/default/images/poweredbyzbxe.png new file mode 100644 index 000000000..e15f5af89 Binary files /dev/null and b/modules/blog/skins/default/images/poweredbyzbxe.png differ diff --git a/modules/blog/skins/default/images/tree_menu/folder.gif b/modules/blog/skins/default/images/tree_menu/folder.gif new file mode 100644 index 000000000..eb129763d Binary files /dev/null and b/modules/blog/skins/default/images/tree_menu/folder.gif differ diff --git a/modules/blog/skins/default/images/tree_menu/join.gif b/modules/blog/skins/default/images/tree_menu/join.gif new file mode 100644 index 000000000..46162d1f8 Binary files /dev/null and b/modules/blog/skins/default/images/tree_menu/join.gif differ diff --git a/modules/blog/skins/default/images/tree_menu/joinbottom.gif b/modules/blog/skins/default/images/tree_menu/joinbottom.gif new file mode 100644 index 000000000..48b81c80a Binary files /dev/null and b/modules/blog/skins/default/images/tree_menu/joinbottom.gif differ diff --git a/modules/blog/skins/default/images/tree_menu/line.gif b/modules/blog/skins/default/images/tree_menu/line.gif new file mode 100644 index 000000000..96321884d Binary files /dev/null and b/modules/blog/skins/default/images/tree_menu/line.gif differ diff --git a/modules/blog/skins/default/images/tree_menu/minus.gif b/modules/blog/skins/default/images/tree_menu/minus.gif new file mode 100644 index 000000000..2e8a1123d Binary files /dev/null and b/modules/blog/skins/default/images/tree_menu/minus.gif differ diff --git a/modules/blog/skins/default/images/tree_menu/minusbottom.gif b/modules/blog/skins/default/images/tree_menu/minusbottom.gif new file mode 100644 index 000000000..dc3198be2 Binary files /dev/null and b/modules/blog/skins/default/images/tree_menu/minusbottom.gif differ diff --git a/modules/blog/skins/default/images/tree_menu/page.gif b/modules/blog/skins/default/images/tree_menu/page.gif new file mode 100644 index 000000000..42d7318c5 Binary files /dev/null and b/modules/blog/skins/default/images/tree_menu/page.gif differ diff --git a/modules/blog/skins/default/images/tree_menu/page_folder.gif b/modules/blog/skins/default/images/tree_menu/page_folder.gif new file mode 100644 index 000000000..e6d880347 Binary files /dev/null and b/modules/blog/skins/default/images/tree_menu/page_folder.gif differ diff --git a/modules/blog/skins/default/images/tree_menu/plus.gif b/modules/blog/skins/default/images/tree_menu/plus.gif new file mode 100644 index 000000000..c064c11f1 Binary files /dev/null and b/modules/blog/skins/default/images/tree_menu/plus.gif differ diff --git a/modules/blog/skins/default/images/tree_menu/plusbottom.gif b/modules/blog/skins/default/images/tree_menu/plusbottom.gif new file mode 100644 index 000000000..b5671d891 Binary files /dev/null and b/modules/blog/skins/default/images/tree_menu/plusbottom.gif differ diff --git a/modules/blog/skins/default/input_password_form.html b/modules/blog/skins/default/input_password_form.html new file mode 100644 index 000000000..0a26427de --- /dev/null +++ b/modules/blog/skins/default/input_password_form.html @@ -0,0 +1,27 @@ + + + +
+ + + + + + + + + + + + + + + + +
{$lang->msg_input_password}
{$lang->password}
+ + +
+
+ + diff --git a/modules/blog/skins/default/js/blog.js b/modules/blog/skins/default/js/blog.js new file mode 100644 index 000000000..8e1abe354 --- /dev/null +++ b/modules/blog/skins/default/js/blog.js @@ -0,0 +1,99 @@ +/** + * @file modules/blog/js/blog.js + * @author zero (zero@nzeo.com) + * @brief blog 모듈의 javascript + **/ + +/* 글쓰기 작성후 */ +function completeDocumentInserted(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var category_srl = ret_obj['category_srl']; + + alert(message); + + var url = current_url.setQuery('mid',mid).setQuery('document_srl',document_srl).setQuery('act',''); + if(category_srl) url = url.setQuery('category',category_srl); + location.href = url; +} + +/* 글 삭제 */ +function completeDeleteDocument(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var page = ret_obj['page']; + + var url = "./?mid="+mid; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 검색 실행 */ +function completeSearch(fo_obj, params) { + fo_obj.submit(); +} + +// 현재 페이지 reload +function completeReload(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + location.href = location.href; +} + +/* 댓글 글쓰기 작성후 */ +function completeInsertComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var comment_srl = ret_obj['comment_srl']; + + alert(message); + var url = current_url.setQuery('comment_srl','').setQuery('act','').setQuery('rnd',comment_srl); + if(comment_srl) url += '#comment_'+comment_srl; + location.href = url; +} + +/* 댓글 삭제 */ +function completeDeleteComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 트랙백 삭제 */ +function completeDeleteTrackback(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 카테고리 이동 */ +function doChangeCategory(sel_obj, url) { + var category_srl = sel_obj.options[sel_obj.selectedIndex].value; + if(!category_srl) location.href=url; + else location.href=url+'&category='+category_srl; +} diff --git a/modules/blog/skins/default/js/blog_tree_menu.js b/modules/blog/skins/default/js/blog_tree_menu.js new file mode 100644 index 000000000..d4f7bd386 --- /dev/null +++ b/modules/blog/skins/default/js/blog_tree_menu.js @@ -0,0 +1,271 @@ +/** + * @file blog_tree_menu.js + * @author zero (zero@nzeo.com) + * @brief xml파일을 읽어서 트리 메뉴를 그려줌 + * + * common/tpl/tree_menu.js 를 서비스용으로만 사용하기 위해서 수정한 것. + * 관리 기능이 없고 css 적용이 가능 + **/ + +// 폴더를 모두 열고/닫기 위한 변수 설정 +var blog_tree_menu_folder_list = new Array(); + +// 노드의 정보를 가지고 있을 변수 +var blog_node_info_list = new Array(); + +// 카테고리별 문서 수를 가지고 있는 전역 변수 +var category_document_count = new Array(); +var total_document_count = 0; + +// 카테고리의 문서 갯수를 세팅하는 함수 +function setDocumentCount(node_srl, document_count) { + category_document_count[node_srl] = document_count; + total_document_count += document_count; +} + +// 카테고리의 node_srl로 문서 갯수를 리턴하는 함수 +function getDocumentCount(node_srl) { + return parseInt(category_document_count[node_srl],10); +} + +// 트리메뉴의 정보를 담고 있는 xml파일을 읽고 drawTreeMenu()를 호출하는 함수 +function blogLoadTreeMenu(xml_url, title, index_url) { + // 일단 그릴 곳을 찾아서 사전 작업을 함 (그릴 곳이 없다면 아예 시도를 안함) + var zone = xGetElementById("blog_category"); + if(typeof(zone)=="undefined") return; + + // 제목이 없으면 제목을 category로 지정 + if(typeof(title)=="undefined" || !title) title = "category"; + + // index url이 없으면 현재 # 으로 대체 + if(!index_url) index_url= "#"; + + // xml_handler를 이용해서 직접 메뉴 xml파일를 읽음 + if(!xml_url) return; + var oXml = new xml_handler(); + oXml.reset(); + oXml.xml_path = xml_url; + + var param = {"title":title, "index_url":index_url} + + // 요청후 drawTreeMenu()함수를 호출 (xml_handler.js에서 request method를 직접 이용) + oXml.request(blogDrawTreeMenu, oXml, null, null, null, param); +} + +// 트리메뉴 XML정보를 이용해서 정해진 zone에 출력 +var blog_menu_selected = false; +function blogDrawTreeMenu(oXml, callback_func, resopnse_tags, null_func, param) { + var title = param.title; + var index_url = param.index_url; + + var zone = xGetElementById("blog_category"); + var html = ""; + + // 받아온 xml내용을 이용하여 트리 메뉴 그림 + var xmlDoc = oXml.getResponseXml(); + if(!xmlDoc) { + xInnerHtml(zone, html); + return null; + } + + // node 태그에 해당하는 값들을 가져와서 html을 작성 + var node_list = xmlDoc.getElementsByTagName("node"); + if(node_list.length>0) { + var root = xmlDoc.getElementsByTagName("root")[0]; + var output = blogDrawNode(root); + html += output.html; + } + + // 제목 지정 + var title_class = "selected"; + if(blog_menu_selected) title_class = "unselected"; + var title_html = '
'+title+' '; + if(total_document_count) title_html += '('+total_document_count+')'; + html = title_html+'
'+html; + + // 출력하려는 zone이 없다면 load후에 출력하도록 함 + if(!zone) { + xAddEventListener(window, 'load', function() { blogDrawTeeMenu(html); }); + + // 출력하려는 zone을 찾아졌다면 바로 출력 + } else { + xInnerHtml(zone, html); + } + + return null; +} + +// 페이지 랜더링 중에 메뉴의 html이 완성되었을때 window.onload event 후에 그리기 재시도를 하게 될 함수 +function blogDrawTeeMenu(html) { + xInnerHtml("blog_category", html); +} + +// root부터 시작해서 recursive하게 노드를 표혐 +function blogDrawNode(parent_node) { + var output = {html:"", expand:"N"} + + for (var i=0; i< parent_node.childNodes.length; i++) { + var html = ""; + var selected = false; + + // nodeName이 node가 아니면 패스~ + var node = parent_node.childNodes.item(i); + if(node.nodeName!="node") continue; + + // node의 기본 변수들 체크 + var node_srl = node.getAttribute("node_srl"); + var text = node.getAttribute("text"); + var url = node.getAttribute("url"); + var expand = node.getAttribute("expand"); + if(!text) continue; + + // 자식 노드가 있는지 확인 + var hasChild = false; + if(node.hasChildNodes()) hasChild = true; + + // nextSibling가 있는지 확인 + var hasNextSibling = false; + if(i==parent_node.childNodes.length-1) hasNextSibling = true; + + // 후에 사용하기 위해 blog_node_info_list에 node_srl을 값으로 하여 node object 추가 + blog_node_info_list[node_srl] = node; + + // zone_id 값을 세팅 + var zone_id = "blog_category_"+node_srl; + blog_tree_menu_folder_list[blog_tree_menu_folder_list.length] = zone_id; + + var current_category = current_url.getQuery('category'); + if(current_category == node_srl) { + selected = true; + blog_menu_selected = true; + } + + // blog_selected_node이 node_srl과 같으면 펼침으로 처리 + if(selected) expand = "Y"; + + // 아이콘 설정 + var line_class = null; + var folder_class = null; + + // 자식 노드가 있을 경우 자식 노드의 html을 구해옴 + var child_output = null; + var child_html = ""; + + if(hasChild) { + // 자식 노드의 zone id를 세팅 + var child_zone_id = zone_id+"_child"; + blog_tree_menu_folder_list[blog_tree_menu_folder_list.length] = child_zone_id; + + // html을 받아옴 + child_output = blogDrawNode(node); + var chtml = child_output.html; + var cexpand = child_output.expand; + if(cexpand == "Y") expand = "Y"; + + // 무조건 펼침이 아닐 경우 + if(expand!="Y") { + if(!hasNextSibling) child_html += '
'+chtml+'
'; + else child_html += '
'+chtml+'
'; + + // 무조건 펼침일 경우 + } else { + if(!hasNextSibling) child_html += '
'+chtml+'
'; + else child_html += '
'+chtml+'
'; + } + } + + // 자식 노드가 있는지 확인하여 있으면 아이콘을 바꿈 + if(hasChild) { + + // 무조건 펼침이 아닐 경우 + if(expand != "Y") { + if(!hasNextSibling) { + line_class = "minus"; + folder_class = "folder_close"; + } else { + line_class = "minus_bottom"; + folder_class = "folder_close"; + } + // 무조건 펼침일 경우 + } else { + if(!hasNextSibling) { + line_class = "plus"; + folder_class = "folder_open"; + } else { + line_class = "plus_bottom"; + folder_class = "folder_open"; + } + } + + // 자식 노드가 없을 경우 + } else { + if(hasNextSibling) { + line_class = "join_bottom"; + folder_class = "page"; + } else { + line_class = "join"; + folder_class = "page"; + } + } + + + // html 작성 + var click_str = ' class="'+folder_class+'"' ; + if(hasChild) click_str += ' onclick="blogToggleFolder(\''+zone_id+'\');return false;" '; + + var text_class = "unselected"; + if(selected) text_class = "selected"; + + var document_count_text = ""; + var document_count = getDocumentCount(node_srl); + if(document_count>0) document_count_text = '('+document_count+')'; + + // 왼쪽 폴더/페이지와 텍스트 위치를 맞추기 위해;;; table태그 일단 사용. 차후 바꾸자.. + html += '
'+ + '
'+ + ''+ + '
'+text+''+document_count_text+'
'+ + '
'; + + if(hasChild && child_html) html += child_html; + + html += '
'; + + output.html += html; + + if(expand=="Y") output.expand = "Y"; + } + return output; +} + +// 노드의 폴더 아이콘 클릭시 +function blogToggleFolder(zone_id) { + // 아이콘을 클릭한 대상을 찾아봄 + var child_zone = xGetElementById(zone_id+"_child"); + if(!child_zone) return; + + var line_obj = xGetElementById(zone_id+'_line'); + var folder_obj = xGetElementById(zone_id+'_folder'); + + // 대상의 자식 노드들이 숨겨져 있다면 열고 아니면 닫기 + if(folder_obj.className == "folder_open") { + child_zone.style.display = "none"; + + if(line_obj.className.indexOf('bottom')>0) line_obj.className = 'plus_bottom'; + else line_obj.className = 'plus'; + + folder_obj.className = 'folder_close' + } else { + child_zone.style.display = "block"; + + if(line_obj.className.indexOf('bottom')>0) line_obj.className = 'minus_bottom'; + else line_obj.className = 'minus'; + + folder_obj.className = 'folder_open'; + } +} + +// 노드 클릭시 +function blogSelectNode(url) { + location.href = url; +} diff --git a/modules/blog/skins/default/layout.html b/modules/blog/skins/default/layout.html new file mode 100644 index 000000000..60f9a877f --- /dev/null +++ b/modules/blog/skins/default/layout.html @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + {@ $class_name = 'first_menu_selected'} + + {@ $class_name = 'first_menu'} + + + + onclick="window.open(this.href);return false;">{$val['text']} + + + + + +
+
+ + +
+ + +
+ +
+ profile image +
+ + + +
+ {$layout_info->profile} +
+ + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ powered by zeroboard XE +
+ +
+ + +
+
{$content}
+
+ diff --git a/modules/blog/skins/default/list.html b/modules/blog/skins/default/list.html new file mode 100644 index 000000000..49fc307fb --- /dev/null +++ b/modules/blog/skins/default/list.html @@ -0,0 +1,53 @@ + + + +
+ + + + + + + +
+ + [{$oDocument->getRegdate("Y-m-d")}] {$oDocument->getTitleText()} + + + ({number_format($oDocument->getCommentCount())}) + + + ({number_format($oDocument->getTrackbackCount())}) +
+ + + + + + + + + {$lang->no_documents} + +
+ + + + +
+ [{$lang->first_page}] + + + + {$page_no} + + [{$page_no}] + + + + [{$lang->last_page}] +
+ + + + diff --git a/modules/blog/skins/default/message.html b/modules/blog/skins/default/message.html new file mode 100644 index 000000000..00bf01814 --- /dev/null +++ b/modules/blog/skins/default/message.html @@ -0,0 +1,11 @@ + + +
+ {$message} +
+ + + {$lang->cmd_login} + + + diff --git a/modules/blog/skins/default/skin.xml b/modules/blog/skins/default/skin.xml new file mode 100644 index 000000000..aeb86e4ee --- /dev/null +++ b/modules/blog/skins/default/skin.xml @@ -0,0 +1,98 @@ + + + 블로그 기본 스킨 + ブログ基本スキン + 博客默认皮肤 + Default Skinf of Blog + + 제로 + Zero + zero + zero + blog 모듈의 default스킨 + ブログ(blog)モジュールのデフォルトスキン + 博客模块的默认皮肤 + default skin of blog module + + + + 기본 + 기본 + 默认 + Default + + + + + 상단 제목 + 上段タイトル + 顶部标题 + Top Title + 레이아웃의 상단에 표시할 제목을 입력하세요. + レイアウト上段に表示させるタイトルを入力してください。 + 请输入布局顶部显示的标题。 + Please input title which will be displayed on top of layout. + + + 로고이미지 + ロゴイメージ + LOGO图片 + Logo Image + 레이아웃의 상단에 표시될 로고이미지를 입력하세요. + レイアウトの上段に表示されるロゴイメージを入力してください。 + 请输入顶部显示的LOGO图片。 + Please input logo image which will be displayed on top of layout. + + + 프로필 이미지 + プロフィールイメージ + 博客个性图片 + Profile Image + 프로필 이미지를 입력해 주세요 (가로 사이즈는 200px이 가장 보기 좋습니다) + プロフィールイメージを入力してください(横幅は「200px」が一番適しています)。 + 请输入博客个性图片。 (宽度200px图片为适) + Please input profile image (It is recommended to set width as 200px) + + + 프로필 + プロフィール + 简介 + Profile + 간단한 프로필을 입력해주세요 + 簡単なプロフィールを入力してください。 + 请输入简单介绍。 + Please input your simple profile + + + 카테고리명 + カテゴリ名 + 分类名 + Category + 카테고리의 이름을 입력해주세요. + カテゴリ名を入力してください。 + 请输入分类名。 + Please input the name of category. + + + 글쓴이 표시 + 投稿者表示 + 显示作者姓名 + Show Writer + 다수가 블로그를 함께 운영시에 글쓴이의 이름을 표시할 수 있습니다. + 多数の人が一緒に運営している場合、投稿者の名前を表示させることができます。 + 多数人一起管理博客时可以显示发表文章的作者。 + It can display authors' name when the blog is being administrated by many administrators. + off + on + + + + + 상단 메뉴 + 上段メニュー + 主菜单 + Top Menu + 1 + + + diff --git a/modules/blog/skins/default/trackback.html b/modules/blog/skins/default/trackback.html new file mode 100644 index 000000000..a6b647a14 --- /dev/null +++ b/modules/blog/skins/default/trackback.html @@ -0,0 +1,38 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->title}{$val->title}
{$lang->date}{zdate($val->regdate, "Y-m-d H:i:s")}
{$lang->blog_name}{$val->blog_name}
{$lang->excerpt}{nl2br($val->excerpt)}
ipaddress{$val->ipaddress}
+ [{$lang->cmd_delete}] +
+
+ + + diff --git a/modules/blog/skins/default/view_document.html b/modules/blog/skins/default/view_document.html new file mode 100644 index 000000000..a9bc50c05 --- /dev/null +++ b/modules/blog/skins/default/view_document.html @@ -0,0 +1,96 @@ + +
+ +
+
+ + [{$category_list[$oDocument->get('category_srl')]->title}] + + + {$oDocument->getTitleText()} +
+
+ +
+
+ {$oDocument->getRegdate('Y.m.d')} {$oDocument->getRegdate('H:i:s')} + + {$oDocument->getNickName()} + +
+ +
+ + +
{$oDocument->getContent()}
+ +
+ {$lang->document_url} : {$oDocument->getPermanentUrl()} +
+ +
+ {@ $tag_list = $oDocument->get('tag_list') } + +
+ + {@ $tag = $tag_list[$i]; } + {$lang->tag} : + + +
+ + + +
+ {$lang->trackback_url} : {$oDocument->getTrackbackUrl()} +
+ +
+ + +
+
{$lang->uploaded_file}
+
+ {@ $uploaded_list = $oDocument->getUploadedFiles() } + + {$file->source_filename} ({FileHandler::filesize($file->file_size)}) ({number_format($file->download_count)}) + +
+
+ + + {$lang->cmd_print} +
+ + + + + + + + + + + + + + + + + + {@ $document_srl = $oDocument->document_srl; } + + diff --git a/modules/blog/skins/default/write_form.html b/modules/blog/skins/default/write_form.html new file mode 100644 index 000000000..089b52c4e --- /dev/null +++ b/modules/blog/skins/default/write_form.html @@ -0,0 +1,104 @@ + + + +
fileupload)-->enctype="multipart/form-data"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->category} + +
{$lang->writer}
{$lang->password}
{$lang->email_address}
{$lang->homepage}
{$lang->title}
+ + isNotice())-->checked="checked" id="is_notice" /> + + + + isSecret())-->checked="checked" id="is_secret" /> + + + allowComment())-->checked="checked" id="allow_comment" /> + + + isLocked())-->checked="checked" id="lock_comment" /> + + + allowTrackback())-->checked="checked" id="allow_trackback" /> + +
{$editor}
{$lang->cmd_send_trackback} + + +
{$lang->tag} +
+ {$lang->about_tag} +
+ + +
+ +
+ + diff --git a/modules/blog/skins/xe_blog/comment.html b/modules/blog/skins/xe_blog/comment.html new file mode 100644 index 000000000..c1843601e --- /dev/null +++ b/modules/blog/skins/xe_blog/comment.html @@ -0,0 +1,58 @@ + + + + + + + + + + diff --git a/modules/blog/skins/xe_blog/comment_form.html b/modules/blog/skins/xe_blog/comment_form.html new file mode 100644 index 000000000..93119a91a --- /dev/null +++ b/modules/blog/skins/xe_blog/comment_form.html @@ -0,0 +1,68 @@ + + + + + + + + + +
    +
  • +
    {htmlspecialchars($source_comment->nick_name)}
    +
    + {zdate($source_comment->regdate, "Y.m.d H:i")} + + ({$source_comment->ipaddress}) + +
    + +
    + {$source_comment->content} +
    +
  • +
+ + + +
+ +
fileupload)-->enctype="multipart/form-data" class="blogEditor" > +
+ + + + + + +
+ + + + + + + + + + + +
+ + +
+ +
+ +
+
+ +
+ + +
+
+ + + + diff --git a/modules/blog/skins/xe_blog/css/blog_tree_menu.css b/modules/blog/skins/xe_blog/css/blog_tree_menu.css new file mode 100644 index 000000000..2bf3e4a1f --- /dev/null +++ b/modules/blog/skins/xe_blog/css/blog_tree_menu.css @@ -0,0 +1,88 @@ + +#blog_category .title_box { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; } + +#blog_category .category_list { padding:.8em 0 .8em 0; } + +#blog_category .node_item a { color:#6b6b6b; } + +#blog_category .selected { font-weight:bold; cursor:default; font-size:1em; color:#54564b; } + +#blog_category .unselected { cursor:pointer; font-size:1em; color:#54564b; } + +#blog_category .document_count { + margin-left:5px; + color:#AAAAAA; + font-size:.8em; +} + +#blog_category .page { + cursor:pointer; + background:url(../images/common/iconList.gif) no-repeat left; +} + +#blog_category .folder_open { + cursor:pointer; + background:url(../images/common/iconFolderClose.gif) no-repeat left; +} + +#blog_category .folder_close { + cursor:pointer; + background:url(../images/common/iconFolderClose.gif) no-repeat left; +} + +#blog_category .item_open { + display:block; + padding-left:18px; +} + +#blog_category .item_close { + display:none; + padding-left:18px; +} + +#blog_category .line_null { + padding-left:13px; +} + +#blog_category .line_open { + display:block; + padding-left:18px; + /*background:url(../images/tree_menu/line.gif) repeat-y left;*/ +} + +#blog_category .line_close { + display:none; + padding-left:18px; + /*background:url(../images/tree_menu/line.gif) repeat-y left;*/ +} + +#blog_category .plus { + padding-left:18px; + /*background:url(../images/tree_menu/plus.gif) repeat-y left;*/ +} + +#blog_category .plus_bottom { + padding-left:18px; + /*background:url(../images/tree_menu/plusbottom.gif) no-repeat left;*/ +} + +#blog_category .minus { + padding-left:18px; + /*background:url(../images/tree_menu/minus.gif) repeat-y left;*/ +} + +#blog_category .minus_bottom { + padding-left:18px; + /*background:url(../images/tree_menu/minusbottom.gif) no-repeat left;*/ +} + +#blog_category .join { + padding-left:18px; + /*background:url(../images/tree_menu/join.gif) repeat-y left;*/ +} + +#blog_category .join_bottom { + padding-left:18px; + /*background:url(../images/tree_menu/joinbottom.gif) no-repeat left;*/ +} + diff --git a/modules/blog/skins/xe_blog/css/common.css b/modules/blog/skins/xe_blog/css/common.css new file mode 100644 index 000000000..bfdd3eb3c --- /dev/null +++ b/modules/blog/skins/xe_blog/css/common.css @@ -0,0 +1,287 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ +.gap1 { margin-top:.8em; } +.commentButton { margin:.8em 0 .8em 0; } + +/* pathNavigation */ +.pathNavigation { background:url(../images/common/bullet_3x3_d8d8d8.gif) no-repeat left .4em; padding:0 0 0 .5em; color:#999999; margin:0 0 1.5em 0;} +.pathNavigation * { font-size:.9em;} +.pathNavigation a { color:#999999;} +.pathNavigation strong { color:#666666;} + +.blogHeader2 { width:100%; overflow:hidden; padding:1em 0 1em 0; color:#444444;} +.blogHeader2 h3 { float:left; font-size:1.4em; padding-left:1.2em; background:url(../images/common/iconH3.gif) no-repeat .5em center;} +.blogHeader2 .info { float:right; position:relative; top:.4em;} +.blogHeader2 .info q { quotes:none; font-weight:bold;} +.blogHeader2 .info strong { font:bold .9em Tahoma; color:#ff6600;} + +/* blogComment */ +.blogComment { color:#AEAEAE; position:relative; border:1px solid #DDDDDD; overflow:hidden;padding:.8em; margin-top:.4em;} +.blogComment a { color:#f38d2a; text-decoration:none; border-bottom:1px dotted #f38d2a;} + +/* blogInformation */ +.blogInformation { width:100%; clear:both; margin:1em 0 .5em 0; overflow:hidden; color:#666666;} + +.accountNavigation { float:right; overflow:hidden;} +.accountNavigation li { float:left; padding:0 .5em 0 .6em; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left .4em; list-style:none;} +.accountNavigation li a { font-size:11px; white-space:nowrap; color:#666666; text-decoration:none;} +.accountNavigation li.rss { background:none; padding-top:.4em;} +.accountNavigation li.join { background:none; padding-top:.4em;} +.accountNavigation li.myInfo { padding-top:.4em; background:none;} +.accountNavigation li.admin { padding-top:.4em;} +.accountNavigation li.admin a { display:block; background:url(../images/common/iconAdmin.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.setup { padding-top:.4em;} +.accountNavigation li.setup a { display:block; background:url(../images/common/iconSetup.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.loginAndLogout { background:none; padding-left:0;} + +/* blogList */ +.blogList { width:100%; position:relative; border:1px solid #e0e1db;} +.blogList tr.notice { background:#f8f8f8;} +.blogList tr.notice .num { font-size:.9em; font-weight:bold;} +.blogList tr.bg1 { background:#ffffff} +.blogList tr.bg2 { background:#fbfbfb;} +.blogList th a { color:#3e3f3e; text-decoration:none; } +.blogList th.num { background-position:-3px bottom; border-left:1px solid #ffffff; } +.blogList th.title.first-child { background-position:-3px bottom;} +.blogList th.title { text-align:center; } +.blogList th.category { text-align:left; } +.blogList th.title select { vertical-align:middle; margin-left:.5em; } +.blogList th.reading { white-space:nowrap;} +.blogList th.recommend { white-space:nowrap;} +.blogList th.date { border-right:1px solid #ffffff;} +.blogList th .sort { padding:0 .2em; vertical-align:middle;} +.blogList td { border-top:1px solid #eff0ed; padding:.5em;} +.blogList td.num { font:.8em tahoma; color:#999999; padding:.5em 1em; text-align:center;} +.blogList tr.notice td.num { padding:.5em; white-space:nowrap;} +.blogList td.thumb { padding:.5em 0 .5em .5em; width:145px; table-layout:fixed; white-space:nowrap;} +.blogList td.thumb * { vertical-align:middle;} +.blogList td.title {padding-left:1em; } +.blogList td.title strong.category { font-size:1em; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat right 3px; padding-right:.5em; margin-right:.5em;} +.blogList td.title.bold { font-size:1.2em; font-weight:bold;} +.blogList td.title.bold a { position:relative; top:.3em;} +.blogList td.title * { vertical-align:middle;} +.blogList td.title, +.blogList td.title a { color:#444444; text-decoration:none;} +.blogList td.title a:visited { color:#777777;} +.blogList td.author { color:#333333; font-size:.95em; padding-left:1em;} +.blogList td.author a { font-size:1em; color:#333333;} +.blogList td.reading { font:.8em Tahoma; color:#999999; text-align:center;} +.blogList td.date { font:.8em Tahoma; color:#999999; text-align:center; white-space:nowrap;} +.blogList td.summary { border-top:none; vertical-align:top; color:#666666; line-height:1.25em;} +.blogList td.summary a { color:#666666; text-decoration:none; line-height:inherit;} +.blogList td.summary a:visited { color:#999999;} +.blogList td input { _margin:-3px;} +.blogList td .replyAndTrackback img.trackback { margin-bottom:-.1em;} +.blogList td .replyAndTrackback strong { font:bold 1em Tahoma;} +.blogList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#ff6600; position:relative; top:.3em;} +.blogList td .replyAndTrackback strong { font:bold 1em Tahoma;} + +.blogList td .thumbnailSmall { margin:0 .3em 0 .3em;} +.blogList td .thumbnailSmall img { border:1px solid #bcbdb6;} +.blogList td .thumbnailMedium { margin:0 .3em 0 .3em;} +.blogList td .thumbnailMedium img { border:1px solid #e0e1db; padding:3px;} + +.blogList.thumbnail { margin-top:-1px; border-bottom:none;} +.blogList.thumbnail td { border-top:none; border-bottom:1px solid #eff0ed; padding:1.5em 0 0 1.5em; overflow:hidden;} +.blogList.thumbnail div.cell { float:left; width:130px; margin:0 1.5em 0 0; padding-bottom:1.5em;} +.blogList.thumbnail div.cell img.thumb { padding:2px; border:1px solid #e0e1db; display:block; margin-bottom:1em;} +.blogList.thumbnail div.title { color:#444444; margin-bottom:.2em; padding-left:3px;} +.blogList.thumbnail div.title a { color:#444444;} +.blogList.thumbnail div.nameAndDate { font-size:.9em; color:#999999; margin-bottom:.2em; padding-left:3px;} +.blogList.thumbnail div.nameAndDate a { color:#999999;} +.blogList.thumbnail div.nameAndDate .date { font:.8em Tahoma; color:#999999;} +.blogList.thumbnail div.readAndRecommend { font-size:.9em; color:#666666; padding-left:3px;} +.blogList.thumbnail div.readAndRecommend .num { font:.8em Tahoma;} +.blogList.thumbnail div.readAndRecommend .vr { color:#dddddd;} +.blogList.thumbnail div.readAndRecommend strong.num { font:bold .8em Tahoma; color:#ff6600;} + +/* pageNavigation */ +.pageNavigation { display:block; padding:1.5em 0 2em 0; text-align:center; font:bold .8em Tahoma; } +.pageNavigation a { position:relative; margin-left:-4px; font:bold 1em Tahoma; color:#666666; display:inline-block; padding:1px 7px 2px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } +.pageNavigation a:hover { background:#F7F7F7; text-decoration:none; } +.pageNavigation a:visited { color:#999999;} +.pageNavigation a.goToFirst, +.pageNavigation a.goToLast { border:none; border-right:1px solid #ffffff; border-left:1px solid #ffffff; z-index:99; vertical-align:top; padding:0px 7px 4px 6px;} +.pageNavigation a.goToFirst img, +.pageNavigation a.goToLast img { display:inline-block; padding:2px 0; position:relative; top:2px; _top:1px;} + +.blogRead .dateAndModify { float:right; white-space:nowrap;} +.blogRead .dateAndModify { font-size:.8em; color:#999999; float:left; position:relative; top:.3em;} +.blogRead .dateAndModify strong { font-size:1em; font-family:Tahoma;} +.blogRead .dateAndModify ul { display:inline;} +.blogRead .dateAndModify ul li { float:left; margin-left:.3em; list-style:none;} + +/* extraVars list */ +.extraVarsList { width:100%; border:1px solid #e0e1db; clear:both; margin-bottom:1em;} +.extraVarsList tr.notice { background:#f8f8f8;} +.extraVarsList tr.notice .num { font-size:.9em; font-weight:bold;} +.extraVarsList tr.bg1 { background:#ffffff} +.extraVarsList tr.bg2 { background:#fbfbfb;} +.extraVarsList th { color:#3e3f3e; font-weight:bold; padding:.8em .5em .5em .5em; border-bottom:1px solid #eff0ed; border-right:1px solid #eff0ed;} +.extraVarsList td { border-bottom:1px solid #eff0ed; padding:.5em .5em .5em 1em;} + +/* blogSearch */ +.blogSearch { text-align:center; clear:both; width:100%;} +.blogSearch fieldset { border:none; display:inline; overflow:visible; position:relative;} +.blogSearch fieldset legend { overflow:hidden; width:1px; height:1px; font-size:.001em;} +.blogSearch * { vertical-align:middle;} +.blogSearch select { float:left;} +.blogSearch input { float:left; margin:0 .3em; background:#fbfbfb;} +.searchButton ul { overflow:hidden;} +.searchButton li { float:left; margin-right:.3em; list-style:none;} + +/* blogRead */ +.blogRead { position:relative; _width:100%; margin:0 0 0 0; border:1px solid #e0e1db;} +.blogRead .originalContent { padding:2em 1.2em 2em 1.2em;} +.blogRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:1px solid #eff0ed; overflow:hidden;} + +.blogRead .titleAndCategory { float:left;} +.blogRead .titleAndCategory h4 { font-size:1.4em; display:inline; padding-left:.2em;} +.blogRead .titleAndCategory .vr { font-size:.9em; margin:0 .3em; color:#c5c7c0;} +.blogRead .titleAndCategory .cotegory { font-size:.9em; color:#999999; white-space:nowrap;} + +.blogRead .dateAndModify { float:right; white-space:nowrap;} +.blogRead .dateAndModify .num { font-size:.9em; font-family:Tahoma; color:#999999; margin-right:.5em; float:left; position:relative; top:.3em;} +.blogRead .dateAndModify .num strong { font-size:1em; font-family:Tahoma;} +.blogRead .dateAndModify ul { display:inline;} +.blogRead .dateAndModify ul li { float:left; margin-left:.3em;} + +.blogRead ul.uri { overflow:hidden; margin:0 0 2em .3em; float:right; clear:left;} +.blogRead ul.uri li { font-size:8pt; color:#c5c7c0; } + +.blogRead .userInfo { float:left; white-space:nowrap;} +.blogRead .userInfo .author { padding:0 .3em 0 0; color:#3074a5; margin-right:.3em;} +.blogRead .userInfo .ipaddress { font-size:.9em; font-family:Tahoma; color:#888888; margin-right:.5em; } + +.blogRead .contentBody { width:100%; overflow:hidden; } +.blogRead .readBody { padding:0 .3em; color:#555555; overflow:hidden; margin-bottom:2em; clear:both; } +.blogRead .readBody p { margin:1em 0; line-height:1.5em;} +.blogRead .readBody .alignLeft { float:left; margin:0 1em 1em 0; } +.blogRead .readBody .alignRight { float:right; margin:0 0 1em 1em; } +.blogRead .readBody .valignCenter { vertical-align:middle;} +.blogRead .readBody .clearBoth { display:block; margin:0 0 1em 0;} +.blogRead .readFooter { padding:0 .3em;} +.blogRead .readFooter .tag { margin-bottom:1em;} +.blogRead .readFooter .tag h5 { display:inline; font-size:1em; margin-right:.5em;} +.blogRead .readFooter .tag ul, +.blogRead .readFooter .tag li { display:inline;} +.blogRead .readFooter .tag a { color:#444444;} +.blogRead .readFooter .tag .tagIcon { vertical-align:middle;} +.blogRead .readFooter .fileAttached { _width:100%; border:1px solid #eaeae7; overflow:hidden; background:#fbfbfb;} +.blogRead .readFooter .fileAttached h5 { font-weight:normal; color:#999999; float:left; font-size:1em; margin:.5em .5em 0 .5em; line-height:1.5em;} +.blogRead .readFooter .fileAttached ul { float:left; margin-top:.5em; padding-bottom:1em; } +.blogRead .readFooter .fileAttached li { display:inline; margin-right:.75em; line-height:1.5em;} +.blogRead .readFooter .fileAttached li a:visited { color:#777777;} + +.blogRead .replyAndTrackback li { margin-left:1em; padding-left:1.4em; float:left; list-style:none;} + +.blogRead .replyAndTrackback li.reply { background:url(../images/common/iconReply.gif) no-repeat left top;} +.blogRead .replyAndTrackback li.reply a { position:relative; top:-.3em; _top:-.6em;} + +.blogRead .replyAndTrackback li.trackback { background:url(../images/common/iconTrackback.gif) no-repeat left top;} +.blogRead .replyAndTrackback li.trackback a { position:relative; top:-.3em; _top:0em;} + +.blogRead .replyAndTrackback a { color:#333333; white-space:nowrap; text-decoration:none;} +.blogRead .replyAndTrackback a#toggleReply { background:url(../images/common/buttonToggleReply.gif) no-repeat right top;} +.blogRead .replyAndTrackback a#toggleTrackback { background:url(../images/common/buttonToggleReply.gif) no-repeat right -13px;} + +.blogRead .replyAndTrackback .listButton { float:right; margin:0 1em 0 0; position:relative; top:-5px; _top:-7px;} + +#trackbacks { padding:.6em .6em; color:#666666; border:1px solid #e0e1db;;margin-top:.5em;} +#trackbacks li { padding:.6em .8em .6em .6em; line-height:1.25em; border-bottom:1px dotted #EEEEEE; list-style:none;} +#trackbacks p { display:inline; margin-bottom:1em;} +#trackbacks a { color:#666666; text-decoration:none;} +#trackbacks div { clear:both; } +#trackbacks address { display:block; padding:0 .3em 0 0; } +#trackbacks address a { font-size:.9em; color:#3074a5; margin-right:.3em; float:left;} +#trackbacks address .date { font:.8em Tahoma; color:#cccccc; float:right;} + +ul.replyZone { padding:.6em .6em; color:#666666; border:1px solid #e0e1db; margin-top:.5em;} +ul.replyZone li { padding:.6em .8em .6em .6em; line-height:1.25em; clear:both; border-bottom:1px dotted #EEEEEE;} +ul.replyZone p { display:inline; margin-bottom:1em;} +ul.replyZone .author { float:left; padding:0 .3em 0 0; font-size:.9em; color:#3074a5; margin:0 .3em .5em 0;} +ul.replyZone .author a { font-size:.9em; color:#3074a5; margin-right:.3em;} +ul.replyZone .date { float:right; font:.8em Tahoma; color:#cccccc; margin:.3em 0 .5em 0;} + +ul.replyZone .replyOption { float:right; white-space:nowrap; margin-left:.2em;} +ul.replyZone .replyOption img { vertical-align:middle;} + +ul.replyZone .replyContent { clear:left; } +ul.replyZone .reply { background-color:#FAFAFA;} +ul.replyZone .replyIndent { background:url(../images/common/iconReplyArrow.gif) no-repeat .0em .3em; padding-left:1.3em;} + + +#reply { padding:.6em .6em; color:#666666; border:1px solid #e0e1db; margin-top:.5em;} +#reply li { padding:.6em .8em .6em .6em; line-height:1.25em; clear:both; border-bottom:1px dotted #EEEEEE; list-style:none;} +#reply p { display:inline; margin-bottom:1em;} +#reply .author { float:left; padding:0 .3em 0 0; font-size:.9em; color:#3074a5; margin:0 .3em .5em 0;} +#reply .author a { font-size:.9em; color:#3074a5; margin-right:.3em;} +#reply .date { float:right; font:.8em Tahoma; color:#cccccc; margin:.3em 0 .5em 0;} + +#reply .replyOption { float:right; white-space:nowrap; margin-left:.2em;} +#reply .replyOption img { vertical-align:middle;} + +#reply .replyContent { clear:left; } +#reply .reply { background-color:#FAFAFA;} +#reply .replyIndent { background:url(../images/common/iconReplyArrow.gif) no-repeat .0em .3em; padding-left:1.3em;} + +#reply li .fileAttached { _width:100%; border:1px solid #eaeae7; overflow:hidden; background:#fbfbfb; margin-top:.3em; list-style:none;} +#reply li .fileAttached ul { float:left; padding:.3em 1em .2em 0; margin-left:.5em; _margin-left:.25em;} +#reply li .fileAttached li a { font-size:.9em; white-space:nowrap; position:relative; color:#444444; } +#reply li .fileAttached li a:visited { color:#777777;} + +/* blogEditor */ +.blogEditor { padding:.5em 0 1em 0; width:100%; overflow:hidden;} +.blogEditor.reply { padding:.5em 1em 1em 1em; width:auto; overflow:hidden;} +.blogEditor legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em;} +.blogEditor fieldset { _width:100%; border:1px solid #eaeae7; } +.blogEditor .userNameAndPw { position:relative; background:#fbfbfb; border-top:1px solid #eaeae7; border-bottom:1px solid #e1e1e1; padding:.5em 1em; white-space:nowrap;} +.blogEditor .userNameAndPw * { vertical-align:middle;} +.blogEditor .userNameAndPw label { margin-right:.2em; color:#666760;} +.blogEditor .userNameAndPw input { color:#aaaaaa;} +.blogEditor .userNameAndPw .userName { width:6em; margin-right:.8em;} +.blogEditor .userNameAndPw .userPw { width:5em;} +.blogEditor .userNameAndPw .emailAddress { width:6em;} +.blogEditor .userNameAndPw .homePage { width:6em;} +.blogEditor .userNameAndPw .checkSecret { position:absolute; right:2em; top:.7em;} +.blogEditor .buttonReply { position:relative; float:left; left:50%; margin:.5em 0 0 -2em; _padding-bottom:1em;} +.blogEditor .commentForm { width:100%; padding-bottom:.5em;} +.blogEditor .commentForm textarea { width:632px; margin:.3em; height:100px;} + + +/* blogWrite */ +.blogWrite { width:100%; position:relative;} +.blogWrite .userNameAndPw { margin-bottom:-1px;} +.blogWrite .blogEditor fieldset { width:auto; position:relative;} +.blogWrite div.title { border-bottom:1px solid #eff0ed; border-top:1px solid #eff0ed; padding:.5em 0; white-space:nowrap;} +.blogWrite div.title label.title { display:block; float:left; font-weight:bold; padding:.4em 0 0 1.5em; width:8em; white-space:nowrap;} +.blogWrite div.title input#title { width:60%;} +.blogWrite .option { border-bottom:1px solid #e1e1e1; padding:.5em 0; overflow:hidden; width:100%;} +.blogWrite .option dt { display:block; float:left; font-weight:bold; padding:.3em 0 0 1.5em; width:8em; white-space:nowrap;} +.blogWrite .option dd { float:left; margin-right:1em; padding-top:.2em; _padding-top:.1em;} +.blogWrite .option dd * { vertical-align:middle;} +.blogWrite .inputTypeText { background:#fbfbfb;} +.blogWrite .trackbackURI { clear:both; border-top:1px solid #eff0ed; padding:4px 0 .8em 0;} +.blogWrite .trackbackURI label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.blogWrite .trackbackURI .inputTypeText { width:50%;} +.blogWrite .tag { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;} +.blogWrite .tag label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.blogWrite .tag .inputTypeText { width:50%;} +.blogWrite .tag .help { vertical-align:middle;} +.blogWrite .tag .info { padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;} +.blogWrite .extra_vars { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;} +.blogWrite .extra_vars label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.blogWrite .extra_vars .info { clear:both; padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;} +.blogWrite .extra_vars ul li { float:left; margin-right:1em; } + +.smallBox { border:1px solid #e0e1db; margin:5em auto 1em auto;} +.smallBox.w268 { width:268px;} +.smallBox .header { position:relative; _width:100%; background:#ffffff url(../images/normal/bgH3.gif) no-repeat left bottom; overflow:hidden;} +.smallBox .header h3 { clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border-bottom:3px solid #fe3614; } +.smallBox .complex { padding:1.5em 2em 2em 2em;} +.smallBox .inputPassword { position:relative; border:none; padding:2em 2em 1.5em 2em;} +.smallBox .inputPassword .inputTypeText { float:left; margin-right:.5em; width:8em;} +.smallBox .inputPassword legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} diff --git a/modules/blog/skins/xe_blog/css/cyan.css b/modules/blog/skins/xe_blog/css/cyan.css new file mode 100644 index 000000000..b257b5a74 --- /dev/null +++ b/modules/blog/skins/xe_blog/css/cyan.css @@ -0,0 +1,41 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +#blog_category { position:relative; border:1px solid #e0e1db; background:url(../images/cyan/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +.boxTypeB { position:relative; border:1px solid #e0e1db; background:url(../images/cyan/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em;} +#bodyWrap #header #globalNavigation li.on a { color:#2895c0;} + +#bodyWrap #accountNavigation li { float:left; margin-right:-1px; background:url(../images/cyan/blogHeaderVr.gif) no-repeat right center;} +#bodyWrap #header { clear:both; height:9.5em; margin:10px 10px .5em 10px; border:1px solid #e0e1dc; border-bottom:none; background:#fbfbfb url(../images/cyan/blogHeaderLine.gif) no-repeat left bottom; overflow:hidden;} + +/* blogHeader */ +.blogHeader { position:relative; _width:100%; border-top:1px solid #d1d9db; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} +.blogHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d1d9db; border-bottom:3px solid #2895c0; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.accountNavigation li.join a { display:block; background:url(../images/cyan/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/cyan/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} + +.articleNum { float:left; background:url(../images/cyan/iconArticle.gif) no-repeat left top; padding:0 0 0 1.5em; margin:.5em 0 0 0;} +#reply li .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/cyan/iconFile.gif) no-repeat left;} +.articleNum strong { font:bold 11px Tahoma; color:#2895c0;} +.blogHeader2 .info strong { font:bold .9em Tahoma; color:#2895c0;} + +.blogList th { color:#3e3f3e; font-weight:normal; border-bottom:1px solid #ffffff; padding:.5em .5em .3em .5em; background:#ffffff url(../images/cyan/lineBoardListTh.gif) no-repeat left bottom;white-space:nowrap;} +.blogList td.recommend { font:bold .8em Tahoma; color:#2895c0; text-align:center;} +.blogList td .replyAndTrackback { font:.8em Tahoma; color:#2895c0; cursor:default; position:relative; top:-.2em;} +.blogList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#2895c0; cursor:default; position:relative; top:.3em;} +.blogList td.reply { font:bold .8em Tahoma; color:#2895c0; text-align:center;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; background:url(../images/cyan/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} + +.blogRead .replyAndTrackback { overflow:hidden; _width:100%; padding:.8em 0em; height:1.2em; background:url(../images/cyan/bgBoardListTh.gif) repeat-x left bottom; border-top:1px solid #b1c9d3; border-bottom:2px solid #2895c0;} +.blogRead .replyAndTrackback a strong { color:#2895c0;} +.blogRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; background:url(../images/cyan/iconFile.gif) no-repeat left top;} + + + +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 1em Tahoma; color:#2895c0; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + diff --git a/modules/blog/skins/xe_blog/css/green.css b/modules/blog/skins/xe_blog/css/green.css new file mode 100644 index 000000000..2cc6ab17c --- /dev/null +++ b/modules/blog/skins/xe_blog/css/green.css @@ -0,0 +1,40 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +#blog_category { position:relative; border:1px solid #e0e1db; background:url(../images/green/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +.boxTypeB { position:relative; border:1px solid #e0e1db; background:url(../images/green/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em;} +#bodyWrap #header #globalNavigation li.on a { color:#38b549;} + +#bodyWrap #accountNavigation li { float:left; margin-right:-1px; background:url(../images/green/blogHeaderVr.gif) no-repeat right center;} +#bodyWrap #header { clear:both; height:9.5em; margin:10px 10px .5em 10px; border:1px solid #e0e1dc; border-bottom:none; background:#fbfbfb url(../images/green/blogHeaderLine.gif) no-repeat left bottom; overflow:hidden;} + +.articleNum { float:left; background:url(../images/green/iconArticle.gif) no-repeat left top; padding:0 0 0 1.5em; margin:.5em 0 0 0;} +#reply li .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/green/iconFile.gif) no-repeat left;} +.blogRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; background:url(../images/green/iconFile.gif) no-repeat left top;} +.accountNavigation li.join a { display:block; background:url(../images/green/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/green/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} + +.blogList th { color:#3e3f3e; font-weight:normal; border-bottom:1px solid #ffffff; padding:.5em .5em .3em .5em; background:#ffffff url(../images/green/lineBoardListTh.gif) no-repeat left bottom;white-space:nowrap;} + +.blogList td.recommend { font:bold .8em Tahoma; color:#38b549; text-align:center;} + +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 1em Tahoma; color:#38b549; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.blogList td .replyAndTrackback { font:.8em Tahoma; color:#38b549; cursor:default; position:relative; top:-.2em;} +.blogList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#ff6600; cursor:default; position:relative; top:.3em;} +.blogList td.reply { font:bold .8em Tahoma; color:#38b549; text-align:center;} + +/* blogHeader */ +.blogHeader { position:relative; _width:100%; border-top:1px solid #d1d9db; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} +.blogHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d0dbd1; border-bottom:3px solid #38b549; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.articleNum strong { font:bold 11px Tahoma; color:#d0dbd1;} +.blogHeader2 .info strong { font:bold .9em Tahoma; color:#d0dbd1;} + +.blogRead .replyAndTrackback { overflow:hidden; _width:100%; padding:.8em 0em; height:1.2em; background:url(../images/green/bgBoardListTh.gif) repeat-x left bottom; border-top:1px solid #bdd4b8; border-bottom:2px solid #38b549;} +.blogRead .replyAndTrackback a strong { color:#38b549;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; background:url(../images/green/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} diff --git a/modules/blog/skins/xe_blog/css/layout.css b/modules/blog/skins/xe_blog/css/layout.css new file mode 100644 index 000000000..6f01e3b74 --- /dev/null +++ b/modules/blog/skins/xe_blog/css/layout.css @@ -0,0 +1,86 @@ +@et "utf-8"; + +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +li { list-style:none; } +a { text-decoration:none; } + +/* Blog Layout - Common */ +#bodyWrap { position:relative; width:860px; margin:0 auto; background-color:#FFFFFF; padding-top:1px; top:30px;} + +/* Blog Layout - Content Body */ +#contentBody { overflow:hidden; padding-bottom:2em; _width:100%;} + +/* Blog Layout - ColumnLeft */ +#columnLeft { float:left; width:182px; margin:0px 8px 0px 0px; padding-left:10px;} + +/* Blog Layout - ColumnRight */ +#columnRight {} + +/* Blog Layout - Content */ +#content { float:left; width:650px; overflow:hidden; padding-right:10px; _width:648px; } + +#bodyWrap #accountNavigation { float:right; margin:1em 1em 0 0; padding-bottom:.5em; overflow:hidden;} +#bodyWrap #accountNavigation li a { display:block; float:left; padding:0 .75em; color:#888888; white-space:nowrap;} + +.accountNavigation { float:right; padding-bottom:.5em; overflow:hidden;} +.accountNavigation li { float:left; padding:0 .5em 0 .6em; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left .4em;} +.accountNavigation li a { font-size:11px; white-space:nowrap; color:#666666;} +.accountNavigation li.rss { background:none; padding-top:.4em;} +.accountNavigation li.join { background:none; padding-top:.4em;} +.accountNavigation li.join a { display:block; background:url(../images/common/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo { padding-top:.4em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/common/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.admin { background:none; padding-top:.4em;} +.accountNavigation li.admin a { display:block; background:url(../images/common/iconAdmin.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.loginAndLogout { background:none; padding-left:0;} + +/* Blog header Child*/ +#bodyWrap #header h1 { font-size:2em; padding:.8em 0 .2em 30px; letter-spacing:-.05em;} +#bodyWrap #header h1 a { font-family:Tahoma; color:#53554a;} +#bodyWrap #header #tagLine { padding:0 0 0 30px; color:#7e7f77;} + +#bodyWrap #header #globalNavigation { float:right; padding:1em 1em 1em 0; overflow:hidden;} +#bodyWrap #header #globalNavigation li { float:left; margin-left:-1px; background:url(../images/common/blogHeaderVr.gif) no-repeat left center;} +#bodyWrap #header #globalNavigation li a { display:block; float:left; padding:0 .75em; font-weight:bold; font-family:Tahoma; color:#54564b; white-space:nowrap;} + +/* Column Left & Right Common Child */ +.boxTypeA { position:relative; border:1px solid #e0e1db; margin-bottom:.7em;} +.boxTypeB h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +*:first-child+html .boxTypeB h2 { height:20px;} +.boxTypeB .toggleMask {position:absolute; top:8px; right:5px; cursor:pointer; width:13px; height:13px; overflow:hidden;} +.boxTypeB .showHide { position:relative;} +.boxTypeB .optionList { position:absolute; top:8px; right:0; overflow:hidden;} +.boxTypeB .optionList li { float:left; padding:0 .5em; margin-left:-1px; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left center;} +.boxTypeB .optionList li a { color:#a4a4a4; font-size:.9em;} +.boxTypeB .optionList li.on a { color:#000000;} +.boxTypeB .showAll { color:#000000; font-size:.9em; white-space:nowrap; display:inline-block; position:relative; left:1.2em; padding-right:.6em; background:url(../images/common/iconArrow00.gif) no-repeat right center;} + +/* Profile */ +div#profile { padding:10px; overflow:hidden; background-color:#FFFFFF; } +div#profile img.profile { width:160px; display:block; margin-bottom:1.2em;} +div#profile dl#hello {} +div#profile dl#hello dt { color:#333333; margin-bottom:.2em;} +div#profile dl#hello dt a { color:#333333;} +div#profile dl#hello dd { color:#777777; margin-bottom:1em;} +div#profile ul#admin { overflow:hidden; height:1.2em;} +div#profile ul#admin li { float:left; padding-right:.6em;} +div#profile ul#admin li a { display:block; padding-left:1.2em;} +div#profile ul#admin li.write a { background:url(../images/common/iconWrite.gif) no-repeat left center;} +div#profile ul#admin li.setup { padding-left:.7em; background:url(../images/common/blogHeaderVr.gif) no-repeat left center;} +div#profile ul#admin li.setup a { background:url(../images/common/iconSetup.gif) no-repeat left center;} +div#profile ul#admin li a { color:#666666;} + +div#blog_category { background-color:#FFFFFF; } + +/* Search Box */ +div#searchBox { margin-bottom:.7em; overflow:hidden; width:100%;} +div#searchBox fieldset { border:none;} +div#searchBox fieldset legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em;} + +/* powered by zbxe */ +#poweredbyzbxe { text-align:center; margin-top:2em; } +#poweredbyzbxe img { width:138px; height:35px; border:0;} diff --git a/modules/blog/skins/xe_blog/css/purple.css b/modules/blog/skins/xe_blog/css/purple.css new file mode 100644 index 000000000..0cb69b79e --- /dev/null +++ b/modules/blog/skins/xe_blog/css/purple.css @@ -0,0 +1,40 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +#blog_category { position:relative; border:1px solid #e0e1db; background:url(../images/purple/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +.boxTypeB { position:relative; border:1px solid #e0e1db; background:url(../images/purple/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em;} +#bodyWrap #header #globalNavigation li.on a { color:#b1ae00;} + +#bodyWrap #accountNavigation li { float:left; margin-right:-1px; background:url(../images/purple/blogHeaderVr.gif) no-repeat right center;} +#bodyWrap #header { clear:both; height:9.5em; margin:10px 10px .5em 10px; border:1px solid #e0e1dc; border-bottom:none; background:#fbfbfb url(../images/purple/blogHeaderLine.gif) no-repeat left bottom; overflow:hidden;} + +.articleNum { float:left; background:url(../images/purple/iconArticle.gif) no-repeat left top; padding:0 0 0 1.5em; margin:.5em 0 0 0;} +#reply li .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/purple/iconFile.gif) no-repeat left;} +.blogRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; background:url(../images/purple/iconFile.gif) no-repeat left top;} +.accountNavigation li.join a { display:block; background:url(../images/purple/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/purple/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} + +.blogList th { color:#3e3f3e; font-weight:normal; border-bottom:1px solid #ffffff; padding:.5em .5em .3em .5em; background:#ffffff url(../images/purple/lineBoardListTh.gif) no-repeat left bottom;white-space:nowrap;} + +.blogList td.recommend { font:bold .8em Tahoma; color:#b1ae00; text-align:center;} + +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 1em Tahoma; color:#b1ae00; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.blogList td .replyAndTrackback { font:.8em Tahoma; color:#b1ae00; cursor:default; position:relative; top:-.2em;} +.blogList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#b1ae00; cursor:default; position:relative; top:.3em;} +.blogList td.reply { font:bold .8em Tahoma; color:#b1ae00; text-align:center;} + +/* blogHeader */ +.blogHeader { position:relative; _width:100%; border-top:1px solid #d1d9db; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} +.blogHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d1d9db; border-bottom:3px solid #ac19a9; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.articleNum strong { font:bold 11px Tahoma; color:#b1ae00;} +.blogHeader2 .info strong { font:bold .9em Tahoma; color:#b1ae00;} + +.blogRead .replyAndTrackback { overflow:hidden; _width:100%; padding:.8em 0em; height:1.2em; background:url(../images/purple/bgBoardListTh.gif) repeat-x left bottom; border-top:1px solid #dbc9db; border-bottom:2px solid #ac19a9;} +.blogRead .replyAndTrackback a strong { color:#b1ae00;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; background:url(../images/purple/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} diff --git a/modules/blog/skins/xe_blog/css/red.css b/modules/blog/skins/xe_blog/css/red.css new file mode 100644 index 000000000..59a1b36d0 --- /dev/null +++ b/modules/blog/skins/xe_blog/css/red.css @@ -0,0 +1,40 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +#blog_category { position:relative; border:1px solid #e0e1db; background:url(../images/red/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +.boxTypeB { position:relative; border:1px solid #e0e1db; background:url(../images/red/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em;} +#bodyWrap #header #globalNavigation li.on a { color:#fe3614;} + +#bodyWrap #accountNavigation li { float:left; margin-right:-1px; background:url(../images/red/blogHeaderVr.gif) no-repeat right center;} +#bodyWrap #header { clear:both; height:9.5em; margin:10px 10px .5em 10px; border:1px solid #e0e1dc; border-bottom:none; background:#fbfbfb url(../images/red/blogHeaderLine.gif) no-repeat left bottom; overflow:hidden;} + +.articleNum { float:left; background:url(../images/red/iconArticle.gif) no-repeat left top; padding:0 0 0 1.5em; margin:.5em 0 0 0;} +#reply li .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/red/iconFile.gif) no-repeat left;} +.blogRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; background:url(../images/red/iconFile.gif) no-repeat left top;} +.accountNavigation li.join a { display:block; background:url(../images/red/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/red/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} + +.blogList th { color:#3e3f3e; font-weight:normal; border-bottom:1px solid #ffffff; padding:.5em .5em .3em .5em; background:#ffffff url(../images/red/lineBoardListTh.gif) no-repeat left bottom; white-space:nowrap;} + +.blogList td.recommend { font:bold .8em Tahoma; color:#ff6600; text-align:center;} + +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 1em Tahoma; color:#ff6600; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.blogList td .replyAndTrackback { font:.8em Tahoma; color:#ff6600; cursor:default; position:relative; top:-.2em;} +.blogList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#ff6600; cursor:default; position:relative; top:.3em;} +.blogList td.reply { font:bold .8em Tahoma; color:#ff6600; text-align:center;} + +/* blogHeader */ +.blogHeader { position:relative; _width:100%; border-top:1px solid #d1d9db; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} +.blogHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d1d9db; border-bottom:3px solid #ed135a; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.articleNum strong { font:bold 11px Tahoma; color:#ff6600;} +.blogHeader2 .info strong { font:bold .9em Tahoma; color:#ff6600;} + +.blogRead .replyAndTrackback { overflow:hidden; _width:100%; padding:.8em 0em; height:1.2em; background:url(../images/red/bgBoardListTh.gif) repeat-x left bottom; border-top:1px solid #e0e1db; border-bottom:2px solid #ed135a;} +.blogRead .replyAndTrackback a strong { color:#ff6600;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; background:url(../images/red/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} diff --git a/modules/blog/skins/xe_blog/css/white.css b/modules/blog/skins/xe_blog/css/white.css new file mode 100644 index 000000000..f2fe4f7f6 --- /dev/null +++ b/modules/blog/skins/xe_blog/css/white.css @@ -0,0 +1,39 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +#blog_category { position:relative; border:1px solid #e0e1db; background:url(../images/white/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +.boxTypeB { position:relative; border:1px solid #e0e1db; background:url(../images/white/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em;} +#bodyWrap #header #globalNavigation li.on a { color:#fe3614;} + +#bodyWrap #accountNavigation li { float:left; margin-right:-1px; background:url(../images/white/blogHeaderVr.gif) no-repeat right center;} +#bodyWrap #header { clear:both; height:9.5em; margin:10px 10px .5em 10px; border:1px solid #e0e1dc; border-bottom:none; background:#fbfbfb url(../images/white/blogHeaderLine.gif) no-repeat left bottom; overflow:hidden;} + +.articleNum { float:left; background:url(../images/white/iconArticle.gif) no-repeat left top; padding:0 0 0 1.5em; margin:.5em 0 0 0;} +#reply li .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/white/iconFile.gif) no-repeat left;} +.blogRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; background:url(../images/white/iconFile.gif) no-repeat left top;} +.accountNavigation li.join a { display:block; background:url(../images/white/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/white/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.blogList th { color:#3e3f3e; font-weight:normal; border-bottom:1px solid #ffffff; padding:.5em .5em .3em .5em; background:#ffffff url(../images/white/lineBoardListTh.gif) no-repeat left bottom;white-space:nowrap;} + +.blogList td.recommend { font:bold .8em Tahoma; color:#ff6600; text-align:center;} + +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 1em Tahoma; color:#ff6600; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.blogList td .replyAndTrackback { font:.8em Tahoma; color:#ff6600; position:relative; top:-.2em;} +.blogList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#ff6600; position:relative; top:.3em;} +.blogList td.reply { font:bold .8em Tahoma; color:#ff6600; text-align:center;} + +/* blogHeader */ +.blogHeader { position:relative; _width:100%; border:1px solid #e1e1dd; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) repeat-x left bottom; overflow:hidden;} +.blogHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-bottom:3px solid #fe3614; background:#ffffff url(../images/common/lineH3.gif) no-repeat right bottom;} + +.articleNum strong { font:bold 11px Tahoma; color:#ff6600;} +.blogHeader2 .info strong { font:bold .9em Tahoma; color:#ff6600;} + +.blogRead .replyAndTrackback { overflow:hidden; _width:100%; padding:.8em 0em; height:1.2em; background:url(../images/white/bgBoardListTh.gif) repeat-x left bottom; border-top:1px solid #e0e1db; border-bottom:2px solid #666760;} +.blogRead .replyAndTrackback a strong { color:#ff6600;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; background:url(../images/white/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} diff --git a/modules/blog/skins/xe_blog/delete_comment_form.html b/modules/blog/skins/xe_blog/delete_comment_form.html new file mode 100644 index 000000000..551597edf --- /dev/null +++ b/modules/blog/skins/xe_blog/delete_comment_form.html @@ -0,0 +1,24 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + + +
+
+ + diff --git a/modules/blog/skins/xe_blog/delete_form.html b/modules/blog/skins/xe_blog/delete_form.html new file mode 100644 index 000000000..638bc0255 --- /dev/null +++ b/modules/blog/skins/xe_blog/delete_form.html @@ -0,0 +1,23 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + +
+
+ + diff --git a/modules/blog/skins/xe_blog/delete_trackback_form.html b/modules/blog/skins/xe_blog/delete_trackback_form.html new file mode 100644 index 000000000..f907b6793 --- /dev/null +++ b/modules/blog/skins/xe_blog/delete_trackback_form.html @@ -0,0 +1,25 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + + +
+
+ + + diff --git a/modules/blog/skins/xe_blog/filter/delete_comment.xml b/modules/blog/skins/xe_blog/filter/delete_comment.xml new file mode 100644 index 000000000..86ca3fb71 --- /dev/null +++ b/modules/blog/skins/xe_blog/filter/delete_comment.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/blog/skins/xe_blog/filter/delete_document.xml b/modules/blog/skins/xe_blog/filter/delete_document.xml new file mode 100644 index 000000000..263ca7e86 --- /dev/null +++ b/modules/blog/skins/xe_blog/filter/delete_document.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/blog/skins/xe_blog/filter/delete_trackback.xml b/modules/blog/skins/xe_blog/filter/delete_trackback.xml new file mode 100644 index 000000000..1d8841ba3 --- /dev/null +++ b/modules/blog/skins/xe_blog/filter/delete_trackback.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/blog/skins/xe_blog/filter/input_password.xml b/modules/blog/skins/xe_blog/filter/input_password.xml new file mode 100644 index 000000000..f2d1c0c42 --- /dev/null +++ b/modules/blog/skins/xe_blog/filter/input_password.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/blog/skins/xe_blog/filter/insert.xml b/modules/blog/skins/xe_blog/filter/insert.xml new file mode 100644 index 000000000..3938eaf42 --- /dev/null +++ b/modules/blog/skins/xe_blog/filter/insert.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/blog/skins/xe_blog/filter/insert_comment.xml b/modules/blog/skins/xe_blog/filter/insert_comment.xml new file mode 100644 index 000000000..1a3245e34 --- /dev/null +++ b/modules/blog/skins/xe_blog/filter/insert_comment.xml @@ -0,0 +1,28 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/blog/skins/xe_blog/footer.html b/modules/blog/skins/xe_blog/footer.html new file mode 100644 index 000000000..9d5404ca8 --- /dev/null +++ b/modules/blog/skins/xe_blog/footer.html @@ -0,0 +1 @@ +{$module_info->footer_text} diff --git a/modules/blog/skins/xe_blog/header.html b/modules/blog/skins/xe_blog/header.html new file mode 100644 index 000000000..8a6469432 --- /dev/null +++ b/modules/blog/skins/xe_blog/header.html @@ -0,0 +1,2 @@ + +{$module_info->header_text} diff --git a/modules/blog/skins/xe_blog/images/blank.gif b/modules/blog/skins/xe_blog/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/blank.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/bgBoardEditorOption.gif b/modules/blog/skins/xe_blog/images/common/bgBoardEditorOption.gif new file mode 100644 index 000000000..559588af6 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/bgBoardEditorOption.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/bgEditorFileList.gif b/modules/blog/skins/xe_blog/images/common/bgEditorFileList.gif new file mode 100644 index 000000000..e5050341c Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/bgEditorFileList.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/bgH3.gif b/modules/blog/skins/xe_blog/images/common/bgH3.gif new file mode 100644 index 000000000..0d07bb456 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/bgH3.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/blogHeaderVr.gif b/modules/blog/skins/xe_blog/images/common/blogHeaderVr.gif new file mode 100644 index 000000000..9480e8106 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/blogHeaderVr.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/bottomGotoFirst.gif b/modules/blog/skins/xe_blog/images/common/bottomGotoFirst.gif new file mode 100644 index 000000000..e0297fecb Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/bottomGotoFirst.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/bottomGotoLast.gif b/modules/blog/skins/xe_blog/images/common/bottomGotoLast.gif new file mode 100644 index 000000000..0a7141d0d Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/bottomGotoLast.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/bullet_3x3_d8d8d8.gif b/modules/blog/skins/xe_blog/images/common/bullet_3x3_d8d8d8.gif new file mode 100644 index 000000000..c1f245227 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/bullet_3x3_d8d8d8.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/buttonAscending.gif b/modules/blog/skins/xe_blog/images/common/buttonAscending.gif new file mode 100644 index 000000000..b405cc323 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/buttonAscending.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/buttonClose.gif b/modules/blog/skins/xe_blog/images/common/buttonClose.gif new file mode 100644 index 000000000..12cd8aaa9 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/buttonClose.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/buttonDeleteX.gif b/modules/blog/skins/xe_blog/images/common/buttonDeleteX.gif new file mode 100644 index 000000000..c066e49be Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/buttonDeleteX.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/buttonDescending.gif b/modules/blog/skins/xe_blog/images/common/buttonDescending.gif new file mode 100644 index 000000000..2dc5575ff Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/buttonDescending.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/buttonHelp.gif b/modules/blog/skins/xe_blog/images/common/buttonHelp.gif new file mode 100644 index 000000000..ca7a23a9f Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/buttonHelp.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/buttonTextAreaDrag.gif b/modules/blog/skins/xe_blog/images/common/buttonTextAreaDrag.gif new file mode 100644 index 000000000..148e9ee10 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/buttonTextAreaDrag.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/buttonToggleReply.gif b/modules/blog/skins/xe_blog/images/common/buttonToggleReply.gif new file mode 100644 index 000000000..ba3609980 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/buttonToggleReply.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/buttonTypeInput24.gif b/modules/blog/skins/xe_blog/images/common/buttonTypeInput24.gif new file mode 100644 index 000000000..0dcfc0e3d Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/buttonTypeInput24.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/iconAdmin.gif b/modules/blog/skins/xe_blog/images/common/iconAdmin.gif new file mode 100644 index 000000000..4a581a524 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/iconAdmin.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/iconArrowD8.gif b/modules/blog/skins/xe_blog/images/common/iconArrowD8.gif new file mode 100644 index 000000000..fe3143edc Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/iconArrowD8.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/iconCheck.gif b/modules/blog/skins/xe_blog/images/common/iconCheck.gif new file mode 100644 index 000000000..c4fb37ae0 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/iconCheck.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/iconFolderClose.gif b/modules/blog/skins/xe_blog/images/common/iconFolderClose.gif new file mode 100644 index 000000000..3a780968d Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/iconFolderClose.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/iconH3.gif b/modules/blog/skins/xe_blog/images/common/iconH3.gif new file mode 100644 index 000000000..8ea0cec82 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/iconH3.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/iconList.gif b/modules/blog/skins/xe_blog/images/common/iconList.gif new file mode 100644 index 000000000..2e67636f5 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/iconList.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/iconNotice.gif b/modules/blog/skins/xe_blog/images/common/iconNotice.gif new file mode 100644 index 000000000..d32027496 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/iconNotice.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/iconReply.gif b/modules/blog/skins/xe_blog/images/common/iconReply.gif new file mode 100644 index 000000000..a6d4ea112 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/iconReply.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/iconReplyArrow.gif b/modules/blog/skins/xe_blog/images/common/iconReplyArrow.gif new file mode 100644 index 000000000..d1a21a040 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/iconReplyArrow.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/iconRss.gif b/modules/blog/skins/xe_blog/images/common/iconRss.gif new file mode 100644 index 000000000..f495b3ebc Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/iconRss.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/iconSetup.gif b/modules/blog/skins/xe_blog/images/common/iconSetup.gif new file mode 100644 index 000000000..33b41da11 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/iconSetup.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/iconTag.gif b/modules/blog/skins/xe_blog/images/common/iconTag.gif new file mode 100644 index 000000000..ecfdb5585 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/iconTag.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/iconTrackback.gif b/modules/blog/skins/xe_blog/images/common/iconTrackback.gif new file mode 100644 index 000000000..1c83bcadd Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/iconTrackback.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/iconWrite.gif b/modules/blog/skins/xe_blog/images/common/iconWrite.gif new file mode 100644 index 000000000..f18cb5e9e Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/iconWrite.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/lineH3.gif b/modules/blog/skins/xe_blog/images/common/lineH3.gif new file mode 100644 index 000000000..fe42fe378 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/lineH3.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/lineTextAreaDrag.gif b/modules/blog/skins/xe_blog/images/common/lineTextAreaDrag.gif new file mode 100644 index 000000000..3df035047 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/lineTextAreaDrag.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/line_1x10_e0e0e0.gif b/modules/blog/skins/xe_blog/images/common/line_1x10_e0e0e0.gif new file mode 100644 index 000000000..6a848dd58 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/common/line_1x10_e0e0e0.gif differ diff --git a/modules/blog/skins/xe_blog/images/cyan/bgBoardListTh.gif b/modules/blog/skins/xe_blog/images/cyan/bgBoardListTh.gif new file mode 100644 index 000000000..aebba7b59 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/cyan/bgBoardListTh.gif differ diff --git a/modules/blog/skins/xe_blog/images/cyan/bgBoxTypeB.gif b/modules/blog/skins/xe_blog/images/cyan/bgBoxTypeB.gif new file mode 100644 index 000000000..99a877045 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/cyan/bgBoxTypeB.gif differ diff --git a/modules/blog/skins/xe_blog/images/cyan/blogHeaderLine.gif b/modules/blog/skins/xe_blog/images/cyan/blogHeaderLine.gif new file mode 100644 index 000000000..33699610d Binary files /dev/null and b/modules/blog/skins/xe_blog/images/cyan/blogHeaderLine.gif differ diff --git a/modules/blog/skins/xe_blog/images/cyan/blogHeaderVr.gif b/modules/blog/skins/xe_blog/images/cyan/blogHeaderVr.gif new file mode 100644 index 000000000..9480e8106 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/cyan/blogHeaderVr.gif differ diff --git a/modules/blog/skins/xe_blog/images/cyan/buttonModifyE.gif b/modules/blog/skins/xe_blog/images/cyan/buttonModifyE.gif new file mode 100644 index 000000000..a1d4340d3 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/cyan/buttonModifyE.gif differ diff --git a/modules/blog/skins/xe_blog/images/cyan/buttonReply.gif b/modules/blog/skins/xe_blog/images/cyan/buttonReply.gif new file mode 100644 index 000000000..1baede5d0 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/cyan/buttonReply.gif differ diff --git a/modules/blog/skins/xe_blog/images/cyan/buttonTypeInput24.gif b/modules/blog/skins/xe_blog/images/cyan/buttonTypeInput24.gif new file mode 100644 index 000000000..7a341a96b Binary files /dev/null and b/modules/blog/skins/xe_blog/images/cyan/buttonTypeInput24.gif differ diff --git a/modules/blog/skins/xe_blog/images/cyan/iconArticle.gif b/modules/blog/skins/xe_blog/images/cyan/iconArticle.gif new file mode 100644 index 000000000..bce58cfe8 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/cyan/iconArticle.gif differ diff --git a/modules/blog/skins/xe_blog/images/cyan/iconFile.gif b/modules/blog/skins/xe_blog/images/cyan/iconFile.gif new file mode 100644 index 000000000..83ad10665 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/cyan/iconFile.gif differ diff --git a/modules/blog/skins/xe_blog/images/cyan/iconList.gif b/modules/blog/skins/xe_blog/images/cyan/iconList.gif new file mode 100644 index 000000000..d41737669 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/cyan/iconList.gif differ diff --git a/modules/blog/skins/xe_blog/images/cyan/iconMyInfo.gif b/modules/blog/skins/xe_blog/images/cyan/iconMyInfo.gif new file mode 100644 index 000000000..1ba5a947e Binary files /dev/null and b/modules/blog/skins/xe_blog/images/cyan/iconMyInfo.gif differ diff --git a/modules/blog/skins/xe_blog/images/cyan/iconWrite.gif b/modules/blog/skins/xe_blog/images/cyan/iconWrite.gif new file mode 100644 index 000000000..9319f7e9b Binary files /dev/null and b/modules/blog/skins/xe_blog/images/cyan/iconWrite.gif differ diff --git a/modules/blog/skins/xe_blog/images/cyan/lineBoardListTh.gif b/modules/blog/skins/xe_blog/images/cyan/lineBoardListTh.gif new file mode 100644 index 000000000..b26bf737c Binary files /dev/null and b/modules/blog/skins/xe_blog/images/cyan/lineBoardListTh.gif differ diff --git a/modules/blog/skins/xe_blog/images/green/bgBoardListTh.gif b/modules/blog/skins/xe_blog/images/green/bgBoardListTh.gif new file mode 100644 index 000000000..ae25c2d82 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/green/bgBoardListTh.gif differ diff --git a/modules/blog/skins/xe_blog/images/green/bgBoxTypeB.gif b/modules/blog/skins/xe_blog/images/green/bgBoxTypeB.gif new file mode 100644 index 000000000..1cdca75c2 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/green/bgBoxTypeB.gif differ diff --git a/modules/blog/skins/xe_blog/images/green/blogHeaderLine.gif b/modules/blog/skins/xe_blog/images/green/blogHeaderLine.gif new file mode 100644 index 000000000..fb52802d8 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/green/blogHeaderLine.gif differ diff --git a/modules/blog/skins/xe_blog/images/green/blogHeaderVr.gif b/modules/blog/skins/xe_blog/images/green/blogHeaderVr.gif new file mode 100644 index 000000000..9480e8106 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/green/blogHeaderVr.gif differ diff --git a/modules/blog/skins/xe_blog/images/green/buttonModifyE.gif b/modules/blog/skins/xe_blog/images/green/buttonModifyE.gif new file mode 100644 index 000000000..6a4ade1a5 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/green/buttonModifyE.gif differ diff --git a/modules/blog/skins/xe_blog/images/green/buttonReply.gif b/modules/blog/skins/xe_blog/images/green/buttonReply.gif new file mode 100644 index 000000000..e142d4263 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/green/buttonReply.gif differ diff --git a/modules/blog/skins/xe_blog/images/green/buttonTypeInput24.gif b/modules/blog/skins/xe_blog/images/green/buttonTypeInput24.gif new file mode 100644 index 000000000..3e01072b9 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/green/buttonTypeInput24.gif differ diff --git a/modules/blog/skins/xe_blog/images/green/iconArticle.gif b/modules/blog/skins/xe_blog/images/green/iconArticle.gif new file mode 100644 index 000000000..a27236ef2 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/green/iconArticle.gif differ diff --git a/modules/blog/skins/xe_blog/images/green/iconFile.gif b/modules/blog/skins/xe_blog/images/green/iconFile.gif new file mode 100644 index 000000000..2040f4fcb Binary files /dev/null and b/modules/blog/skins/xe_blog/images/green/iconFile.gif differ diff --git a/modules/blog/skins/xe_blog/images/green/iconList.gif b/modules/blog/skins/xe_blog/images/green/iconList.gif new file mode 100644 index 000000000..2e67636f5 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/green/iconList.gif differ diff --git a/modules/blog/skins/xe_blog/images/green/iconMyInfo.gif b/modules/blog/skins/xe_blog/images/green/iconMyInfo.gif new file mode 100644 index 000000000..b67f29733 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/green/iconMyInfo.gif differ diff --git a/modules/blog/skins/xe_blog/images/green/iconWrite.gif b/modules/blog/skins/xe_blog/images/green/iconWrite.gif new file mode 100644 index 000000000..2c9832e36 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/green/iconWrite.gif differ diff --git a/modules/blog/skins/xe_blog/images/green/lineBoardListTh.gif b/modules/blog/skins/xe_blog/images/green/lineBoardListTh.gif new file mode 100644 index 000000000..282297cf8 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/green/lineBoardListTh.gif differ diff --git a/modules/blog/skins/xe_blog/images/iconRss.gif b/modules/blog/skins/xe_blog/images/iconRss.gif new file mode 100644 index 000000000..f495b3ebc Binary files /dev/null and b/modules/blog/skins/xe_blog/images/iconRss.gif differ diff --git a/modules/blog/skins/xe_blog/images/poweredbyzbxe.png b/modules/blog/skins/xe_blog/images/poweredbyzbxe.png new file mode 100644 index 000000000..e15f5af89 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/poweredbyzbxe.png differ diff --git a/modules/blog/skins/xe_blog/images/purple/bgBoardListTh.gif b/modules/blog/skins/xe_blog/images/purple/bgBoardListTh.gif new file mode 100644 index 000000000..ae25c2d82 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/purple/bgBoardListTh.gif differ diff --git a/modules/blog/skins/xe_blog/images/purple/bgBoxTypeB.gif b/modules/blog/skins/xe_blog/images/purple/bgBoxTypeB.gif new file mode 100644 index 000000000..9e130ae44 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/purple/bgBoxTypeB.gif differ diff --git a/modules/blog/skins/xe_blog/images/purple/blogHeaderLine.gif b/modules/blog/skins/xe_blog/images/purple/blogHeaderLine.gif new file mode 100644 index 000000000..4d1c70f6a Binary files /dev/null and b/modules/blog/skins/xe_blog/images/purple/blogHeaderLine.gif differ diff --git a/modules/blog/skins/xe_blog/images/purple/blogHeaderVr.gif b/modules/blog/skins/xe_blog/images/purple/blogHeaderVr.gif new file mode 100644 index 000000000..9480e8106 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/purple/blogHeaderVr.gif differ diff --git a/modules/blog/skins/xe_blog/images/purple/buttonModifyE.gif b/modules/blog/skins/xe_blog/images/purple/buttonModifyE.gif new file mode 100644 index 000000000..a1d4340d3 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/purple/buttonModifyE.gif differ diff --git a/modules/blog/skins/xe_blog/images/purple/buttonReply.gif b/modules/blog/skins/xe_blog/images/purple/buttonReply.gif new file mode 100644 index 000000000..600534865 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/purple/buttonReply.gif differ diff --git a/modules/blog/skins/xe_blog/images/purple/buttonTypeInput24.gif b/modules/blog/skins/xe_blog/images/purple/buttonTypeInput24.gif new file mode 100644 index 000000000..0dcfc0e3d Binary files /dev/null and b/modules/blog/skins/xe_blog/images/purple/buttonTypeInput24.gif differ diff --git a/modules/blog/skins/xe_blog/images/purple/iconArticle.gif b/modules/blog/skins/xe_blog/images/purple/iconArticle.gif new file mode 100644 index 000000000..59c1c8019 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/purple/iconArticle.gif differ diff --git a/modules/blog/skins/xe_blog/images/purple/iconFile.gif b/modules/blog/skins/xe_blog/images/purple/iconFile.gif new file mode 100644 index 000000000..c39a49aa0 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/purple/iconFile.gif differ diff --git a/modules/blog/skins/xe_blog/images/purple/iconList.gif b/modules/blog/skins/xe_blog/images/purple/iconList.gif new file mode 100644 index 000000000..2e67636f5 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/purple/iconList.gif differ diff --git a/modules/blog/skins/xe_blog/images/purple/iconMyInfo.gif b/modules/blog/skins/xe_blog/images/purple/iconMyInfo.gif new file mode 100644 index 000000000..af4545bfa Binary files /dev/null and b/modules/blog/skins/xe_blog/images/purple/iconMyInfo.gif differ diff --git a/modules/blog/skins/xe_blog/images/purple/iconWrite.gif b/modules/blog/skins/xe_blog/images/purple/iconWrite.gif new file mode 100644 index 000000000..f18cb5e9e Binary files /dev/null and b/modules/blog/skins/xe_blog/images/purple/iconWrite.gif differ diff --git a/modules/blog/skins/xe_blog/images/purple/lineBoardListTh.gif b/modules/blog/skins/xe_blog/images/purple/lineBoardListTh.gif new file mode 100644 index 000000000..6c74832c3 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/purple/lineBoardListTh.gif differ diff --git a/modules/blog/skins/xe_blog/images/red/bgBoardListTh.gif b/modules/blog/skins/xe_blog/images/red/bgBoardListTh.gif new file mode 100644 index 000000000..ae25c2d82 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/red/bgBoardListTh.gif differ diff --git a/modules/blog/skins/xe_blog/images/red/bgBoxTypeB.gif b/modules/blog/skins/xe_blog/images/red/bgBoxTypeB.gif new file mode 100644 index 000000000..9e130ae44 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/red/bgBoxTypeB.gif differ diff --git a/modules/blog/skins/xe_blog/images/red/bgBoxTypeB.gif.1 b/modules/blog/skins/xe_blog/images/red/bgBoxTypeB.gif.1 new file mode 100644 index 000000000..01406b48a Binary files /dev/null and b/modules/blog/skins/xe_blog/images/red/bgBoxTypeB.gif.1 differ diff --git a/modules/blog/skins/xe_blog/images/red/blogHeaderLine.gif b/modules/blog/skins/xe_blog/images/red/blogHeaderLine.gif new file mode 100644 index 000000000..6fc563f06 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/red/blogHeaderLine.gif differ diff --git a/modules/blog/skins/xe_blog/images/red/blogHeaderVr.gif b/modules/blog/skins/xe_blog/images/red/blogHeaderVr.gif new file mode 100644 index 000000000..9480e8106 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/red/blogHeaderVr.gif differ diff --git a/modules/blog/skins/xe_blog/images/red/buttonModifyE.gif b/modules/blog/skins/xe_blog/images/red/buttonModifyE.gif new file mode 100644 index 000000000..974552d54 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/red/buttonModifyE.gif differ diff --git a/modules/blog/skins/xe_blog/images/red/buttonReply.gif b/modules/blog/skins/xe_blog/images/red/buttonReply.gif new file mode 100644 index 000000000..b9472e1bc Binary files /dev/null and b/modules/blog/skins/xe_blog/images/red/buttonReply.gif differ diff --git a/modules/blog/skins/xe_blog/images/red/buttonTypeInput24.gif b/modules/blog/skins/xe_blog/images/red/buttonTypeInput24.gif new file mode 100644 index 000000000..2ae80ed23 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/red/buttonTypeInput24.gif differ diff --git a/modules/blog/skins/xe_blog/images/red/iconArticle.gif b/modules/blog/skins/xe_blog/images/red/iconArticle.gif new file mode 100644 index 000000000..5cd05be62 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/red/iconArticle.gif differ diff --git a/modules/blog/skins/xe_blog/images/red/iconFile.gif b/modules/blog/skins/xe_blog/images/red/iconFile.gif new file mode 100644 index 000000000..ee0dd83c7 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/red/iconFile.gif differ diff --git a/modules/blog/skins/xe_blog/images/red/iconList.gif b/modules/blog/skins/xe_blog/images/red/iconList.gif new file mode 100644 index 000000000..2e67636f5 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/red/iconList.gif differ diff --git a/modules/blog/skins/xe_blog/images/red/iconMyInfo.gif b/modules/blog/skins/xe_blog/images/red/iconMyInfo.gif new file mode 100644 index 000000000..b48e1fcd2 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/red/iconMyInfo.gif differ diff --git a/modules/blog/skins/xe_blog/images/red/iconWrite.gif b/modules/blog/skins/xe_blog/images/red/iconWrite.gif new file mode 100644 index 000000000..2caff746f Binary files /dev/null and b/modules/blog/skins/xe_blog/images/red/iconWrite.gif differ diff --git a/modules/blog/skins/xe_blog/images/red/lineBoardListTh.gif b/modules/blog/skins/xe_blog/images/red/lineBoardListTh.gif new file mode 100644 index 000000000..ee37cb8df Binary files /dev/null and b/modules/blog/skins/xe_blog/images/red/lineBoardListTh.gif differ diff --git a/modules/blog/skins/xe_blog/images/tree_menu/folder.gif b/modules/blog/skins/xe_blog/images/tree_menu/folder.gif new file mode 100644 index 000000000..eb129763d Binary files /dev/null and b/modules/blog/skins/xe_blog/images/tree_menu/folder.gif differ diff --git a/modules/blog/skins/xe_blog/images/tree_menu/join.gif b/modules/blog/skins/xe_blog/images/tree_menu/join.gif new file mode 100644 index 000000000..46162d1f8 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/tree_menu/join.gif differ diff --git a/modules/blog/skins/xe_blog/images/tree_menu/joinbottom.gif b/modules/blog/skins/xe_blog/images/tree_menu/joinbottom.gif new file mode 100644 index 000000000..48b81c80a Binary files /dev/null and b/modules/blog/skins/xe_blog/images/tree_menu/joinbottom.gif differ diff --git a/modules/blog/skins/xe_blog/images/tree_menu/line.gif b/modules/blog/skins/xe_blog/images/tree_menu/line.gif new file mode 100644 index 000000000..96321884d Binary files /dev/null and b/modules/blog/skins/xe_blog/images/tree_menu/line.gif differ diff --git a/modules/blog/skins/xe_blog/images/tree_menu/minus.gif b/modules/blog/skins/xe_blog/images/tree_menu/minus.gif new file mode 100644 index 000000000..2e8a1123d Binary files /dev/null and b/modules/blog/skins/xe_blog/images/tree_menu/minus.gif differ diff --git a/modules/blog/skins/xe_blog/images/tree_menu/minusbottom.gif b/modules/blog/skins/xe_blog/images/tree_menu/minusbottom.gif new file mode 100644 index 000000000..dc3198be2 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/tree_menu/minusbottom.gif differ diff --git a/modules/blog/skins/xe_blog/images/tree_menu/page.gif b/modules/blog/skins/xe_blog/images/tree_menu/page.gif new file mode 100644 index 000000000..42d7318c5 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/tree_menu/page.gif differ diff --git a/modules/blog/skins/xe_blog/images/tree_menu/page_folder.gif b/modules/blog/skins/xe_blog/images/tree_menu/page_folder.gif new file mode 100644 index 000000000..e6d880347 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/tree_menu/page_folder.gif differ diff --git a/modules/blog/skins/xe_blog/images/tree_menu/plus.gif b/modules/blog/skins/xe_blog/images/tree_menu/plus.gif new file mode 100755 index 000000000..c064c11f1 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/tree_menu/plus.gif differ diff --git a/modules/blog/skins/xe_blog/images/tree_menu/plusbottom.gif b/modules/blog/skins/xe_blog/images/tree_menu/plusbottom.gif new file mode 100644 index 000000000..b5671d891 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/tree_menu/plusbottom.gif differ diff --git a/modules/blog/skins/xe_blog/images/white/bgBoardListTh.gif b/modules/blog/skins/xe_blog/images/white/bgBoardListTh.gif new file mode 100644 index 000000000..ae25c2d82 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/white/bgBoardListTh.gif differ diff --git a/modules/blog/skins/xe_blog/images/white/bgBoxTypeB.gif b/modules/blog/skins/xe_blog/images/white/bgBoxTypeB.gif new file mode 100644 index 000000000..09f7dd59c Binary files /dev/null and b/modules/blog/skins/xe_blog/images/white/bgBoxTypeB.gif differ diff --git a/modules/blog/skins/xe_blog/images/white/blogHeaderLine.gif b/modules/blog/skins/xe_blog/images/white/blogHeaderLine.gif new file mode 100644 index 000000000..b28509e7e Binary files /dev/null and b/modules/blog/skins/xe_blog/images/white/blogHeaderLine.gif differ diff --git a/modules/blog/skins/xe_blog/images/white/blogHeaderVr.gif b/modules/blog/skins/xe_blog/images/white/blogHeaderVr.gif new file mode 100644 index 000000000..9480e8106 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/white/blogHeaderVr.gif differ diff --git a/modules/blog/skins/xe_blog/images/white/buttonModifyE.gif b/modules/blog/skins/xe_blog/images/white/buttonModifyE.gif new file mode 100644 index 000000000..1cde1b60f Binary files /dev/null and b/modules/blog/skins/xe_blog/images/white/buttonModifyE.gif differ diff --git a/modules/blog/skins/xe_blog/images/white/buttonReply.gif b/modules/blog/skins/xe_blog/images/white/buttonReply.gif new file mode 100644 index 000000000..600534865 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/white/buttonReply.gif differ diff --git a/modules/blog/skins/xe_blog/images/white/buttonTypeInput24.gif b/modules/blog/skins/xe_blog/images/white/buttonTypeInput24.gif new file mode 100644 index 000000000..0dcfc0e3d Binary files /dev/null and b/modules/blog/skins/xe_blog/images/white/buttonTypeInput24.gif differ diff --git a/modules/blog/skins/xe_blog/images/white/iconArticle.gif b/modules/blog/skins/xe_blog/images/white/iconArticle.gif new file mode 100644 index 000000000..59c1c8019 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/white/iconArticle.gif differ diff --git a/modules/blog/skins/xe_blog/images/white/iconFile.gif b/modules/blog/skins/xe_blog/images/white/iconFile.gif new file mode 100644 index 000000000..c39a49aa0 Binary files /dev/null and b/modules/blog/skins/xe_blog/images/white/iconFile.gif differ diff --git a/modules/blog/skins/xe_blog/images/white/iconList.gif b/modules/blog/skins/xe_blog/images/white/iconList.gif new file mode 100644 index 000000000..1c83bcadd Binary files /dev/null and b/modules/blog/skins/xe_blog/images/white/iconList.gif differ diff --git a/modules/blog/skins/xe_blog/images/white/iconMyInfo.gif b/modules/blog/skins/xe_blog/images/white/iconMyInfo.gif new file mode 100644 index 000000000..af4545bfa Binary files /dev/null and b/modules/blog/skins/xe_blog/images/white/iconMyInfo.gif differ diff --git a/modules/blog/skins/xe_blog/images/white/iconWrite.gif b/modules/blog/skins/xe_blog/images/white/iconWrite.gif new file mode 100644 index 000000000..f18cb5e9e Binary files /dev/null and b/modules/blog/skins/xe_blog/images/white/iconWrite.gif differ diff --git a/modules/blog/skins/xe_blog/images/white/lineBoardListTh.gif b/modules/blog/skins/xe_blog/images/white/lineBoardListTh.gif new file mode 100644 index 000000000..6d891d82c Binary files /dev/null and b/modules/blog/skins/xe_blog/images/white/lineBoardListTh.gif differ diff --git a/modules/blog/skins/xe_blog/input_password_form.html b/modules/blog/skins/xe_blog/input_password_form.html new file mode 100644 index 000000000..fc155f854 --- /dev/null +++ b/modules/blog/skins/xe_blog/input_password_form.html @@ -0,0 +1,30 @@ + + + +
+ +
+

{$lang->msg_input_password}

+
+ +
+ + + + + +
+ + + +
+ +
+ +
+ + + diff --git a/modules/blog/skins/xe_blog/js/blog.js b/modules/blog/skins/xe_blog/js/blog.js new file mode 100644 index 000000000..01ef837d7 --- /dev/null +++ b/modules/blog/skins/xe_blog/js/blog.js @@ -0,0 +1,105 @@ +/** + * @file modules/blog/js/blog.js + * @author zero (zero@nzeo.com) + * @brief blog 모듈의 javascript + **/ + +/* 글쓰기 작성후 */ +function completeDocumentInserted(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var category_srl = ret_obj['category_srl']; + + alert(message); + + var url = current_url.setQuery('mid',mid).setQuery('document_srl',document_srl).setQuery('act',''); + if(category_srl) url = url.setQuery('category',category_srl); + location.href = url; +} + +/* 글 삭제 */ +function completeDeleteDocument(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var page = ret_obj['page']; + + var url = "./?mid="+mid; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 검색 실행 */ +function completeSearch(fo_obj, params) { + fo_obj.submit(); +} + +// 현재 페이지 reload +function completeReload(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + location.href = location.href; +} + +/* 댓글쓰기 submit */ +function doCommentSubmit() { + var fo_obj = xGetElementById('fo_comment_write'); + procFilter(fo_obj, insert); +} + +/* 댓글 글쓰기 작성후 */ +function completeInsertComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var comment_srl = ret_obj['comment_srl']; + + alert(message); + var url = current_url.setQuery('comment_srl','').setQuery('act','').setQuery('rnd',comment_srl); + if(comment_srl) url += '#comment_'+comment_srl; + location.href = url; +} + +/* 댓글 삭제 */ +function completeDeleteComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 트랙백 삭제 */ +function completeDeleteTrackback(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 카테고리 이동 */ +function doChangeCategory(sel_obj, url) { + var category_srl = sel_obj.options[sel_obj.selectedIndex].value; + if(!category_srl) location.href=url; + else location.href=url+'&category='+category_srl; +} diff --git a/modules/blog/skins/xe_blog/js/blog_tree_menu.js b/modules/blog/skins/xe_blog/js/blog_tree_menu.js new file mode 100644 index 000000000..167ba1734 --- /dev/null +++ b/modules/blog/skins/xe_blog/js/blog_tree_menu.js @@ -0,0 +1,282 @@ +/** + * @file blog_tree_menu.js + * @author zero (zero@nzeo.com) + * @brief xml파일을 읽어서 트리 메뉴를 그려줌 + * + * common/tpl/tree_menu.js 를 서비스용으로만 사용하기 위해서 수정한 것. + * 관리 기능이 없고 css 적용이 가능 + **/ + +// 폴더를 모두 열고/닫기 위한 변수 설정 +var blog_tree_menu_folder_list = new Array(); + +// 노드의 정보를 가지고 있을 변수 +var blog_node_info_list = new Array(); + +// 카테고리별 문서 수를 가지고 있는 전역 변수 +var category_document_count = new Array(); +var total_document_count = 0; + +// 카테고리의 문서 갯수를 세팅하는 함수 +function setDocumentCount(node_srl, document_count) { + category_document_count[node_srl] = document_count; + total_document_count += document_count; +} + +// 카테고리의 node_srl로 문서 갯수를 리턴하는 함수 +function getDocumentCount(node_srl) { + return parseInt(category_document_count[node_srl],10); +} + +// 트리메뉴의 정보를 담고 있는 xml파일을 읽고 drawTreeMenu()를 호출하는 함수 +function blogLoadTreeMenu(xml_url, title, index_url) { + // 일단 그릴 곳을 찾아서 사전 작업을 함 (그릴 곳이 없다면 아예 시도를 안함) + var zone = xGetElementById("blog_category"); + if(typeof(zone)=="undefined") return; + + // 제목이 없으면 제목을 category로 지정 + if(typeof(title)=="undefined" || !title) title = "category"; + + // index url이 없으면 현재 # 으로 대체 + if(!index_url) index_url= "#"; + + // xml_handler를 이용해서 직접 메뉴 xml파일를 읽음 + if(!xml_url) return; + var oXml = new xml_handler(); + oXml.reset(); + oXml.xml_path = xml_url; + + var param = {"title":title, "index_url":index_url} + + // 요청후 drawTreeMenu()함수를 호출 (xml_handler.js에서 request method를 직접 이용) + oXml.request(blogDrawTreeMenu, oXml, null, null, null, param); +} + +// 트리메뉴 XML정보를 이용해서 정해진 zone에 출력 +var blog_menu_selected = false; +function blogDrawTreeMenu(oXml, callback_func, resopnse_tags, null_func, param) { + var title = param.title; + var index_url = param.index_url; + + var zone = xGetElementById("blog_category"); + var html = ""; + + // 받아온 xml내용을 이용하여 트리 메뉴 그림 + var xmlDoc = oXml.getResponseXml(); + if(!xmlDoc) { + xInnerHtml(zone, html); + return null; + } + + // node 태그에 해당하는 값들을 가져와서 html을 작성 + var node_list = xmlDoc.getElementsByTagName("node"); + if(node_list.length>0) { + var root = xmlDoc.getElementsByTagName("root")[0]; + var output = blogDrawNode(root,0); + html += output.html; + } + + // 제목 지정 + var title_class = "selected"; + if(blog_menu_selected) title_class = "unselected"; + var title_html = '
'+title+' '; + if(total_document_count) title_html += '('+total_document_count+')'; + html = title_html+'
'+html+'
'; + + // 출력하려는 zone이 없다면 load후에 출력하도록 함 + if(!zone) { + xAddEventListener(window, 'load', function() { blogDrawTeeMenu(html); }); + + // 출력하려는 zone을 찾아졌다면 바로 출력 + } else { + xInnerHtml(zone, html); + } + + return null; +} + +// 페이지 랜더링 중에 메뉴의 html이 완성되었을때 window.onload event 후에 그리기 재시도를 하게 될 함수 +function blogDrawTeeMenu(html) { + xInnerHtml("blog_category", html); +} + +// root부터 시작해서 recursive하게 노드를 표혐 +function blogDrawNode(parent_node, depth) { + var output = {html:"", expand:"N"} + + for (var i=0; i< parent_node.childNodes.length; i++) { + var html = ""; + var selected = false; + + // nodeName이 node가 아니면 패스~ + var node = parent_node.childNodes.item(i); + if(node.nodeName!="node") continue; + + // node의 기본 변수들 체크 + var node_srl = node.getAttribute("node_srl"); + var text = node.getAttribute("text"); + var url = node.getAttribute("url"); + var expand = node.getAttribute("expand"); + if(!text) continue; + + // 자식 노드가 있는지 확인 + var hasChild = false; + if(node.hasChildNodes()) hasChild = true; + + // nextSibling가 있는지 확인 + var hasNextSibling = false; + if(i==parent_node.childNodes.length-1) hasNextSibling = true; + + // 후에 사용하기 위해 blog_node_info_list에 node_srl을 값으로 하여 node object 추가 + blog_node_info_list[node_srl] = node; + + // zone_id 값을 세팅 + var zone_id = "blog_category_"+node_srl; + blog_tree_menu_folder_list[blog_tree_menu_folder_list.length] = zone_id; + + var current_category = current_url.getQuery('category'); + if(current_category == node_srl) { + selected = true; + blog_menu_selected = true; + } + + // blog_selected_node이 node_srl과 같으면 펼침으로 처리 + if(selected) expand = "Y"; + + // 아이콘 설정 + var line_class = null; + var folder_class = null; + + // 자식 노드가 있을 경우 자식 노드의 html을 구해옴 + var child_output = null; + var child_html = ""; + + if(hasChild) { + // 자식 노드의 zone id를 세팅 + var child_zone_id = zone_id+"_child"; + blog_tree_menu_folder_list[blog_tree_menu_folder_list.length] = child_zone_id; + + // html을 받아옴 + child_output = blogDrawNode(node, depth+1); + var chtml = child_output.html; + var cexpand = child_output.expand; + if(cexpand == "Y") expand = "Y"; + + // 무조건 펼침이 아닐 경우 + if(expand!="Y") { + var line_class = "line_close"; + if(hasNextSibling) line_class = "item_close"; + //if(depth==0) line_class = "line_null"; + child_html += '
'+chtml+'
'; + + // 무조건 펼침일 경우 + } else { + var line_class = "line_open"; + if(hasNextSibling) line_class = "item_open"; + //if(depth==0) line_class = "line_null"; + child_html += '
'+chtml+'
'; + } + } + + // 자식 노드가 있는지 확인하여 있으면 아이콘을 바꿈 + if(hasChild) { + + // 무조건 펼침이 아닐 경우 + if(expand != "Y") { + if(!hasNextSibling) { + line_class = "minus"; + folder_class = "folder_close"; + } else { + line_class = "minus_bottom"; + folder_class = "folder_close"; + } + // 무조건 펼침일 경우 + } else { + if(!hasNextSibling) { + line_class = "plus"; + folder_class = "folder_open"; + } else { + line_class = "plus_bottom"; + folder_class = "folder_open"; + } + } + + // 자식 노드가 없을 경우 + } else { + if(hasNextSibling) { + line_class = "join_bottom"; + folder_class = "page"; + } else { + line_class = "join"; + folder_class = "page"; + } + } + + if(depth==0) line_class = 'line_null'; + + + // html 작성 + var click_str = ' class="'+folder_class+'"' ; + if(hasChild) click_str += ' onclick="blogToggleFolder(\''+zone_id+'\');return false;" '; + + var text_class = "unselected"; + if(selected) text_class = "selected"; + + var document_count_text = ""; + var document_count = getDocumentCount(node_srl); + if(document_count>0) document_count_text = '('+document_count+')'; + + // 왼쪽 폴더/페이지와 텍스트 위치를 맞추기 위해;;; table태그 일단 사용. 차후 바꾸자.. + html += '
'+ + '
'+ + ''+ + '
'+text+''+document_count_text+'
'+ + '
'; + + if(hasChild && child_html) html += child_html; + + html += '
'; + + output.html += html; + + if(expand=="Y") output.expand = "Y"; + } + return output; +} + +// 노드의 폴더 아이콘 클릭시 +function blogToggleFolder(zone_id) { + // 아이콘을 클릭한 대상을 찾아봄 + var child_zone = xGetElementById(zone_id+"_child"); + if(!child_zone) return; + + var line_obj = xGetElementById(zone_id+'_line'); + var folder_obj = xGetElementById(zone_id+'_folder'); + + + // 대상의 자식 노드들이 숨겨져 있다면 열고 아니면 닫기 + if(folder_obj.className == "folder_open") { + child_zone.style.display = "none"; + + if(!line_obj.className.search('null')) { + if(line_obj.className.indexOf('bottom')>0) line_obj.className = 'plus_bottom'; + else line_obj.className = 'plus'; + } + + folder_obj.className = 'folder_close' + } else { + child_zone.style.display = "block"; + + if(!line_obj.className.search('null')) { + if(line_obj.className.indexOf('bottom')>0) line_obj.className = 'minus_bottom'; + else line_obj.className = 'minus'; + } + + folder_obj.className = 'folder_open'; + } +} + +// 노드 클릭시 +function blogSelectNode(url) { + location.href = url; +} diff --git a/modules/blog/skins/xe_blog/layout.html b/modules/blog/skins/xe_blog/layout.html new file mode 100644 index 000000000..935b092bc --- /dev/null +++ b/modules/blog/skins/xe_blog/layout.html @@ -0,0 +1,161 @@ + + + + + + + + + + + {@$layout_info->colorset = "white"} + + + + + + + + + + + + + + + + + + +
+ + + + + +
+
+ + +
+ + my profile image + + + + +
+
{$layout_info->profile}
+
+ + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ powered by zeroboard XE +
+ +
+ + +
{$content}
+ +
+ +
diff --git a/modules/blog/skins/xe_blog/list.html b/modules/blog/skins/xe_blog/list.html new file mode 100644 index 000000000..7930b80cb --- /dev/null +++ b/modules/blog/skins/xe_blog/list.html @@ -0,0 +1,60 @@ + + + + + + + +
+

{$lang->search_result}

+ + "{$search_keyword}" {$lang->search_result} : {$total_count} + +
+ + + + + + + + + + + + + + + + + + + + + +
{$lang->title}{$lang->comment}{$lang->trackback}{$lang->regdate}
{$no}{$oDocument->getTitleText()}{number_format($oDocument->getCommentCount())} {number_format($oDocument->getTrackbackCount())} {$oDocument->getRegdate("Y. m. d")}
+ + + + + + + + + + + + + + diff --git a/modules/blog/skins/xe_blog/message.html b/modules/blog/skins/xe_blog/message.html new file mode 100644 index 000000000..00bf01814 --- /dev/null +++ b/modules/blog/skins/xe_blog/message.html @@ -0,0 +1,11 @@ + + +
+ {$message} +
+ + + {$lang->cmd_login} + + + diff --git a/modules/blog/skins/xe_blog/screenshot/cyan.gif b/modules/blog/skins/xe_blog/screenshot/cyan.gif new file mode 100644 index 000000000..570dd2cec Binary files /dev/null and b/modules/blog/skins/xe_blog/screenshot/cyan.gif differ diff --git a/modules/blog/skins/xe_blog/screenshot/green.gif b/modules/blog/skins/xe_blog/screenshot/green.gif new file mode 100644 index 000000000..df96888e7 Binary files /dev/null and b/modules/blog/skins/xe_blog/screenshot/green.gif differ diff --git a/modules/blog/skins/xe_blog/screenshot/purple.gif b/modules/blog/skins/xe_blog/screenshot/purple.gif new file mode 100644 index 000000000..ccc3237d1 Binary files /dev/null and b/modules/blog/skins/xe_blog/screenshot/purple.gif differ diff --git a/modules/blog/skins/xe_blog/screenshot/red.gif b/modules/blog/skins/xe_blog/screenshot/red.gif new file mode 100644 index 000000000..a7a98c99f Binary files /dev/null and b/modules/blog/skins/xe_blog/screenshot/red.gif differ diff --git a/modules/blog/skins/xe_blog/screenshot/white.gif b/modules/blog/skins/xe_blog/screenshot/white.gif new file mode 100644 index 000000000..6bc4d89cc Binary files /dev/null and b/modules/blog/skins/xe_blog/screenshot/white.gif differ diff --git a/modules/blog/skins/xe_blog/skin.xml b/modules/blog/skins/xe_blog/skin.xml new file mode 100644 index 000000000..2b3b19bc2 --- /dev/null +++ b/modules/blog/skins/xe_blog/skin.xml @@ -0,0 +1,158 @@ + + + 제로보드XE 블로그 기본 스킨 + ZBXEブログのデフォルトスキン + Zeroboard XE博客默认皮肤 + Default Skin of Zeroboard XE blog + + (주)NHN + (株)NHN + (株)NHN + NHN Corp + + 제로보드XE 블로그 기본 스킨입니다. + 디자인 : 서기정 (http://blog.naver.com/addcozy) + HTML/CSS : 정찬명 (http://naradesign.net) + + + ゼロボードXEブログの基本スキンです。 + デザイン:ソギジョン (http://blog.naver.com/addcozy) + HTML/CSS:ジョンチャンミョン (http://naradesign.net) + + + Zeroboard XE样式皮肤。 + 设计 : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Chan-Myung Jeong (http://naradesign.net) + + + This is default skin of Zeroboard XE blog. + Design : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Chan-Myung Jeong (http://naradesign.net) + + + + + 하얀색(기본) + 白色(基本) + 白色(默认) + White (default) + + + 청록색 + 青緑 + 青绿色 + Cyan + + + 초록색 + + 绿色 + Green + + + 빨간색 + + 红色 + Red + + + 보라색 + + 紫色 + Purple + + + + + 상단 제목 + 上段タイトル + 顶部标题 + Top Title + 레이아웃의 상단에 표시할 제목을 입력하세요. + レイアウト上段に表示させるタイトルを入力してください。 + 请输入布局顶部显示的标题。 + Please input title which will be displayed on top of layout. + + + 부제 + サブタイトル + 副标题 + Subtitle + 레이아웃의 상단에 큰 제목 아래 부제목을 입력하세요. + レイアウトの上段にメインタイトルの下のサブタイトルを入力してください。 + 部分顶部主标题下面显示的副标题。 + Please input subtitle which will be displayed under the top title. + + + 로고이미지 + ロゴイメージ + LOGO图片 + Logo Image + 레이아웃의 상단에 표시될 로고이미지를 입력하세요. + レイアウトの上段に表示されるロゴイメージを入力してください。 + 布局顶部显示的LOGO图片。 + Please input logo image which will be displayed on top of layout. + + + 프로필 이미지 + プロフィールイメージ + 博客个性图片 + Profile Image + 프로필 이미지를 입력해 주세요 (가로 사이즈는 160px이 가장 보기 좋습니다) + プロフィールイメージを入力してください(横幅は「160px」が一番適しています)。 + 请输入博客个性图片。 (宽度160px图片为适) + Please input profile image (It is recommended to set width as 160px) + + + 배경 이미지 + 背景イメージ + 背景图片 + Background Image + 배경 이미지를 사용하시려면 등록해주세요. + 背景イメージを使う場合は、登録してください。 + 要想使用背景图片请在这里上传。 + Please input if you want to use background image. + + + 프로필 + プロフィール + 简介 + Profile + 간단한 프로필을 입력해주세요 + 簡単なプロフィールを入力してください。 + 请输入简单介绍。 + Please input your simple profile + + + 카테고리명 + カテゴリ名 + 分类名 + Category + 카테고리의 이름을 입력해주세요. + カテゴリ名を入力してください。 + 请输入分类名。 + Please input the name of category. + + + 글쓴이 표시 + 投稿者表示 + 显示作者 + Show Writer + 다수가 블로그를 함께 운영시에 글쓴이의 이름을 표시할 수 있습니다. + 多数の人が一緒に運営している場合、投稿者の名前を表示させることができます。 + 多数人一起管理博客时可以显示发表文章的作者。 + It can display authors' name when the blog is being administrated by many administrators. + off + on + + + + + 상단 메뉴 + 上段メニュー + 主菜单 + Top Menu + 1 + + + diff --git a/modules/blog/skins/xe_blog/trackback.html b/modules/blog/skins/xe_blog/trackback.html new file mode 100644 index 000000000..742527eb7 --- /dev/null +++ b/modules/blog/skins/xe_blog/trackback.html @@ -0,0 +1,24 @@ + + + + + diff --git a/modules/blog/skins/xe_blog/view_document.html b/modules/blog/skins/xe_blog/view_document.html new file mode 100644 index 000000000..63fc1e317 --- /dev/null +++ b/modules/blog/skins/xe_blog/view_document.html @@ -0,0 +1,95 @@ + +
+
+
+
+

{$oDocument->getTitleText()}

+ + |{$category_list[$oDocument->get('category_srl')]->title} + +
+ +
+ {$oDocument->getRegdate('Y.m.d')} {$oDocument->getRegdate('H:i:s')} + + + {$lang->cmd_modify} + {$lang->cmd_delete} + +
+
+ +
    +
  • {$lang->document_url} : {$oDocument->getPermanentUrl()}
  • + +
  • {$lang->trackback_url} : {$oDocument->getTrackbackUrl()}
  • + +
+ + +
+
{$oDocument->getNickName()}
+ +
{$oDocument->get('ipaddress')}
+ +
+ + +
{$oDocument->getContent()}
+ +
+ {@ $tag_list = $oDocument->get('tag_list') } + +
+
{$lang->tag}
+ +
+ + + +
+
{$lang->uploaded_file} :
+ +
+ +
+
+ + +
+ + + + + + + + + + + {@ $document_srl = $oDocument->document_srl; } + + diff --git a/modules/blog/skins/xe_blog/write_form.html b/modules/blog/skins/xe_blog/write_form.html new file mode 100644 index 000000000..1d4cdbdd5 --- /dev/null +++ b/modules/blog/skins/xe_blog/write_form.html @@ -0,0 +1,96 @@ + + + +
+
fileupload)-->enctype="multipart/form-data" class="blogEditor" id="fo_write"> +
+ + + + + +
+ + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+
{$lang->cmd_option}
+ +
+ isNotice())-->checked="checked" id="is_notice" /> + +
+
+ isLocked())-->checked="checked" id="lock_comment" /> + +
+ +
+ isSecret())-->checked="checked" id="is_secret" /> + +
+
+ allowComment())-->checked="checked" id="allow_comment" /> + +
+
+ allowTrackback())-->checked="checked" id="allow_trackback" /> + +
+
+ +
{$editor}
+ +
+ + + +
+ +
+ + +

{$lang->about_tag}

+
+ +
+ +
+ + +
+
+
+ diff --git a/modules/blog/tpl/blog_delete.html b/modules/blog/tpl/blog_delete.html new file mode 100644 index 000000000..78783dd44 --- /dev/null +++ b/modules/blog/tpl/blog_delete.html @@ -0,0 +1,35 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
{$lang->confirm_delete}
{$lang->module_name}{$module_info->mid}
{$lang->module}{$module_info->module}
{$lang->document_count}{$module_info->document_count}
+ + + +
+ diff --git a/modules/blog/tpl/blog_info.html b/modules/blog/tpl/blog_info.html new file mode 100644 index 000000000..f5938d492 --- /dev/null +++ b/modules/blog/tpl/blog_info.html @@ -0,0 +1,59 @@ + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->module_category} + + {$lang->not_exists} + + {$module_category[$module_info->module_category_srl]->title} + +
{$lang->skin}{$module_info->skin_title} ({$module_info->skin})
{$lang->browser_title}{htmlspecialchars($module_info->browser_title)}
{$lang->open_rss}{$lang->open_rss_types[$module_info->open_rss]}
{$lang->list_count}{$module_info->list_count?$module_info->list_count:20}
{$lang->page_count}{$module_info->page_count?$module_info->page_count:10}
{$lang->description}{nl2br(htmlspecialchars($module_info->description))}
{$lang->header_text}{htmlspecialchars($module_info->header_text)}
{$lang->footer_text}{htmlspecialchars($module_info->footer_text)}
{$lang->admin_id}{implode(",",$module_info->admin_id)}
+ + diff --git a/modules/blog/tpl/blog_insert.html b/modules/blog/tpl/blog_insert.html new file mode 100644 index 000000000..81deb8d93 --- /dev/null +++ b/modules/blog/tpl/blog_insert.html @@ -0,0 +1,125 @@ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->mid} + +

{$lang->about_mid}

+
{$lang->is_default} + is_default=='Y')-->checked="checked" id="fld_for_default" class="checkbox" /> + +
{$lang->module_category} + +

{$lang->about_module_category}

+
{$lang->browser_title} + +

{$lang->about_browser_title}

+
{$lang->skin} + +

{$lang->about_skin}

+
{$lang->open_rss} + +

{$lang->about_open_rss}

+
{$lang->list_count} + +

{$lang->about_list_count}

+
{$lang->page_count} + +

{$lang->about_page_count}

+
{$lang->description} + +

{$lang->about_description}

+
{$lang->header_text} + +

{$lang->about_header_text}

+
{$lang->footer_text} + +

{$lang->about_footer_text}

+
{$lang->admin_id} + +

{$lang->about_admin_id}

+
+ +
+ +
+ +
diff --git a/modules/blog/tpl/category_info.html b/modules/blog/tpl/category_info.html new file mode 100644 index 000000000..3447a45c2 --- /dev/null +++ b/modules/blog/tpl/category_info.html @@ -0,0 +1,49 @@ + + + + +++ + + + + + + + + + + + + + + + + + +
{$lang->parent_category_name}{$category_info->parent_category_name}
{$lang->category_name} + +

{$lang->about_category_name}

+
{$lang->expand} + expand=="Y")-->checked="checked" class="checkbox" /> + {$lang->about_expand} +
{$lang->category_group_srls} + + group_srls)&&in_array($key, $category_info->group_srls))-->checked="checked" class="checkbox" /> + +

{$lang->about_category_group_srls}

+
+ + + diff --git a/modules/blog/tpl/category_list.html b/modules/blog/tpl/category_list.html new file mode 100644 index 000000000..0375346c6 --- /dev/null +++ b/modules/blog/tpl/category_list.html @@ -0,0 +1,56 @@ + + + + + + +

{$lang->blog} {$lang->cmd_management}

+ + diff --git a/modules/blog/tpl/css/blog.css b/modules/blog/tpl/css/blog.css new file mode 100644 index 000000000..59cd716f9 --- /dev/null +++ b/modules/blog/tpl/css/blog.css @@ -0,0 +1,12 @@ +@charset "utf-8"; + +h3 { margin:0 20px 0 20px; } +.menuManagement { margin:20px; } +.menuListZone td { vertical-align:top; } +.menuListZone td.category_zone { padding-right:10px; } + +#category_list { padding:.5em 0 .5em 0; margin-bottom:2em; } +#category_list .checkbox { margin-top:1em; border:0px; } + +#menu_zone_info { background-color:#FFFFFF; z-index:999; display:none; overflow:hidden; padding-left:10px; border-left:1px dashed #CCCCCC; } +#category_info { background-color:#FFFFFF; z-index:999; display:none; overflow:hidden; padding-left:10px; border-left:1px dashed #CCCCCC; } diff --git a/modules/blog/tpl/filter/delete_blog.xml b/modules/blog/tpl/filter/delete_blog.xml new file mode 100644 index 000000000..1244441eb --- /dev/null +++ b/modules/blog/tpl/filter/delete_blog.xml @@ -0,0 +1,10 @@ + +
+ + + + + + + +
diff --git a/modules/blog/tpl/filter/delete_category.xml b/modules/blog/tpl/filter/delete_category.xml new file mode 100644 index 000000000..05093325a --- /dev/null +++ b/modules/blog/tpl/filter/delete_category.xml @@ -0,0 +1,11 @@ + +
+ + + + + + + + +
diff --git a/modules/blog/tpl/filter/insert_blog.xml b/modules/blog/tpl/filter/insert_blog.xml new file mode 100644 index 000000000..371a33a62 --- /dev/null +++ b/modules/blog/tpl/filter/insert_blog.xml @@ -0,0 +1,30 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/blog/tpl/filter/insert_category.xml b/modules/blog/tpl/filter/insert_category.xml new file mode 100644 index 000000000..2f65b59aa --- /dev/null +++ b/modules/blog/tpl/filter/insert_category.xml @@ -0,0 +1,23 @@ + +
+ + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/blog/tpl/filter/insert_grant.xml b/modules/blog/tpl/filter/insert_grant.xml new file mode 100644 index 000000000..ee69ea24a --- /dev/null +++ b/modules/blog/tpl/filter/insert_grant.xml @@ -0,0 +1,11 @@ + +
+ + + + + + + + +
diff --git a/modules/blog/tpl/filter/manage_checked_document.xml b/modules/blog/tpl/filter/manage_checked_document.xml new file mode 100644 index 000000000..de9e65f32 --- /dev/null +++ b/modules/blog/tpl/filter/manage_checked_document.xml @@ -0,0 +1,7 @@ + +
+ + + + + diff --git a/modules/blog/tpl/filter/move_category.xml b/modules/blog/tpl/filter/move_category.xml new file mode 100644 index 000000000..d324a1a59 --- /dev/null +++ b/modules/blog/tpl/filter/move_category.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/modules/blog/tpl/grant_list.html b/modules/blog/tpl/grant_list.html new file mode 100644 index 000000000..7bc9505d9 --- /dev/null +++ b/modules/blog/tpl/grant_list.html @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->grant}{$lang->target}
{$val->title} + + grants[$key])&&in_array($v->group_srl,$module_info->grants[$key]))-->checked="checked"/> + + + {$lang->cmd_select_all}{$lang->cmd_unselect_all}
+ +
+ +
+ +
diff --git a/modules/blog/tpl/header.html b/modules/blog/tpl/header.html new file mode 100644 index 000000000..3c08f7dff --- /dev/null +++ b/modules/blog/tpl/header.html @@ -0,0 +1,37 @@ + + + +{@ + $blog_menu_list = array( + 'dispBlogAdminBlogInfo'=>$lang->cmd_view_info, + 'dispBlogAdminCategoryInfo'=>$lang->cmd_manage_category, + 'dispBlogAdminGrantInfo'=>$lang->cmd_manage_grant, + 'dispBlogAdminSkinInfo'=>$lang->cmd_manage_skin, + 'dispLayoutAdminEdit'=>$lang->cmd_layout_edit, + ); +} + +

{$lang->blog} {$lang->cmd_management}

+ + +
+ +

{$module_info->mid} ({$lang->is_default}) | View

+ + + +
+ diff --git a/modules/blog/tpl/index.html b/modules/blog/tpl/index.html new file mode 100644 index 000000000..b860e46a0 --- /dev/null +++ b/modules/blog/tpl/index.html @@ -0,0 +1,83 @@ + + +
{nl2br($lang->about_blog)}
+ + +
+ Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->no} +
+ + + + +
+
{$lang->mid}{$lang->browser_title}{$lang->is_default}{$lang->skin}{$lang->admin_id}{$lang->regdate}{$lang->cmd_view}{$lang->cmd_delete}
{$no} + + {$lang->not_exists} + + {$module_category[$val->module_category_srl]->title} + + {$val->mid}{htmlspecialchars($val->browser_title)}{$val->is_default}{$val->skin}{$val->admin_id}{zdate($val->regdate,"Y-m-d")}{$lang->cmd_view}{$lang->cmd_delete}
+ + + + + + diff --git a/modules/blog/tpl/js/blog_admin.js b/modules/blog/tpl/js/blog_admin.js new file mode 100644 index 000000000..b20a4bd10 --- /dev/null +++ b/modules/blog/tpl/js/blog_admin.js @@ -0,0 +1,270 @@ +/** + * @file modules/blog/js/blog_admin.js + * @author zero (zero@nzeo.com) + * @brief blog 모듈의 관리자용 javascript + **/ + +/* 모듈 생성 후 */ +function completeInsertBlog(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + var page = ret_obj['page']; + + alert(message); + + var url = current_url.setQuery('act','dispBlogAdminBlogInfo'); + location.href = url; +} + +/* 모듈 삭제 후 */ +function completeDeleteBlog(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var page = ret_obj['page']; + alert(message); + + var url = current_url.setQuery('act','dispBlogAdminContent').setQuery('module_srl',''); + if(page) url = url.setQuery('page',page); + location.href = url; +} + +/* 카테고리 관련 작업들 */ +function doUpdateCategory(category_srl, mode, message) { + if(typeof(message)!='undefined'&&!confirm(message)) return; + + var fo_obj = xGetElementById('fo_category_info'); + fo_obj.category_srl.value = category_srl; + fo_obj.mode.value = mode; + + procFilter(fo_obj, update_category); +} + +/* 카테고리 정보 수정 후 */ +function completeUpdateCategory(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var module_srl = ret_obj['module_srl']; + var page = ret_obj['page']; + alert(message); + + var url = current_url.setQuery('module_srl',module_srl).setQuery('act','dispBlogAdminCategoryInfo'); + if(page) url.setQuery('page',page); + location.href = url; +} + +/* 권한 관련 */ +function doSelectAll(obj, key) { + var fo_obj = obj.parentNode; + while(fo_obj.nodeName != 'FORM') { + fo_obj = fo_obj.parentNode; + } + + for(var i=0;i'+title+''; + + var xmlDoc = oXml.getResponseXml(); + if(!xmlDoc) { + xInnerHtml(zone, html); + return null; + } + + blog_tree_menu_folder_list[menu_id] = new Array(); + + // node 태그에 해당하는 값들을 가져와서 html을 작성 + var node_list = xmlDoc.getElementsByTagName("node"); + if(node_list.length>0) { + var root = xmlDoc.getElementsByTagName("root")[0]; + var output = drawNode(root, menu_id); + html += output.html; + } + + // 출력하려는 zone이 없다면 load후에 출력하도록 함 + if(!zone) { + xAddEventListener(window, 'load', function() { drawTeeMenu(zone_id, menu_id, html); }); + + // 출력하려는 zone을 찾아졌다면 바로 출력 + } else { + xInnerHtml(zone, html); + if(manual_select_node_srl) manualSelectNode(menu_id, manual_select_node_srl); + } + + return null; +} + +// 페이지 랜더링 중에 메뉴의 html이 완성되었을때 window.onload event 후에 그리기 재시도를 하게 될 함수 +function drawTeeMenu(zone_id, menu_id, html) { + xInnerHtml(zone_id, html); + if(manual_select_node_srl) manualSelectNode(menu_id, manual_select_node_srl); +} + +// root부터 시작해서 recursive하게 노드를 표혐 +function drawNode(parent_node, menu_id) { + var output = {html:"", expand:"N"} + + for (var i=0; i< parent_node.childNodes.length; i++) { + var html = ""; + + // nodeName이 node가 아니면 패스~ + var node = parent_node.childNodes.item(i); + if(node.nodeName!="node") continue; + + // node의 기본 변수들 체크 + var node_srl = node.getAttribute("node_srl"); + var text = node.getAttribute("text"); + var url = node.getAttribute("url"); + var expand = node.getAttribute("expand"); + + if(!text) continue; + + // 자식 노드가 있는지 확인 + var hasChild = false; + if(node.hasChildNodes()) hasChild = true; + + // nextSibling가 있는지 확인 + var hasNextSibling = false; + if(i==parent_node.childNodes.length-1) hasNextSibling = true; + + // 후에 사용하기 위해 blog_node_info_list에 node_srl을 값으로 하여 node object 추가 + blog_node_info_list[menu_id][node_srl] = node; + + // zone_id 값을 세팅 + var zone_id = "menu_"+menu_id+"_"+node_srl; + blog_tree_menu_folder_list[menu_id][blog_tree_menu_folder_list[menu_id].length] = zone_id; + + // url을 확인하여 현재의 url과 동일하다고 판단되면 manual_select_node_srl 에 값을 추가 (관리자페이지일 경우는 무시함) + if(node_callback_func[menu_id] == moveTreeMenu && url && current_url.getQuery('category')==node_srl) manual_select_node_srl = node_srl; + + // manual_select_node_srl이 node_srl과 같으면 펼침으로 처리 + if(manual_select_node_srl == node_srl) expand = "Y"; + + // 아이콘 설정 + var line_icon = null; + var folder_icon = null; + + // 자식 노드가 있을 경우 자식 노드의 html을 구해옴 + var child_output = null; + var child_html = ""; + if(hasChild) { + // 자식 노드의 zone id를 세팅 + var child_zone_id = zone_id+"_child"; + blog_tree_menu_folder_list[menu_id][blog_tree_menu_folder_list[menu_id].length] = child_zone_id; + + // html을 받아옴 + child_output = drawNode(node, menu_id); + var chtml = child_output.html; + var cexpand = child_output.expand; + if(cexpand == "Y") expand = "Y"; + + // 무조건 펼침이 아닐 경우 + if(expand!="Y") { + if(!hasNextSibling) child_html += ''; + else child_html += ''; + // 무조건 펼침일 경우 + } else { + if(!hasNextSibling) child_html += '
'+chtml+'
'; + else child_html += '
'+chtml+'
'; + } + } + + // 자식 노드가 있는지 확인하여 있으면 아이콘을 바꿈 + if(hasChild) { + // 무조건 펼침이 아닐 경우 + if(expand != "Y") { + if(!hasNextSibling) { + line_icon = "minus"; + folder_icon = "page"; + } else { + line_icon = "minusbottom"; + folder_icon = "page"; + } + // 무조건 펼침일 경우 + } else { + if(!hasNextSibling) { + line_icon = "plus"; + folder_icon = "page"; + } else { + line_icon = "plusbottom"; + folder_icon = "page"; + } + } + + // 자식 노드가 없을 경우 + } else { + if(hasNextSibling) { + line_icon = "joinbottom"; + folder_icon = "page"; + } else { + line_icon = "join"; + folder_icon = "page"; + } + } + + + // html 작성 + html += '
'; + + if(hasChild) html+= ''; + else html+= ''; + + html += 'linefolder'; + + var chk_enable = xGetElementById(menu_id+"_enable_move"); + if(chk_enable) { + html += ''; + } else { + html += ''; + } + + html += text+''; + + html += child_html; + + html += '
'; + + output.html += html; + + if(expand=="Y") output.expand = "Y"; + } + return output; +} + +// 관리자 모드일 경우 *_enable_move 의 값에 따라 메뉴 이동을 시키거나 정보를 보여주도록 변경 +function doNodeFunc(obj, menu_id, node_srl, zone_id) { + var chk_enable = xGetElementById(menu_id+"_enable_move"); + if(!chk_enable || chk_enable.checked!=true || !obj) { + selectNode(menu_id,node_srl,zone_id); + return; + } + + deSelectNode(); + tree_drag_enable(obj,tree_drag_start,tree_drag,tree_drag_end); +} + +// 수동으로 메뉴를 선택하도록 함 +function manualSelectNode(menu_id, node_srl) { + var zone_id = "menu_"+menu_id+"_"+node_srl; + selectNode(menu_id,node_srl,zone_id,false); + return; +} + +// 노드의 폴더 아이콘 클릭시 +function toggleFolder(zone_id) { + // 아이콘을 클릭한 대상을 찾아봄 + var child_zone = xGetElementById(zone_id+"_child"); + if(!child_zone) return; + + // 대상의 아이콘들 찾음 + var line_icon = xGetElementById(zone_id+'_line_icon'); + var folder_icon = xGetElementById(zone_id+'_folder_icon'); + + // 대상의 자식 노드들이 숨겨져 있다면 열고 아니면 닫기 + if(child_zone.style.display == "block") { + child_zone.style.display = "none"; + if(line_icon.src.indexOf('bottom')>0) line_icon.src = tree_minus_bottom_icon.src; + else line_icon.src = tree_minus_icon.src; + + folder_icon.src = tree_folder_icon.src; + } else { + if(line_icon.src.indexOf('bottom')>0) line_icon.src = tree_plus_bottom_icon.src; + else line_icon.src = tree_plus_icon.src; + folder_icon.src = tree_open_folder_icon.src; + child_zone.style.display = "block"; + } +} + +// 노드의 글자 선택시 +var prev_selected_node = null; +function selectNode(menu_id, node_srl, zone_id, move_url) { + // 선택된 노드를 찾아봄 + var node_zone = xGetElementById(zone_id+'_node'); + if(!node_zone) return; + + // 이전에 선택된 노드가 있었다면 원래데로 돌림 + if(prev_selected_node) { + var prev_zone = xGetElementById(prev_selected_node.id); + if(prev_zone) { + prev_zone.style.backgroundColor = "#ffffff"; + prev_zone.style.fontWeight = "normal"; + prev_zone.style.color = "#000000"; + } + } + + // 선택된 노드의 글자를 변경 + prev_selected_node = node_zone; + node_zone.style.backgroundColor = "#0e078f"; + node_zone.style.fontWeight = "bold"; + node_zone.style.color = "#FFFFFF"; + + // 함수 실행 + if(typeof(move_url)=="undefined"||move_url==true) { + var func = node_callback_func[menu_id]; + func(menu_id, blog_node_info_list[menu_id][node_srl]); + //toggleFolder(zone_id); + } +} + +// 선택된 노드의 표시를 없앰 +function deSelectNode() { + // 이전에 선택된 노드가 있었다면 원래데로 돌림 + if(!prev_selected_node) return; + prev_selected_node.style.backgroundColor = "#ffffff"; + prev_selected_node.style.fontWeight = "normal"; + prev_selected_node.style.color = "#000000"; +} + + +// 모두 닫기 +function closeAllTreeMenu(menu_id) { + for(var i in blog_tree_menu_folder_list[menu_id]) { + var zone_id = blog_tree_menu_folder_list[menu_id][i]; + var zone = xGetElementById(zone_id); + if(!zone) continue; + var child_zone = xGetElementById(zone_id+"_child"); + if(!child_zone) continue; + + child_zone.style.display = "block"; + toggleFolder(zone_id); + } +} + +// 모두 열기 +function openAllTreeMenu(menu_id) { + for(var i in blog_tree_menu_folder_list[menu_id]) { + var zone_id = blog_tree_menu_folder_list[menu_id][i]; + var zone = xGetElementById(zone_id); + if(!zone) continue; + var child_zone = xGetElementById(zone_id+"_child"); + if(!child_zone) continue; + + child_zone.style.display = "none"; + toggleFolder(zone_id); + } +} + +// 메뉴 클릭시 기본으로 동작할 함수 (사용자 임의 함수로 대체될 수 있음) +function moveTreeMenu(menu_id, node) { + // url과 open_window값을 구함 + var node_srl = node.getAttribute("node_srl"); + var url = node.getAttribute("url"); + var open_window = node.getAttribute("open_window"); + var hasChild = false; + if(node.hasChildNodes()) hasChild = true; + + // url이 없고 child가 있으면 해당 폴더 토글한다 + if(!url && hasChild) { + var zone_id = "menu_"+menu_id+"_"+node_srl; + toggleFolder(zone_id); + return; + } + + // url이 있으면 url을 분석한다 (제로보드 특화된 부분. url이 http나 ftp등으로 시작하면 그냥 해당 url 열기) + if(url) { + // http, ftp등의 연결이 아닌 경우 제로보드용으로 처리 + if(url.indexOf('://')==-1) url = "./?"+url; + + // open_window에 따라서 처리 + if(open_window != "Y") location.href=url; + else { + var win = window.open(url); + win.focus(); + } + } +} + +// 메뉴 드래그 중이라는 상황을 간직할 변수 +var tree_drag_manager = {obj:null, isDrag:false} +var tree_tmp_object = new Array(); +var tree_disappear = 0; + +/** + * 메뉴 드래깅을 위한 함수들 + **/ +// 드래깅시 보여줄 임시 object를 생성하는 함수 +function tree_create_tmp_object(obj) { + var tmp_obj = tree_tmp_object[obj.id]; + if(tmp_obj) return tmp_obj; + + tmp_obj = xCreateElement('DIV'); + tmp_obj.id = obj.id + '_tmp'; + tmp_obj.style.display = 'none'; + tmp_obj.style.position = 'absolute'; + tmp_obj.style.backgroundColor = obj.style.backgroundColor; + tmp_obj.style.fontSize = obj.style.fontSize; + tmp_obj.style.fontFamlily = obj.style.fontFamlily; + tmp_obj.style.color = "#5277ff"; + tmp_obj.style.opacity = 1; + tmp_obj.style.filter = 'alpha(opacity=100)'; + + document.body.appendChild(tmp_obj); + tree_tmp_object[obj.id] = tmp_obj; + return tmp_obj; +} + +// 기생성된 임시 object를 찾아서 return, 없으면 만들어서 return +function tree_get_tmp_object(obj) { + var tmp_obj = tree_tmp_object[obj.id]; + if(!tmp_obj) tmp_obj = tree_create_tmp_object(obj); + return tmp_obj; +} + +// 메뉴에 마우스 클릭이 일어난 시점에 드래그를 위한 제일 첫 동작 (해당 object에 각종 함수나 상태변수 설정) +function tree_drag_enable(child_obj, funcDragStart, funcDrag, funcDragEnd) { + // 클릭이 일어난 메뉴의 상위 object를 찾음 + var obj = child_obj.parentNode.parentNode; + + // 상위 object에 드래그 가능하다는 상태와 각 드래그 관련 함수를 설정 + obj.draggable = true; + obj.drag_start = funcDragStart; + obj.drag = funcDrag; + obj.drag_end = funcDragEnd; + obj.target_id = null; + + // 드래그 가능하지 않다면 드래그 가능하도록 상태 지정하고 mousemove이벤트 등록 + if (!tree_drag_manager.isDrag) { + tree_drag_manager.isDrag = true; + xAddEventListener(document, 'mousemove', tree_drag_mouse_move, false); + } + + // mousedown이벤트 값을 지정 + xAddEventListener(obj, 'mousedown', tree_mouse_down, false); +} + +// 드래그를 시작할때 호출되는 함수 (이동되는 형태를 보여주기 위한 작업을 함) +function tree_drag_start(tobj, px, py) { + var obj = tree_get_tmp_object(tobj); + + xInnerHtml(obj, xInnerHtml(tobj)); + + tobj.source_color = tobj.style.color; + tobj.style.color = "#BBBBBB"; + + xLeft(obj, xPageX(tobj)); + xTop(obj, xPageY(tobj)); + xWidth(obj, xWidth(tobj)); + xHeight(obj, xHeight(tobj)); + + xDisplay(obj, 'block'); +} + +// 드래그 시작후 마우스를 이동할때 발생되는 이벤트에 의해 실행되는 함수 +function tree_drag(tobj, dx, dy) { + var obj = tree_get_tmp_object(tobj); + xLeft(obj, parseInt(xPageX(obj),10) + parseInt(dx,10)); + xTop(obj, parseInt(xPageY(obj),10) + parseInt(dy,10)); + + var menu_id = tobj.id.replace(/menu_/,''); + menu_id = menu_id.replace(/_([0-9]+)$/,''); + if(!menu_id) return; + + for(var node_srl in blog_node_info_list[menu_id]) { + var zone_id = "menu_"+menu_id+"_"+node_srl; + var target_obj = xGetElementById(zone_id); + + var hh = parseInt(xHeight(target_obj),10); + var h = parseInt(parseInt(xHeight(target_obj),10)/2,10); + + var l = xPageX(target_obj); + var t = xPageY(target_obj); + var ll = parseInt(l,10) + parseInt(xWidth(target_obj),10); + var tt = parseInt(t,10) + hh; + + if( tobj != target_obj && tobj.xDPX >= l && tobj.xDPX <= ll) { + if(tobj.xDPY >= t && tobj.xDPY < tt-h) { + try { + target_obj.parentNode.insertBefore(tobj, target_obj); + tobj.target_id = target_obj.id; + } catch(e) { + } + } + } + } +} + +// 드래그 종료 (이동되는 object가 이동할 곳에 서서히 이동되는 것처럼 보이는 효과) +function tree_drag_end(tobj, px, py) { + var obj = tree_get_tmp_object(tobj); + tree_disappear = tree_disapear_object(obj, tobj); + tree_drag_disable(tobj.id); +} + +// 스르르 사라지게 함;; +function tree_disapear_object(obj, tobj) { + var it = 150; + var ib = 15; + + var x = parseInt(xPageX(obj),10); + var y = parseInt(xPageY(obj),10); + var ldt = (x - parseInt(xPageX(tobj),10)) / ib; + var tdt = (y - parseInt(xPageY(tobj),10)) / ib; + + return setInterval(function() { + if(ib < 1) { + clearInterval(tree_disappear); + xInnerHtml(tobj,xInnerHtml(obj)); + xInnerHtml(obj,''); + xDisplay(obj, 'none'); + return; + } + ib -= 5; + x-=ldt; + y-=tdt; + xLeft(obj, x); + xTop(obj, y); + }, it/ib); +} + +// 마우스다운 이벤트 발생시 호출됨 +function tree_mouse_down(e) { + var evt = new xEvent(e); + var obj = evt.target; + + while(obj && !obj.draggable) { + obj = xParent(obj, true); + } + + if(obj) { + xPreventDefault(e); + obj.xDPX = evt.pageX; + obj.xDPY = evt.pageY; + tree_drag_manager.obj = obj; + xAddEventListener(document, 'mouseup', tree_mouse_up, false); + if (obj.drag_start) obj.drag_start(obj, evt.pageX, evt.pageY); + } +} + +// 마우스 버튼을 놓았을때 동작될 함수 (각종 이벤트 해제 및 변수 설정 초기화) +function tree_mouse_up(e) { + if (tree_drag_manager.obj) { + xPreventDefault(e); + xRemoveEventListener(document, 'mouseup', tree_mouse_up, false); + + if (tree_drag_manager.obj.drag_end) { + var evt = new xEvent(e); + tree_drag_manager.obj.drag_end(tree_drag_manager.obj, evt.pageX, evt.pageY); + } + + tree_drag_manager.obj = null; + tree_drag_manager.isDrag = false; + } +} + +// 드래그할때의 object이동등을 담당 +function tree_drag_mouse_move(e) { + var evt = new xEvent(e); + + if (tree_drag_manager.obj) { + xPreventDefault(e); + + var obj = tree_drag_manager.obj; + var dx = evt.pageX - obj.xDPX; + var dy = evt.pageY - obj.xDPY; + + obj.xDPX = evt.pageX; + obj.xDPY = evt.pageY; + + if (obj.drag) { + obj.drag(obj, dx, dy); + } else { + xMoveTo(obj, xLeft(obj) + dx, xTop(obj) + dy); + } + } +} + +// 해당 object 에 더 이상 drag가 되지 않도록 설정 +function tree_drag_disable(id) { + if (!tree_drag_manager) return; + var obj = xGetElementById(id); + obj.draggable = false; + obj.drag_start = null; + obj.drag = null; + obj.drag_end = null; + obj.style.color = obj.source_color; + + xRemoveEventListener(obj, 'mousedown', tree_mouse_down, false); + + if(obj.id && obj.target_id && obj.id!=obj.target_id) { + var menu_id = obj.id.replace(/menu_/,''); + menu_id = menu_id.replace(/_([0-9]+)$/,''); + if(menu_id) { + var callback_move_func = node_move_callback_func[menu_id]; + if(callback_move_func) callback_move_func(menu_id, obj.id, obj.target_id); + } + } + obj.target_id = null; +} diff --git a/modules/blog/tpl/layout_setup.html b/modules/blog/tpl/layout_setup.html new file mode 100644 index 000000000..6c38dd166 --- /dev/null +++ b/modules/blog/tpl/layout_setup.html @@ -0,0 +1,12 @@ + + +
+ + + + +
+ {$lang->about_layout_setup} +
+ +
diff --git a/modules/blog/tpl/skin_info.html b/modules/blog/tpl/skin_info.html new file mode 100644 index 000000000..2256e1758 --- /dev/null +++ b/modules/blog/tpl/skin_info.html @@ -0,0 +1,140 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->skin_default_info}
{$lang->skin}{$skin_info->title}
{$lang->skin_maker}{$skin_info->maker->name} ({$skin_info->maker->email_address})
{$lang->skin_maker_homepage}{$skin_info->maker->homepage}
{$lang->date}{$skin_info->maker->date}
{$lang->description}{nl2br($skin_info->maker->description)}
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->extra_vars}
{$lang->colorset} + + + {@ $_img_info = getImageSize($val->screenshot); $_height = $_img_info[1]+40; $_width = $_img_info[0]+20; $_talign = "center"; } + + {@ $_width = 200; $_height = 20; $_talign = "left"; } + +
+ colorset==$val->name)-->checked="checked"/> + + +
+ {$val->title} + +
+
+ +
{$menu_info->title}
({$menu_name})
+ +
{$val->title} + + + + + + + + + + + + + value))-->checked="checked" class="checkbox" /> + + + + + + + + value)-->checked="checked"/> + + + + + + + +
+
+ + +
+ + + + + + +

{nl2br($val->description)}

+ +
+ +
+ +
+
+ + diff --git a/modules/blog/tpl/top_refresh.html b/modules/blog/tpl/top_refresh.html new file mode 100644 index 000000000..1c4d1632d --- /dev/null +++ b/modules/blog/tpl/top_refresh.html @@ -0,0 +1,4 @@ + diff --git a/modules/board/board.admin.controller.php b/modules/board/board.admin.controller.php new file mode 100644 index 000000000..8148d0746 --- /dev/null +++ b/modules/board/board.admin.controller.php @@ -0,0 +1,359 @@ +module_srl]; + + if($check_flag == 'remove') unset($flag_list[$document_srl]); + else $flag_list[$document_srl] = true; + + $_SESSION['document_management'][$this->module_srl] = $flag_list; + } + + /** + * @brief 세션에 담긴 선택글의 이동/ 삭제 + **/ + function procBoardAdminManageCheckedDocument() { + $type = Context::get('type'); + $module_srl = Context::get('target_board'); + $message_content = Context::get('message_content'); + if($message_content) $message_content = nl2br($message_content); + + $flag_list = $_SESSION['document_management'][$this->module_srl]; + + $document_srl_list = array_keys($flag_list); + $document_srl_count = count($document_srl_list); + + // 쪽지 발송 + if($message_content) { + + $oMemberController = &getController('member'); + $oDocumentModel = &getModel('document'); + + $logged_info = Context::get('logged_info'); + + $title = cut_str($message_content,10,'...'); + $sender_member_srl = $logged_info->member_srl; + + for($i=0;$i<$document_srl_count;$i++) { + $document_srl = $document_srl_list[$i]; + $oDocument = $oDocumentModel->getDocument($document_srl); + if(!$oDocument->get('member_srl') || $oDocument->get('member_srl')==$sender_member_srl) continue; + + if($type=='move') $purl = sprintf("%s", $oDocument->getPermanentUrl(), $oDocument->getPermanentUrl()); + else $purl = ""; + $content .= sprintf("
%s

%s
%s
%s",$message_content, $purl, $oDocument->getTitleText(), $oDocument->getContent()); + + $oMemberController->sendMessage($sender_member_srl, $oDocument->get('member_srl'), $title, $content, false); + } + } + + if($type == 'move') { + $oDocumentAdminController = &getAdminController('document'); + if(!$module_srl) return new Object(-1, 'fail_to_move'); + else { + $output = $oDocumentAdminController->moveDocumentModule($document_srl_list, $module_srl, $this->module_srl); + if(!$output->toBool()) return new Object(-1, 'fail_to_move'); + $msg_code = 'success_moved'; + $_SESSION['document_management'] = null; + } + + } elseif($type =='delete') { + $oDB = &DB::getInstance(); + $oDB->begin(); + $oDocumentController = &getController('document'); + for($i=0;$i<$document_srl_count;$i++) { + $document_srl = $document_srl_list[$i]; + $output = $oDocumentController->deleteDocument($document_srl, true); + if(!$output->toBool()) return new Object(-1, 'fail_to_delete'); + } + $oDB->commit(); + $msg_code = 'success_deleted'; + $_SESSION['document_management'] = null; + } + + $this->setMessage($msg_code); + } + + /** + * @brief 권한 추가 + **/ + function procBoardAdminInsertGrant() { + $module_srl = Context::get('module_srl'); + + // 현 모듈의 권한 목록을 가져옴 + $grant_list = $this->xml_info->grant; + + if(count($grant_list)) { + foreach($grant_list as $key => $val) { + $group_srls = Context::get($key); + if($group_srls) $arr_grant[$key] = explode('|@|',$group_srls); + } + $grants = serialize($arr_grant); + } + + $oModuleController = &getController('module'); + $oModuleController->updateModuleGrant($module_srl, $grants); + + $this->add('module_srl',Context::get('module_srl')); + $this->setMessage('success_registed'); + } + + /** + * @brief 스킨 정보 업데이트 + **/ + function procBoardAdminUpdateSkinInfo() { + // module_srl에 해당하는 정보들을 가져오기 + $module_srl = Context::get('module_srl'); + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + $skin = $module_info->skin; + + // 스킨의 정보를 구해옴 (extra_vars를 체크하기 위해서) + $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin); + + // 입력받은 변수들을 체크 (mo, act, module_srl, page등 기본적인 변수들 없앰) + $obj = Context::getRequestVars(); + unset($obj->act); + unset($obj->module_srl); + unset($obj->page); + + // 원 skin_info에서 extra_vars의 type이 image일 경우 별도 처리를 해줌 + if($skin_info->extra_vars) { + foreach($skin_info->extra_vars as $vars) { + if($vars->type!='image') continue; + + $image_obj = $obj->{$vars->name}; + + // 삭제 요청에 대한 변수를 구함 + $del_var = $obj->{"del_".$vars->name}; + unset($obj->{"del_".$vars->name}); + if($del_var == 'Y') { + @unlink($module_info->{$vars->name}); + continue; + } + + // 업로드 되지 않았다면 이전 데이터를 그대로 사용 + if(!$image_obj['tmp_name']) { + $obj->{$vars->name} = $module_info->{$vars->name}; + continue; + } + + // 정상적으로 업로드된 파일이 아니면 무시 + if(!is_uploaded_file($image_obj['tmp_name'])) { + unset($obj->{$vars->name}); + continue; + } + + // 이미지 파일이 아니어도 무시 + if(!eregi("\.(jpg|jpeg|gif|png)$", $image_obj['name'])) { + unset($obj->{$vars->name}); + continue; + } + + // 경로를 정해서 업로드 + $path = sprintf("./files/attach/images/%s/", $module_srl); + + // 디렉토리 생성 + if(!FileHandler::makeDir($path)) return false; + + $filename = $path.$image_obj['name']; + + // 파일 이동 + if(!move_uploaded_file($image_obj['tmp_name'], $filename)) { + unset($obj->{$vars->name}); + continue; + } + + // 변수를 바꿈 + unset($obj->{$vars->name}); + $obj->{$vars->name} = $filename; + } + } + + // serialize하여 저장 + $skin_vars = serialize($obj); + + $oModuleController = &getController('module'); + $oModuleController->updateModuleSkinVars($module_srl, $skin_vars); + + $this->setLayoutPath('./common/tpl'); + $this->setLayoutFile('default_layout.html'); + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile("top_refresh.html"); + } + + /** + * @brief 게시판 추가 + **/ + function procBoardAdminInsertBoard($args = null) { + // 일단 입력된 값들을 모두 받아서 db 입력항목과 그외 것으로 분리 + if(!$args) { + $args = Context::gets('module_srl','module_category_srl','board_name','layout_srl','skin','browser_title','description','is_default','header_text','footer_text','admin_id','open_rss'); + } + + $args->module = 'board'; + $args->mid = $args->board_name; + unset($args->board_name); + if($args->is_default!='Y') $args->is_default = 'N'; + + // 기본 값외의 것들을 정리 + $extra_var = delObjectVars(Context::getRequestVars(), $args); + if($extra_var->use_category!='Y') $extra_var->use_category = 'N'; + unset($extra_var->act); + unset($extra_var->page); + unset($extra_var->board_name); + unset($extra_var->module_srl); + + // 확장변수(20개로 제한된 고정 변수) 체크 + $user_defined_extra_vars = array(); + foreach($extra_var as $key => $val) { + if(substr($key,0,11)!='extra_vars_') continue; + preg_match('/^extra_vars_([0-9]+)_(.*)$/i', $key, $matches); + if(!$matches[1] || !$matches[2]) continue; + + $user_defined_extra_vars[$matches[1]]->{$matches[2]} = $val; + unset($extra_var->{$key}); + } + for($i=1;$i<=20;$i++) if(!$user_defined_extra_vars[$i]->name) unset($user_defined_extra_vars[$i]); + $extra_var->extra_vars = $user_defined_extra_vars; + + // module_srl이 넘어오면 원 모듈이 있는지 확인 + if($args->module_srl) { + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl); + + // 만약 원래 모듈이 없으면 새로 입력하기 위한 처리 + if($module_info->module_srl != $args->module_srl) unset($args->module_srl); + } + + // $extra_var를 serialize + $args->extra_vars = serialize($extra_var); + + // module 모듈의 controller 객체 생성 + $oModuleController = &getController('module'); + + // is_default=='Y' 이면 + if($args->is_default=='Y') $oModuleController->clearDefaultModule(); + + // module_srl의 값에 따라 insert/update + if(!$args->module_srl) { + $output = $oModuleController->insertModule($args); + $msg_code = 'success_registed'; + + // 파일업로드, 댓글 파일업로드, 관리에 대한 권한 지정 + if($output->toBool()) { + $oMemberModel = &getModel('member'); + $admin_group = $oMemberModel->getAdminGroup(); + $admin_group_srl = $admin_group->group_srl; + + $module_srl = $output->get('module_srl'); + $grants = serialize(array('fileupload'=>array($admin_group_srl), 'comment_fileupload'=>array($admin_group_srl), 'manager'=>array($admin_group_srl))); + + $oModuleController->updateModuleGrant($module_srl, $grants); + } + } else { + $output = $oModuleController->updateModule($args); + $msg_code = 'success_updated'; + } + + if(!$output->toBool()) return $output; + + $this->add('page',Context::get('page')); + $this->add('module_srl',$output->get('module_srl')); + $this->setMessage($msg_code); + } + + /** + * @brief 게시판 삭제 + **/ + function procBoardAdminDeleteBoard() { + $module_srl = Context::get('module_srl'); + + // 원본을 구해온다 + $oModuleController = &getController('module'); + $output = $oModuleController->deleteModule($module_srl); + if(!$output->toBool()) return $output; + + $this->add('module','board'); + $this->add('page',Context::get('page')); + $this->setMessage('success_deleted'); + } + + /** + * @brief 카테고리 추가 + **/ + function procBoardAdminInsertCategory() { + // 일단 입력된 값들을 모두 받아서 db 입력항목과 그외 것으로 분리 + $module_srl = Context::get('module_srl'); + $category_title = Context::get('category_title'); + + // module_srl이 있으면 원본을 구해온다 + $oDocumentController = &getAdminController('document'); + $output = $oDocumentController->insertCategory($module_srl, $category_title); + if(!$output->toBool()) return $output; + + $this->add('page',Context::get('page')); + $this->add('module_srl',$module_srl); + $this->setMessage('success_registed'); + } + + /** + * @brief 카테고리의 내용 수정 + **/ + function procBoardAdminUpdateCategory() { + $module_srl = Context::get('module_srl'); + $category_srl = Context::get('category_srl'); + $mode = Context::get('mode'); + + $oDocumentModel = &getModel('document'); + $oDocumentController = &getAdminController('document'); + + switch($mode) { + case 'up' : + $output = $oDocumentController->moveCategoryUp($category_srl); + $msg_code = 'success_moved'; + break; + case 'down' : + $output = $oDocumentController->moveCategoryDown($category_srl); + $msg_code = 'success_moved'; + break; + case 'delete' : + $output = $oDocumentController->deleteCategory($category_srl); + $msg_code = 'success_deleted'; + break; + case 'update' : + $selected_category = $oDocumentModel->getCategory($category_srl); + $args->category_srl = $selected_category->category_srl; + $args->title = Context::get('category_title'); + $args->list_order = $selected_category->list_order; + $output = $oDocumentController->updateCategory($args); + $msg_code = 'success_updated'; + break; + } + if(!$output->toBool()) return $output; + + $this->add('module_srl', $module_srl); + $this->setMessage($msg_code); + } + } +?> diff --git a/modules/board/board.admin.view.php b/modules/board/board.admin.view.php new file mode 100644 index 000000000..4f0d270db --- /dev/null +++ b/modules/board/board.admin.view.php @@ -0,0 +1,241 @@ +module_srl) { + $module_srl = $this->module_srl; + Context::set('module_srl', $module_srl); + } + + // module model 객체 생성 + $oModuleModel = &getModel('module'); + + // module_srl이 넘어오면 해당 모듈의 정보를 미리 구해 놓음 + if($module_srl) { + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + if(!$module_info) { + Context::set('module_srl',''); + $this->act = 'list'; + } else { + $this->module_info = $module_info; + Context::set('module_info',$module_info); + } + } + + // 모듈 카테고리 목록을 구함 + $module_category = $oModuleModel->getModuleCategories(); + Context::set('module_category', $module_category); + + // 템플릿 경로 지정 (board의 경우 tpl에 관리자용 템플릿 모아놓음) + $template_path = sprintf("%stpl/",$this->module_path); + $this->setTemplatePath($template_path); + } + + /** + * @brief 게시판 관리 목록 보여줌 + **/ + function dispBoardAdminContent() { + // 등록된 board 모듈을 불러와 세팅 + $args->sort_index = "module_srl"; + $args->page = Context::get('page'); + $args->list_count = 40; + $args->page_count = 10; + $args->s_module_category_srl = Context::get('module_category_srl'); + $output = executeQuery('board.getBoardList', $args); + + // 템플릿에 쓰기 위해서 context::set + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('board_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + // 템플릿 파일 지정 + $this->setTemplateFile('index'); + } + + /** + * @brief 선택된 게시판의 정보 출력 + **/ + function dispBoardAdminBoardInfo() { + + // module_srl 값이 없다면 그냥 index 페이지를 보여줌 + if(!Context::get('module_srl')) return $this->dispBoardAdminContent(); + + // 레이아웃이 정해져 있다면 레이아웃 정보를 추가해줌(layout_title, layout) + if($this->module_info->layout_srl) { + $oLayoutModel = &getModel('layout'); + $layout_info = $oLayoutModel->getLayout($this->module_info->layout_srl); + $this->module_info->layout = $layout_info->layout; + $this->module_info->layout_title = $layout_info->layout_title; + } + + // 정해진 스킨이 있으면 해당 스킨의 정보를 구함 + if($this->module_info->skin) { + $oModuleModel = &getModel('module'); + $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $this->module_info->skin); + $this->module_info->skin_title = $skin_info->title; + } + + // 템플릿 파일 지정 + $this->setTemplateFile('board_info'); + } + + /** + * @brief 게시판 추가 폼 출력 + **/ + function dispBoardAdminInsertBoard() { + + // 스킨 목록을 구해옴 + $oModuleModel = &getModel('module'); + $skin_list = $oModuleModel->getSkins($this->module_path); + Context::set('skin_list',$skin_list); + + // 레이아웃 목록을 구해옴 + $oLayoutMode = &getModel('layout'); + $layout_list = $oLayoutMode->getLayoutList(); + Context::set('layout_list', $layout_list); + + // 템플릿 파일 지정 + $this->setTemplateFile('board_insert'); + } + + /** + * @brief 게시판 삭제 화면 출력 + **/ + function dispBoardAdminDeleteBoard() { + + if(!Context::get('module_srl')) return $this->dispBoardAdminContent(); + + $module_info = Context::get('module_info'); + + $oDocumentModel = &getModel('document'); + $document_count = $oDocumentModel->getDocumentCount($module_info->module_srl); + $module_info->document_count = $document_count; + + Context::set('module_info',$module_info); + + // 템플릿 파일 지정 + $this->setTemplateFile('board_delete'); + } + + /** + * @brief 스킨 정보 보여줌 + **/ + function dispBoardAdminSkinInfo() { + + // 현재 선택된 모듈의 스킨의 정보 xml 파일을 읽음 + $module_info = Context::get('module_info'); + $skin = $module_info->skin; + + $oModuleModel = &getModel('module'); + $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin); + + // skin_info에 extra_vars 값을 지정 + if(count($skin_info->extra_vars)) { + foreach($skin_info->extra_vars as $key => $val) { + $name = $val->name; + $type = $val->type; + $value = $module_info->{$name}; + if($type=="checkbox"&&!$value) $value = array(); + $skin_info->extra_vars[$key]->value= $value; + } + } + + Context::set('skin_info', $skin_info); + $this->setTemplateFile('skin_info'); + } + + /** + * @brief 카테고리의 정보 출력 + **/ + function dispBoardAdminCategoryInfo() { + + // module_srl을 구함 + $module_srl = Context::get('module_srl'); + + // 카테고리의 목록을 구해옴 + $oDocumentModel = &getModel('document'); + $category_list = $oDocumentModel->getCategoryList($module_srl); + Context::set('category_list', $category_list); + + // 수정하려는 카테고리가 있다면해당 카테고리의 정보를 가져옴 + $category_srl = Context::get('category_srl'); + + if($category_srl) { + + $selected_category = $oDocumentModel->getCategory($category_srl); + + if(!$selected_category) Context::set('category_srl',''); + else Context::set('selected_category',$selected_category); + + $this->setTemplateFile('category_update_form'); + + } else { + + $this->setTemplateFile('category_list'); + + } + } + + /** + * @brief 권한 목록 출력 + **/ + function dispBoardAdminGrantInfo() { + // module_srl을 구함 + $module_srl = Context::get('module_srl'); + + // module.xml에서 권한 관련 목록을 구해옴 + $grant_list = $this->xml_info->grant; + Context::set('grant_list', $grant_list); + + // 권한 그룹의 목록을 가져온다 + $oMemberModel = &getModel('member'); + $group_list = $oMemberModel->getGroups(); + Context::set('group_list', $group_list); + + $this->setTemplateFile('grant_list'); + } + + /** + * @brief 선택한 목록 출력 + **/ + function dispBoardAdminManageDocument() { + // 선택한 목록을 세션에서 가져옴 + $flag_list = $_SESSION['document_management'][$this->module_srl]; + + // 목록이 있으면 게시글을 가져옴 + if(count($flag_list)) $document_srl_list = array_keys($flag_list); + if(is_array($document_srl_list) && count($document_srl_list)) { + $oDocumentModel = &getModel('document'); + $document_list = $oDocumentModel->getDocuments($document_srl_list, $this->grant->is_admin); + Context::set('document_list', $document_list); + } + + // 게시판의 목록을 가져옴 + $output = executeQuery('board.getAllBoard', $args); + $board_list = $output->data; + if($board_list && !is_array($board_list)) $board_list = array($board_list); + Context::set('board_list', $board_list); + + // 팝업 레이아웃 선택 + $this->setLayoutPath('./common/tpl'); + $this->setLayoutFile('popup_layout'); + + $this->setTemplateFile('checked_list'); + } + } +?> diff --git a/modules/board/board.class.php b/modules/board/board.class.php new file mode 100644 index 000000000..60a919e37 --- /dev/null +++ b/modules/board/board.class.php @@ -0,0 +1,76 @@ +insertActionForward('board', 'view', 'dispBoardAdminContent'); + $oModuleController->insertActionForward('board', 'view', 'dispBoardAdminBoardInfo'); + $oModuleController->insertActionForward('board', 'view', 'dispBoardAdminInsertBoard'); + $oModuleController->insertActionForward('board', 'view', 'dispBoardAdminDeleteBoard'); + $oModuleController->insertActionForward('board', 'view', 'dispBoardAdminSkinInfo'); + $oModuleController->insertActionForward('board', 'view', 'dispBoardAdminCategoryInfo'); + $oModuleController->insertActionForward('board', 'view', 'dispBoardAdminGrantInfo'); + $oModuleController->insertActionForward('board', 'controller', 'procBoardAdminUpdateSkinInfo'); + + // 기본 게시판 생성 + $output = executeQuery('module.getDefaultMidInfo'); + if($output->data) return new Object(); + + // 기본 모듈을 찾음 + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByMid(); + + // 기본 모듈이 없으면 새로 등록 + if(!$module_info->module_srl) { + $args->board_name = 'board'; + $args->browser_title = 'test module'; + $args->is_default = 'Y'; + $args->skin = 'xe_list'; + + // board 라는 이름의 모듈이 있는지 확인 + $module_info = $oModuleModel->getModuleInfoByMid($args->board_name); + if($module_info->module_srl) $args->module_srl = $module_info->module_srl; + + // 게시판 controller 생성 + $oBoardController = &getAdminController('board'); + $oBoardController->procBoardAdminInsertBoard($args); + } + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + + } +?> diff --git a/modules/board/board.controller.php b/modules/board/board.controller.php new file mode 100644 index 000000000..be4a9eed9 --- /dev/null +++ b/modules/board/board.controller.php @@ -0,0 +1,225 @@ +grant->write_document) return new Object(-1, 'msg_not_permitted'); + + // 글작성시 필요한 변수를 세팅 + $obj = Context::getRequestVars(); + $obj->module_srl = $this->module_srl; + if($obj->is_notice!='Y'||!$this->grant->manager) $obj->is_notice = 'N'; + + // document module의 model 객체 생성 + $oDocumentModel = &getModel('document'); + + // document module의 controller 객체 생성 + $oDocumentController = &getController('document'); + + // 이미 존재하는 글인지 체크 + $oDocument = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager); + + // 이미 존재하는 경우 수정 + if($oDocument->isExists() && $oDocument->document_srl == $obj->document_srl) { + $output = $oDocumentController->updateDocument($oDocument, $obj); + $msg_code = 'success_updated'; + + // 그렇지 않으면 신규 등록 + } else { + $output = $oDocumentController->insertDocument($obj); + $msg_code = 'success_registed'; + $obj->document_srl = $output->get('document_srl'); + } + + // 오류 발생시 멈춤 + if(!$output->toBool()) return $output; + + // 트랙백이 있으면 트랙백 발송 + $trackback_url = Context::get('trackback_url'); + $trackback_charset = Context::get('trackback_charset'); + if($trackback_url) { + $oTrackbackController = &getController('trackback'); + $oTrackbackController->sendTrackback($obj, $trackback_url, $trackback_charset); + } + + // 결과를 리턴 + $this->add('mid', Context::get('mid')); + $this->add('document_srl', $output->get('document_srl')); + + // 성공 메세지 등록 + $this->setMessage($msg_code); + } + + /** + * @brief 문서 삭제 + **/ + function procBoardDeleteDocument() { + // 문서 번호 확인 + $document_srl = Context::get('document_srl'); + + // 문서 번호가 없다면 오류 발생 + if(!$document_srl) return $this->doError('msg_invalid_document'); + + // document module model 객체 생성 + $oDocumentController = &getController('document'); + + // 삭제 시도 + $output = $oDocumentController->deleteDocument($document_srl, $this->grant->manager); + if(!$output->toBool()) return $output; + + // 성공 메세지 등록 + $this->add('mid', Context::get('mid')); + $this->add('page', $output->get('page')); + $this->setMessage('success_deleted'); + } + + /** + * @brief 추천 + **/ + function procBoardVoteDocument() { + // document module controller 객체 생성 + $oDocumentController = &getController('document'); + + $document_srl = Context::get('document_srl'); + return $oDocumentController->updateVotedCount($document_srl); + } + + /** + * @brief 코멘트 추가 + **/ + function procBoardInsertComment() { + // 권한 체크 + if(!$this->grant->write_comment) return new Object(-1, 'msg_not_permitted'); + + // 댓글 입력에 필요한 데이터 추출 + $obj = Context::gets('document_srl','comment_srl','parent_srl','content','password','nick_name','nick_name','member_srl','email_address','homepage'); + $obj->module_srl = $this->module_srl; + + // comment 모듈의 model 객체 생성 + $oCommentModel = &getModel('comment'); + + // comment 모듈의 controller 객체 생성 + $oCommentController = &getController('comment'); + + // comment_srl이 존재하는지 체크 + $comment = $oCommentModel->getComment($obj->comment_srl, $this->grant->manager); + + // comment_srl이 없을 경우 신규 입력 + if($comment->comment_srl != $obj->comment_srl) { + + // parent_srl이 있으면 답변으로 + if($obj->parent_srl) { + $parent_comment = $oCommentModel->getComment($obj->parent_srl); + if(!$parent_comment->comment_srl) return new Object(-1, 'msg_invalid_request'); + + $output = $oCommentController->insertComment($obj); + + // 없으면 신규 + } else { + $output = $oCommentController->insertComment($obj); + } + + // comment_srl이 있으면 수정으로 + } else { + $obj->parent_srl = $comment->parent_srl; + $output = $oCommentController->updateComment($obj, $this->grant->manager); + $comment_srl = $obj->comment_srl; + } + + if(!$output->toBool()) return $output; + + $this->setMessage('success_registed'); + $this->add('mid', Context::get('mid')); + $this->add('document_srl', $obj->document_srl); + $this->add('comment_srl', $comment_srl); + } + + /** + * @brief 코멘트 삭제 + **/ + function procBoardDeleteComment() { + // 댓글 번호 확인 + $comment_srl = Context::get('comment_srl'); + if(!$comment_srl) return $this->doError('msg_invalid_request'); + + // comment 모듈의 controller 객체 생성 + $oCommentController = &getController('comment'); + + $output = $oCommentController->deleteComment($comment_srl, $this->grant->manager); + if(!$output->toBool()) return $output; + + $this->add('mid', Context::get('mid')); + $this->add('page', Context::get('page')); + $this->add('document_srl', $output->get('document_srl')); + $this->setMessage('success_deleted'); + } + + /** + * @brief 엮인글 삭제 + **/ + function procBoardDeleteTrackback() { + $trackback_srl = Context::get('trackback_srl'); + + // trackback module의 controller 객체 생성 + $oTrackbackController = &getController('trackback'); + $output = $oTrackbackController->deleteTrackback($trackback_srl, $this->grant->manager); + if(!$output->toBool()) return $output; + + $this->add('mid', Context::get('mid')); + $this->add('page', Context::get('page')); + $this->add('document_srl', $output->get('document_srl')); + $this->setMessage('success_deleted'); + } + + /** + * @brief 문서와 댓글의 비밀번호를 확인 + **/ + function procBoardVerificationPassword() { + // 비밀번호와 문서 번호를 받음 + $password = md5(Context::get('password')); + + $document_srl = Context::get('document_srl'); + $comment_srl = Context::get('comment_srl'); + + // comment_srl이 있을 경우 댓글이 대상 + if($comment_srl) { + // 문서번호에 해당하는 글이 있는지 확인 + $oCommentModel = &getModel('comment'); + $data = $oCommentModel->getComment($comment_srl); + if(!$data) return new Object(-1, 'msg_invalid_request'); + + // 문서의 비밀번호와 입력한 비밀번호의 비교 + if($data->password != $password) return new Object(-1, 'msg_invalid_password'); + + $oCommentController = &getController('comment'); + $oCommentController->addGrant($comment_srl); + } else { + // 문서번호에 해당하는 글이 있는지 확인 + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + if(!$oDocument->isExists()) return new Object(-1, 'msg_invalid_request'); + + // 문서의 비밀번호와 입력한 비밀번호의 비교 + if($oDocument->get('password') != $password) return new Object(-1, 'msg_invalid_password'); + + $oDocument->setGrant(); + } + } + + } +?> diff --git a/modules/board/board.view.php b/modules/board/board.view.php new file mode 100644 index 000000000..aa2f2657a --- /dev/null +++ b/modules/board/board.view.php @@ -0,0 +1,370 @@ +module_info->use_category=='Y') { + $oDocumentModel = &getModel('document'); + $this->category_list = $oDocumentModel->getCategoryList($this->module_srl); + Context::set('category_list', $this->category_list); + } + + // 템플릿에서 사용할 변수를 Context::set() + if($this->module_srl) Context::set('module_srl',$this->module_srl); + + Context::set('module_info',$this->module_info); + + // 기본 모듈 정보들 설정 + $this->list_count = $this->module_info->list_count?$this->module_info->list_count:20; + $this->page_count = $this->module_info->page_count?$this->module_info->page_count:10; + + // 스킨 템플릿 경로 지정 + $template_path = sprintf("%sskins/%s/",$this->module_path, $this->module_info->skin); + $this->setTemplatePath($template_path); + + // rss url + if($this->module_info->open_rss != 'N') Context::set('rss_url', getUrl('','mid',$this->mid,'act','rss')); + } + + /** + * @brief 목록 및 선택된 글 출력 + **/ + function dispBoardContent() { + // 권한 체크 + if(!$this->grant->list) return $this->dispBoardMessage('msg_not_permitted'); + + // 템플릿에서 사용할 검색옵션 세팅 + $count_search_option = count($this->search_option); + for($i=0;$i<$count_search_option;$i++) { + $search_option[$this->search_option[$i]] = Context::getLang($this->search_option[$i]); + } + + // 확장변수에서도 검색이 설정되어 있는지 확인 + for($i=1;$i<=20;$i++) { + $ex_name = $this->module_info->extra_vars[$i]->name; + $ex_search = $this->module_info->extra_vars[$i]->search; + if($ex_name && $ex_search == 'Y') { + $search_option['extra_vars'.$i] = $ex_name; + } + } + Context::set('search_option', $search_option); + + // 목록 구현에 필요한 변수들을 가져온다 + $document_srl = Context::get('document_srl'); + $page = Context::get('page'); + + // document 객체를 생성. 기본 데이터 구조의 경우 document모듈만 쓰면 만사 해결.. -_-; + $oDocumentModel = &getModel('document'); + + // 선택된 문서 표시를 위한 객체 생성 + $oDocument = $oDocumentModel->getDocument(0, $this->grant->manager); + + // document_srl이 있다면 해당 글을 구해와서 $oDocument로 세팅 + if($this->grant->view && $document_srl) { + + // 글을 구함 + $oDocument->setDocument($document_srl); + if($this->grant->manager) $oDocument->setGrant(); + + if(!$oDocument->isExists()) { + Context::set('document_srl','',true); + } else { + // 브라우저 타이틀 설정 + Context::setBrowserTitle($oDocument->getTitleText()); + + // 조회수 증가 + $oDocument->updateReadedCount(); + } + + } + Context::set('oDocument', $oDocument); + + // 댓글에디터 설정 + $this->setCommentEditor(0, 100); + + // 만약 document_srl은 있는데 page가 없다면 글만 호출된 경우 page를 구해서 세팅해주자.. + if($document_srl && !$page && ($oDocument->isExists()&&!$oDocument->isNotice())) { + $page = $oDocumentModel->getDocumentPage($document_srl, $this->module_srl, $this->list_count); + Context::set('page', $page); + } + + // 목록을 구하기 위한 옵션 + $args->module_srl = $this->module_srl; ///< 현재 모듈의 module_srl + $args->page = $page; ///< 페이지 + $args->list_count = $this->list_count; ///< 한페이지에 보여줄 글 수 + $args->page_count = $this->page_count; ///< 페이지 네비게이션에 나타날 페이지의 수 + + // 검색 옵션 + $args->search_target = Context::get('search_target'); ///< 검색 대상 (title, contents...) + $args->search_keyword = Context::get('search_keyword'); ///< 검색어 + if($this->module_info->use_category=='Y') $args->category_srl = Context::get('category'); ///< 카테고리 사용시 선택된 카테고리 + $args->sort_index = Context::get('sort_index'); + $args->order_type = Context::get('order_type'); + + // 스킨에서 설정한 기본 정렬 대상을 구함 + if(!$args->sort_index) { + switch($this->module_info->order_target) { + case "updated" : + $args->sort_index = "update_order"; + $args->order_type = "asc"; + break; + default : + $args->sort_index = "list_order"; + $args->order_type = "asc"; + break; + } + } + + // 목록 구함, document->getDocumentList 에서 걍 알아서 다 해버리는 구조이다... (아.. 이거 나쁜 버릇인데.. ㅡ.ㅜ 어쩔수 없다) + $output = $oDocumentModel->getDocumentList($args); + + // 템플릿에 쓰기 위해서 document_model::getDocumentList() 의 return object에 있는 값들을 세팅 + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('document_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + // 관리자일 경우 체크한 문서들의 목록을 세팅 + if($this->grant->is_admin) { + Context::set('check_list',$_SESSION['document_management'][$this->module_srl]); + } + + $this->setTemplateFile('list'); + } + + /** + * @brief 글 작성 화면 출력 + **/ + function dispBoardWrite() { + // 권한 체크 + if(!$this->grant->write_document) return $this->dispBoardMessage('msg_not_permitted'); + + // GET parameter에서 document_srl을 가져옴 + $document_srl = Context::get('document_srl'); + + // document 모듈 객체 생성 + $oDocumentModel = &getModel('document'); + + $oDocument = $oDocumentModel->getDocument(0, $this->grant->manager); + $oDocument->setDocument($document_srl); + + if(!$oDocument->isExists()) Context::set('document_srl',''); + + if(!$document_srl) $document_srl = getNextSequence(); + + // 글을 수정하려고 할 경우 권한이 없는 경우 비밀번호 입력화면으로 + if($oDocument->isExists()&&!$oDocument->isGranted()) return $this->setTemplateFile('input_password_form'); + + Context::set('document_srl',$document_srl); + Context::set('oDocument', $oDocument); + + // 에디터 모듈의 getEditor를 호출하여 세팅 + $oEditorModel = &getModel('editor'); + $option->allow_fileupload = $this->grant->fileupload; + $option->enable_autosave = true; + $option->enable_default_component = true; + $option->enable_component = true; + $option->resizable = true; + $option->height = 600; + $editor = $oEditorModel->getEditor($document_srl, $option); + Context::set('editor', $editor); + + // 확장변수처리를 위해 xml_js_filter를 직접 header에 적용 + $oDocumentController = &getController('document'); + $oDocumentController->addXmlJsFilter($this->module_info); + + $this->setTemplateFile('write_form'); + } + + /** + * @brief 문서 삭제 화면 출력 + **/ + function dispBoardDelete() { + // 권한 체크 + if(!$this->grant->write_document) return $this->dispBoardMessage('msg_not_permitted'); + + // 삭제할 문서번호를 가져온다 + $document_srl = Context::get('document_srl'); + + // 지정된 글이 있는지 확인 + if($document_srl) { + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + } + + // 삭제하려는 글이 없으면 에러 + if(!$oDocument->isExists()) return $this->dispBoardContent(); + + // 권한이 없는 경우 비밀번호 입력화면으로 + if(!$oDocument->isGranted()) return $this->setTemplateFile('input_password_form'); + + Context::set('oDocument',$oDocument); + + $this->setTemplateFile('delete_form'); + } + + /** + * @brief 댓글의 답글 화면 출력 + **/ + function dispBoardReplyComment() { + // 권한 체크 + if(!$this->grant->write_comment) return $this->dispBoardMessage('msg_not_permitted'); + + // 목록 구현에 필요한 변수들을 가져온다 + $document_srl = Context::get('document_srl'); + $parent_srl = Context::get('comment_srl'); + + // 지정된 원 댓글이 없다면 오류 + if(!$parent_srl) return new Object(-1, 'msg_invalid_request'); + + // 해당 댓글를 찾아본다 + $oCommentModel = &getModel('comment'); + $source_comment = $oCommentModel->getComment($parent_srl, $this->grant->manager); + + // 댓글이 없다면 오류 + if(!$source_comment) return $this->dispBoardMessage('msg_invalid_request'); + + // 필요한 정보들 세팅 + Context::set('document_srl',$document_srl); + Context::set('parent_srl',$parent_srl); + Context::set('comment_srl',NULL); + Context::set('source_comment',$source_comment); + + // 댓글 에디터 세팅 + $this->setCommentEditor(0, 400); + + $this->setTemplateFile('comment_form'); + } + + /** + * @brief 댓글 수정 폼 출력 + **/ + function dispBoardModifyComment() { + // 권한 체크 + if(!$this->grant->write_comment) return $this->dispBoardMessage('msg_not_permitted'); + + // 목록 구현에 필요한 변수들을 가져온다 + $document_srl = Context::get('document_srl'); + $comment_srl = Context::get('comment_srl'); + + // 지정된 댓글이 없다면 오류 + if(!$comment_srl) return new Object(-1, 'msg_invalid_request'); + + // 해당 댓글를 찾아본다 + $oCommentModel = &getModel('comment'); + $comment = $oCommentModel->getComment($comment_srl, $this->grant->manager); + + // 댓글이 없다면 오류 + if(!$comment) return $this->dispBoardMessage('msg_invalid_request'); + + Context::set('document_srl',$comment->document_srl); + + // 글을 수정하려고 할 경우 권한이 없는 경우 비밀번호 입력화면으로 + if($comment_srl&&$comment&&!$comment->is_granted) return $this->setTemplateFile('input_password_form'); + + // 필요한 정보들 세팅 + Context::set('comment_srl',$comment_srl); + Context::set('comment', $comment); + + // 댓글 에디터 세팅 + $this->setCommentEditor($comment_srl, 400); + + $this->setTemplateFile('comment_form'); + } + + /** + * @brief 댓글 삭제 화면 출력 + **/ + function dispBoardDeleteComment() { + // 권한 체크 + if(!$this->grant->write_comment) return $this->dispBoardMessage('msg_not_permitted'); + + // 삭제할 댓글번호를 가져온다 + $comment_srl = Context::get('comment_srl'); + + // 삭제하려는 댓글가 있는지 확인 + if($comment_srl) { + $oCommentModel = &getModel('comment'); + $comment = $oCommentModel->getComment($comment_srl, $this->grant->manager); + } + + // 삭제하려는 글이 없으면 에러 + if(!$comment) return $this->dispBoardContent(); + + Context::set('document_srl',$comment->document_srl); + + // 권한이 없는 경우 비밀번호 입력화면으로 + if($comment_srl&&$comment&&!$comment->is_granted) return $this->setTemplateFile('input_password_form'); + + Context::set('comment',$comment); + + $this->setTemplateFile('delete_comment_form'); + } + + /** + * @brief 엮인글 삭제 화면 출력 + **/ + function dispBoardDeleteTrackback() { + // 삭제할 댓글번호를 가져온다 + $trackback_srl = Context::get('trackback_srl'); + + // 삭제하려는 댓글가 있는지 확인 + $oTrackbackModel = &getModel('trackback'); + $output = $oTrackbackModel->getTrackback($trackback_srl); + $trackback = $output->data; + + // 삭제하려는 글이 없으면 에러 + if(!$trackback) return $this->dispBoardContent(); + + Context::set('trackback',$trackback); + + $this->setTemplateFile('delete_trackback_form'); + } + + /** + * @brief 메세지 출력 + **/ + function dispBoardMessage($msg_code) { + $msg = Context::getLang($msg_code); + if(!$msg) $msg = $msg_code; + Context::set('message', $msg); + $this->setTemplateFile('message'); + } + + /** + * @brief 댓글의 editor 를 세팅 + * 댓글의 경우 수정하는 경우가 아니라면 고유값이 없음.\n + * 따라서 고유값이 없을 경우 고유값을 가져와서 지정해 주어야 함 + **/ + function setCommentEditor($comment_srl=0, $height = 100) { + if(!$comment_srl) { + $comment_srl = getNextSequence(); + Context::set('comment_srl', $comment_srl); + } + + // 에디터 모듈의 getEditor를 호출하여 세팅 + $oEditorModel = &getModel('editor'); + $option->allow_fileupload = $this->grant->comment_fileupload; + $option->enable_autosave = false; + $option->enable_default_component = true; + $option->enable_component = true; + $option->resizable = true; + $option->height = $height; + $comment_editor = $oEditorModel->getEditor($comment_srl, $option); + Context::set('comment_editor', $comment_editor); + } + + } +?> diff --git a/modules/board/conf/info.xml b/modules/board/conf/info.xml new file mode 100644 index 000000000..6ca214823 --- /dev/null +++ b/modules/board/conf/info.xml @@ -0,0 +1,20 @@ + + + 게시판 + 版面 + Board + Boletín + 掲示板 + + 제로 + zero + zero + zero + Zero + 게시판의 기능을 담당하는 모듈. 게시판의 생성/추가 관리등의 관리자 기능도 포함합니다. + 给用户提供相应版面功能,将包含版面的生成/添加及版面管理等管理员功能。 + Module of the board''s function. Also includes administrator functions such as creating/managing boards. + Es el módulo para funciónar a boletín. Incluye funciónes de administración como crear/ agregar o manejar boletín. + 掲示板の機能を担うモジュールです。掲示板の生成・追加・管理などの管理者機能も含まれています。 + + diff --git a/modules/board/conf/module.xml b/modules/board/conf/module.xml new file mode 100644 index 000000000..ee32f8eb8 --- /dev/null +++ b/modules/board/conf/module.xml @@ -0,0 +1,86 @@ + + + + + 목록 + 目录 + リスト + list + + + 열람 + 浏览 + 閲覧 + view + + + 글 작성 + 发表新主题 + 書き込み作成 + write document + + + 댓글 작성 + 发表评论 + コメント作成 + write comment + + + 파일 첨부 + 上传文件 + ファイル添付 + file upload + + + 댓글 파일 첨부 + 上传文件 + コメントファイル添付 + comment file upload + + + 관리 + 管理 + 管理 + manager + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/board/lang/en.lang.php b/modules/board/lang/en.lang.php new file mode 100644 index 000000000..bbedb7395 --- /dev/null +++ b/modules/board/lang/en.lang.php @@ -0,0 +1,17 @@ +board = "board"; + + // words used in button + $lang->cmd_board_list = 'Board list'; + $lang->cmd_module_config = 'Common board setting'; + $lang->cmd_view_info = 'Board info'; + $lang->move_target_module = "Target module for changing position"; + + $lang->about_board = "This module is for creating and managing boards.\nSelect the module's name from the list after creating one to configurate specifically.\nBe careful with board's module name, since it will be the url. (ex : http://domain/zb/?mid=modulename)"; +?> diff --git a/modules/board/lang/es.lang.php b/modules/board/lang/es.lang.php new file mode 100644 index 000000000..2b14c4def --- /dev/null +++ b/modules/board/lang/es.lang.php @@ -0,0 +1,17 @@ +board = "Boletín"; + + // Palabras utiliza en botónes + $lang->cmd_board_list = 'Lista de boletín'; + $lang->cmd_module_config = 'configuración comun de boletínes'; + $lang->cmd_view_info = 'ver información de boletín'; + $lang->move_target_module = "Módulo para mover"; + + $lang->about_board = "Es el módulo para crear y manejar boletínes.\nDespues de crear un boletín, haga clic en nombre de módulos para configuración mas detallado.\nEl nombre de módulo es nombre de URL, sea cuidoso deseando el nombre. (ej : http://dominio/zb/?mid=nombre de módulo)"; +?> diff --git a/modules/board/lang/jp.lang.php b/modules/board/lang/jp.lang.php new file mode 100644 index 000000000..1ea144b4f --- /dev/null +++ b/modules/board/lang/jp.lang.php @@ -0,0 +1,17 @@ +board = "掲示板"; + + // ボタンに使用する用語 + $lang->cmd_board_list = '掲示板リスト'; + $lang->cmd_module_config = '掲示板共通設定'; + $lang->cmd_view_info = '掲示板情報'; + $lang->move_target_module = "移動対象モジュール"; + + $lang->about_board = "掲示板を生成、管理できる掲示板モジュールです。生成後、リストからモジュール名を選択すると詳細な設定ができます。掲示板のモジュール名はURLになりますので注意してください。 (ex : http://ドメイン/zb/?mid=モジュール名)"; +?> diff --git a/modules/board/lang/ko.lang.php b/modules/board/lang/ko.lang.php new file mode 100644 index 000000000..3a1e1070f --- /dev/null +++ b/modules/board/lang/ko.lang.php @@ -0,0 +1,17 @@ +board = "게시판"; + + // 버튼에 사용되는 언어 + $lang->cmd_board_list = '게시판 목록'; + $lang->cmd_module_config = '게시판 공통 설정'; + $lang->cmd_view_info = '게시판 정보'; + $lang->move_target_module = "이동 대상 모듈"; + + $lang->about_board = "게시판을 생성하고 관리할 수 있는 게시판 모듈입니다.\n생성하신 후 목록에서 모듈이름을 선택하시면 자세한 설정이 가능합니다.\n게시판의 모듈이름은 접속 url이 되므로 신중하게 입력해주세요. (ex : http://도메인/zb/?mid=모듈이름)"; +?> diff --git a/modules/board/lang/zh-CN.lang.php b/modules/board/lang/zh-CN.lang.php new file mode 100644 index 000000000..91f16a674 --- /dev/null +++ b/modules/board/lang/zh-CN.lang.php @@ -0,0 +1,17 @@ +board = "版面"; + + // 在按钮使用的语言 + $lang->cmd_board_list = '版面目录'; + $lang->cmd_module_config = '版面共同设置'; + $lang->cmd_view_info = '版面信息'; + $lang->move_target_module = "移动目标模块"; + + $lang->about_board = "可生成,管理版面的模块。\n生成版面后,点击模块名即可对其详细设置。"; +?> diff --git a/modules/board/queries/getAllBoard.xml b/modules/board/queries/getAllBoard.xml new file mode 100644 index 000000000..49554aeac --- /dev/null +++ b/modules/board/queries/getAllBoard.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/modules/board/queries/getBoardList.xml b/modules/board/queries/getBoardList.xml new file mode 100644 index 000000000..efc53c312 --- /dev/null +++ b/modules/board/queries/getBoardList.xml @@ -0,0 +1,24 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + diff --git a/modules/board/skins/cozy_simple_gallery/comment.html b/modules/board/skins/cozy_simple_gallery/comment.html new file mode 100644 index 000000000..d92cb2cfb --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/comment.html @@ -0,0 +1,62 @@ +
+ {@ $idx = 0 } + + + +
+ + +
+
+ + +
+ + + + + + + + + + + + + + + +
{$val->content} + + {$lang->cmd_delete} + {$lang->cmd_modify} + + {$lang->cmd_reply} +
+ +
+
{htmlspecialchars($val->nick_name)}
+ + {zdate($val->regdate, "Y.m.d H:i")} + + ({$val->ipaddress}) + + +
+ + + + + + + + {@ $idx++} + + + diff --git a/modules/board/skins/cozy_simple_gallery/comment_form.html b/modules/board/skins/cozy_simple_gallery/comment_form.html new file mode 100644 index 000000000..0e2048ede --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/comment_form.html @@ -0,0 +1,67 @@ + + + + + + + + + +
+
+
+
+ {$source_comment->content} +
+ +
{htmlspecialchars($source_comment->nick_name)}
+ + {zdate($source_comment->regdate, "Y.m.d H:i")} + + ({$source_comment->ipaddress}) + + +
+
+
+ + + +
+ +
fileupload)-->enctype="multipart/form-data" class="boardEditor" id="fo_comment_write" > +
+ + + + + + + +
+ + + + + + + + + + + +
+ + +
{$comment_editor}
+ +
+ +
+ +
+
+ + + + diff --git a/modules/board/skins/cozy_simple_gallery/css/blue.css b/modules/board/skins/cozy_simple_gallery/css/blue.css new file mode 100644 index 000000000..085c6985c --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/css/blue.css @@ -0,0 +1,19 @@ +@charset "utf-8"; + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; background:#1187d8 url(../images/blue/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.boardList { width:100%; position:relative; border-bottom:2px solid #1187d8; border-collapse:collapse; } + +.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/blue/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#007ed5; cursor:default; position:relative; top:-.2em;} +.boardList td.recommend { font:bold .8em Tahoma; color:#007ed5; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#007ed5; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #1187d8;} +.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #1187d8; overflow:hidden;} +.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#007ed5;} + +.boardWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;} +.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/blue/bg_title_norepeat.gif) no-repeat left bottom;} +.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/blue/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} diff --git a/modules/board/skins/cozy_simple_gallery/css/bluish_green.css b/modules/board/skins/cozy_simple_gallery/css/bluish_green.css new file mode 100644 index 000000000..9c221ce62 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/css/bluish_green.css @@ -0,0 +1,19 @@ +@charset "utf-8"; + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; background:#9ab09f url(../images/bluish_green/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.boardList { width:100%; position:relative; border-bottom:2px solid #9ab09f; border-collapse:collapse; } + +.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/bluish_green/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#9ab09f; cursor:default; position:relative; top:-.2em;} +.boardList td.recommend { font:bold .8em Tahoma; color:#9ab09f; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#9ab09f; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #9ab09f;} +.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #9ab09f; overflow:hidden;} +.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#9ab09f;} + +.boardWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;} +.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/bluish_green/bg_title_norepeat.gif) no-repeat left bottom;} +.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/bluish_green/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} diff --git a/modules/board/skins/cozy_simple_gallery/css/common.css b/modules/board/skins/cozy_simple_gallery/css/common.css new file mode 100644 index 000000000..db5910fe7 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/css/common.css @@ -0,0 +1,539 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +/* ----- List+Read+Write+Modify | Start ----- */ +.boardHeader h3 { float:left; clear:both; padding:1.9em 1.5em 1.8em 1.5em; font-size:1.2em; color:#FFFFFF;} + +/* boardInformation */ +.boardInformation { width:100%; clear:both; margin:0 0 .5em 0; background:#EFEFEF; color:#8D8D8D; overflow:hidden;} +.articleNum { float:left; padding:.5em 0 .5em 2.3em; font:.8em Tahoma;} +.articleNum strong { margin:0 0 0 .5em; padding:0 0 0 .7em; font:bold .9em Tahoma; color:#6F6F6F; background:url(../images/common/bar_1x8_c0c0c0.gif) no-repeat left .1em;} +.accountNavigation { float:right; margin:.3em .5em 0 0; overflow:hidden;} +.accountNavigation li { list-style:none; float:left; margin:0 0 0 -.1em; padding:.1em .8em 0 .8em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left .3em;} +.accountNavigation li a {} + +/* boardList */ +.boardList tr:first-child td, .boardList tr.first-child td {} +.boardList tr.notice {} +.boardList tr.notice .num { font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; font-weight:bold;} + +.boardList th a { color:#3e3f3e;} +.boardList th span.on { font-weight:bold;} +.boardList th.num { background-position:-3px bottom; padding:0;} +.boardList th select { height:20px; } +.boardList th.category { padding:0 .2em 0 .5em;} +.boardList th.category.thumbStyle { background-position:-3px bottom !important; border-left:1px solid #ffffff; text-align:left;} +.boardList th:first-child { background-position:-2px bottom;} +.boardList th.first-child { background-position:-2px bottom;} +.boardList th.author {} +.boardList th.title {} +.boardList th.reading { white-space:nowrap;} +.boardList th.recommend { white-space:nowrap;} +.boardList th.reply { white-space:nowrap;} +.boardList th.date {} +.boardList th.check { padding:0;} +.boardList th.user {} +.boardList th.registDate {} +.boardList th.checkDate {} +.boardList th.friendGroup {} +.boardList th.userId {} +.boardList th.userName {} +.boardList th.userNick {} +.boardList th.sendMessage {} +.boardList th.last-child { border-right:1px solid #ffffff;} +.boardList th .sort { padding:0 .2em; vertical-align:middle;} +.boardList th select, +.boardList th input { vertical-align:middle;} + +.boardList td { padding:.3em; border-bottom:1px solid #e4e4e2;} +.boardList td.noline { border-bottom:none;} +.boardList td.num { font:.8em Tahoma; color:#999999; padding:.5em .5em .5em 1.5em;} +.boardList td.category {} +.boardList tr.notice td { padding:.3em; white-space:nowrap;} +.boardList tr.notice td img { margin:-.1em .3em 0 0;} +.boardList td.thumb { padding:.5em 0 .5em .5em; width:130px; table-layout:fixed; white-space:nowrap;} +.boardList td.thumb * { vertical-align:middle;} +.boardList td.title.bold { font-size:1em; font-weight:bold;} +.boardList td.title.bold a { position:relative; top:.3em;} +.boardList td.title * { vertical-align:middle;} +.boardList td.title, +.boardList td.title a { color:#444444; text-decoration:none; } +.boardList td.title a:visited { color:#777777;} +.boardList td.title .title_wrap { width:100%; overflow:hidden; white-space:nowrap;} +.boardList td.author { padding:0 .5em 0 1.3em; color:#333333; font:.95em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;} +.boardList td.author a { font-size:1em; color:#333333;} +.boardList td.reading { font:.8em Tahoma; color:#999999; text-align:center;} +.boardList td.reply { font:bold .8em Tahoma; color:#ff6600; text-align:center;} +.boardList td.date { font:.8em Tahoma; color:#999999; text-align:center;} +.boardList td.registDate { font:.8em Tahoma; color:#999999; text-align:center;} +.boardList td.checkDate { font:.8em Tahoma; color:#333333; text-align:center;} +.boardList td.summary { border-top:none; vertical-align:top; color:#666666; line-height:1.25em;padding:5px 5px 10px 5px;} +.boardList td.summary a { color:#666666; text-decoration:none; line-height:inherit;} +.boardList td.summary a:visited { color:#999999;} +.boardList td.check { text-align:center;} +.boardList td.user { color:#333333; font-size:.9em;} +.boardList td.user a { color:#333333;} +.boardList td.userId { font:.9em Tahoma;} +.boardList td.userName {} +.boardList td.userNick { font-size:.9em; color:#999999;} +.boardList td.friendGroup {} +.boardList td.sendMessage { text-align:center; padding:0;} +.boardList td.sendMessage .buttonFixedLeft { position:relative; left:20%; _left:0;} +*:first-child+html .boardList td.sendMessage .buttonFixedLeft { left:0;} +.boardList td input { _margin:-3px;} +.boardList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#ff6600; cursor:default; position:relative; top:.3em;} +.boardList td .replyAndTrackback strong { font:bold 1em Tahoma;} + +.boardList td .thumbnailSmall { margin:0 .3em 0 .3em;} +.boardList td .thumbnailSmall img {} +.boardList td .thumbnailMedium { margin:0 .3em 0 .3em;} +.boardList td .thumbnailMedium img {} + +.boardList.thumbnail { margin-top:-1px; border-bottom:none;} +.boardList.thumbnail td { border-top:none; border-bottom:1px solid #eff0ed; padding:1.5em 0 0 1.5em; overflow:hidden;} +.boardList.thumbnail div.cell { float:left; width:142px; margin:0 .6em 0 0; padding-bottom:1.5em;overflow:hidden;} +.boardList.thumbnail div.title { color:#444444; margin:.5em 0 .2em 0;} +.boardList.thumbnail div.title a { color:#444444; text-decoration:none;} +.boardList.thumbnail div.nameAndDate { font-size:.9em; color:#999999; margin-bottom:.2em; padding-left:3px;} +.boardList.thumbnail div.nameAndDate a { color:#999999;} +.boardList.thumbnail div.nameAndDate .date { font:.8em Tahoma; color:#999999;} +.boardList.thumbnail div.readAndRecommend { font-size:.9em; color:#666666; padding-left:3px;} +.boardList.thumbnail div.readAndRecommend .num { font:.8em Tahoma;} +.boardList.thumbnail div.readAndRecommend .vr { color:#dddddd;} +.boardList.thumbnail div.readAndRecommend strong.num { font:bold .8em Tahoma; color:#494949;} + +/* boardSearch */ +.boardSearch { clear:both; text-align:center; margin-top:3em;} +.boardSearch fieldset { display:inline; padding:10px 15px 10px 15px; border:none; background:#F4F4F4; overflow:hidden; } +.boardSearch fieldset legend { overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} +.boardSearch * { vertical-align:middle;} +.boardSearch select { float:left;} +.boardSearch input { float:left; margin:0 .3em; background:#fbfbfb;} +.searchButton ul { overflow:hidden;} +.searchButton li { float:left; margin-right:.3em; list-style:none;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; background:url(../images/common/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} + + +/* pageNavigation */ +.pageNavigation { float:left; display:block; margin:2.2em 0 2em 1.1em; font:bold .8em Tahoma; } +.pageNavigation a, .pageNavigation a:visited, .pageNavigation a:active { margin-left:-4px; font:bold .8em Tahoma; color:#676767; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } +.pageNavigation a:hover { text-decoration:none; } +.pageNavigation a.goToFirst, +.pageNavigation a.goToLast { border:none; border-right:1px solid #ffffff; border-left:1px solid #ffffff; z-index:99; padding:1px 5px 3px 4px;} +.pageNavigation a.goToFirst img, +.pageNavigation a.goToLast img { vertical-align:middle;} + +.buttonBox { float:right; margin:1.2em 0 0 0; } + +/* boardRead */ +#blog .boardRead { position:relative; margin:0; _overflow:hidden;} +.boardRead .originalContent { padding:2em 0 2em 0;} +.boardRead .titleAndCategory { float:left;} +.boardRead .titleAndCategory h4 { font-size:1.4em; display:inline; padding-left:.2em;} +.boardRead .titleAndCategory .vr { font-size:.9em; margin:0 .3em; color:#c5c7c0;} +.boardRead .titleAndCategory .category { font-size:.9em; color:#999999; white-space:nowrap;} + +.boardRead .dateAndModify { font-size:.8em; float:right; white-space:nowrap;} +.boardRead .dateAndModify .date { font-size:.8em; font-family:Tahoma; color:#999999; margin-right:.5em; float:left; position:relative; top:.1em;} +.boardRead .dateAndModify .date strong { font-size:1em; font-family:Tahoma;} +.boardRead .dateAndModify ul { display:inline; margin:0 .4em 0 0;} +.boardRead .dateAndModify ul li { float:left; margin-left:.3em; list-style:none;} +.boardRead dl.uri { float:right; overflow:hidden; margin:0 0 3em .3em;} +.boardRead dl.uri dt { float:left; clear:left; font-size:.9em; margin-right:.3em; color:#999999;} +.boardRead dl.uri dd { clear:right; font-size:.8em; color:#d4d5d0;} +.boardRead dl.uri dd span { font-family:Tahoma; color:#d4d5d0;} +.boardRead .readBody { padding:0 .3em; color:#555555; overflow:hidden; margin-bottom:2em;} +.boardRead .readBody p { margin:1em 0; line-height:1.5em;} +.boardRead .contentBody { width:100%; overflow:hidden; } + +.boardRead .userInfo { float:left; white-space:nowrap;} +.boardRead .userInfo .author { padding:0 .3em 0 0; color:#3074a5; margin-right:.3em;} +.boardRead .userInfo .ipaddress { font-size:.9em; font-family:Tahoma; color:#888888; margin-right:.5em; } + +/* extraVars list */ +.extraVarsList { width:100%; border:1px solid #e0e1db; clear:both; margin-bottom:1em;} +.extraVarsList tr.notice { background:#f8f8f8;} +.extraVarsList tr.notice .num { font-size:.9em; font-weight:bold;} +.extraVarsList tr.bg1 { background:#ffffff} +.extraVarsList tr.bg2 { background:#fbfbfb;} +.extraVarsList th { color:#3e3f3e; font-weight:bold; padding:.8em .5em .5em .5em; border-bottom:1px solid #eff0ed; border-right:1px solid #eff0ed;} +.extraVarsList td { border-bottom:1px solid #eff0ed; padding:.5em .5em .5em 1em;} + +.boardRead .readFooter { border-top:1px solid #dfe0db; } +.boardRead .readFooter .tag { margin-bottom:1em; padding:1em 0 0 0; } +.boardRead .readFooter .tag h5 { display:inline; font-size:1em; margin:0 .3em 0 1.8em;} +.boardRead .readFooter .tag ul, +.boardRead .readFooter .tag li { display:inline;} +.boardRead .readFooter .tag a { color:#444444; text-decoration:none;} +.boardRead .readFooter .tag .tagIcon { vertical-align:middle;} +.boardRead .readFooter .fileAttached { padding:1em 1em .8em 0; position:relative; _width:100%; border-bottom:1px solid #dfdfdd; overflow:hidden; background:#f9f9f9;} +.boardRead .readFooter .fileAttached h5 {} +.boardRead .readFooter .fileAttached ul { margin-left:1.8em;} +.boardRead .readFooter .fileAttached li { float:left; margin-right:.75em; line-height:1.6em; color:#888888; white-space:nowrap; list-style:none;} +.boardRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em .2em; white-space:nowrap; position:relative; color:#888888; text-decoration:none; } +.boardRead .readFooter .fileAttached li a:visited { color:#777777;} + +.listButton li { list-style:none; clear:both; text-align:right; margin-top:.5em; } + +.boardRead .replyAndTrackback { float:left; width:100%; background:url(../images/common/bg_repeat_x_eaeaea.gif) repeat-x left bottom; overflow:hidden;} +.boardRead .replyAndTrackback li { float:left; font-weight:bold; margin:.3em 0 0 0; padding:.7em 1.1em .7em 1.2em; color:#FFFFFF; background:#B8B8B8; list-style:none;} +.boardRead .replyAndTrackback li a { color:#FFFFFF; text-decoration:none; } +.boardRead .replyAndTrackback li strong { padding:0 1.1em 0 0; background:#B8B8B8 url(../images/common/icon_close.gif) no-repeat right .2em;} +.boardRead .replyAndTrackback li.selected a { color:#666666;} +.boardRead .replyAndTrackback li.selected strong { padding:0 1.1em 0 0; background:#FFFFFF url(../images/common/icon_open.gif) no-repeat right .2em;} +.boardRead .replyAndTrackback a#toggleReply { background:url(../images/common/buttonToggleReply.gif) no-repeat right top;} +.boardRead .replyAndTrackback a#toggleTrackback { background:url(../images/common/buttonToggleReply.gif) no-repeat right -13px;} + +.boardRead #reply, +.boardRead #trackback { color:#666666; border-left:1px solid #EAEAEA; border-right:1px solid #EAEAEA; border-bottom:1px solid #EAEAEA; padding-top:1em;} +.boardRead #reply { } +.boardRead #trackback { display:none;} + +.boardRead .topBorder { border-top:1px solid #EAEAEA; } + +.boardRead #reply .contentBox, +.boardRead #trackback .contentBox { line-height:1.25em; color:#676767; clear:both; padding:1em; overflow:hidden;} +.boardRead #reply .top_border, +.boardRead #trackback .top_border { border-top:1px dashed #d8d8d8; } + +.boardRead .contentBox .content { width:100%; overflow:hidden; clear:both; margin-bottom:1em; } +.boardRead .contentBox .author { float:left; overflow:hidden; color:#3173a3;} +.boardRead .contentBox .date { float:right; font:.8em Tahoma; color:#cccccc; margin-left:.5em; } +.boardRead .contentBox .replyOption { float:right; display:inline; white-space:nowrap; margin-left:.5em; } +.boardRead .contentBox .replyOption img { vertical-align:middle;} + +.boardRead .contentBox .fileAttached { position:relative; _width:100%; overflow:hidden; clear:both; } +.boardRead .contentBox .fileAttached h5 {} +.boardRead .contentBox .fileAttached ul { margin-bottom:.5em;} +.boardRead .contentBox .fileAttached li { float:left; margin-right:.75em; line-height:1.6em; color:#888888; white-space:nowrap; list-style:none;} +.boardRead .contentBox .fileAttached li a { font-size:.9em; padding:.1em 0 .1em .2em; white-space:nowrap; position:relative; color:#888888; text-decoration:none; } +.boardRead .contentBox .fileAttached li a:visited { color:#777777;} + +.boardRead .contentBox .title a { color:#676767 ; margin-right:.3em; text-decoration:none;} +.boardRead .contentBox address a { font-size:.9em; color:#3173a3; margin-right:.3em; text-decoration:none; } +.boardRead .contentBox address .trackback_date { font:.8em Tahoma; color:#cccccc; margin-left:.5em; } +.boardRead .indent_box { background-color:#FBFBFB; } +.boardRead .contentBox .indent {padding-left:1.5em; background:url(../images/common/icon_arrow_reply.gif) no-repeat left .1em;} + +/* boardEditor */ +.boardEditor { padding:.5em 0 1em 0; width:100%; overflow:hidden;} +.boardEditor.reply { padding:.5em 1em 1em 1em; width:auto; overflow:hidden;} +.boardEditor legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em;} +.boardEditor fieldset { _width:100%; border:0px solid #eaeae7; border-top:none;} +.boardEditor .userNameAndPw { position:relative; background:#fbfbfb; border-top:1px solid #eaeae7; border-bottom:1px solid #e1e1e1; padding:.5em 1em; white-space:nowrap;} +.boardEditor .userNameAndPw * { vertical-align:middle;} +.boardEditor .userNameAndPw label { margin-right:.2em; color:#666760;} +.boardEditor .userNameAndPw input { color:#aaaaaa;} +.boardEditor .userNameAndPw .userName { width:6em; margin-right:.8em;} +.boardEditor .userNameAndPw .userPw { width:5em;} +.boardEditor .userNameAndPw .emailAddress { width:6em;} +.boardEditor .userNameAndPw .homePage { width:6em;} +.boardEditor .userNameAndPw .checkSecret { position:absolute; right:2em; top:.7em;} + +/* boardWrite */ +.boardWrite { width:100%; position:relative;} +.boardWrite .userNameAndPw { margin-bottom:-1px;} + +.boardWrite div.title label.title { display:block; float:left; font-weight:bold; padding:.4em 0 0 1.5em; width:9.5em; white-space:nowrap;} +.boardWrite div.title input#title { width:60%;} + +.boardWrite .option dt { display:block; float:left; font-weight:bold; padding:.3em 0 0 1.5em; width:9.5em; white-space:nowrap;} +.boardWrite .option dd { float:left; margin-right:1em; padding-top:.2em; _padding-top:.1em;} +.boardWrite .option dd * { vertical-align:middle;} +.boardWrite .inputTypeText { background:#fbfbfb;} +.boardWrite .trackbackURI { clear:both; border-top:1px solid #eff0ed; padding:4px 0 .8em 0;} +.boardWrite .trackbackURI label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .trackbackURI .inputTypeText { width:50%;} +.boardWrite .tag { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;} +.boardWrite .tag label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .tag .inputTypeText { width:50%;} +.boardWrite .tag .help { vertical-align:middle;} +.boardWrite .tag .info { padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;} +.boardWrite .extra_vars { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;} +.boardWrite .extra_vars label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .extra_vars .info { clear:both; padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;} +.boardWrite .extra_vars ul li { float:left; margin-right:1em; } + +/* ----- List+Read+Write+Modify | End ----- */ + +/* ----- Blog | Start ----- */ +#blog #bodyWrap #login_menu { padding:0 1.2em;} +#blog #bodyWrap #login_menu .member { float:right} +#blog #bodyWrap #login_menu .member li {display:inline; margin:0 0 0 -.1em; padding:0 .6em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left center;} +#blog #bodyWrap #login_menu .login {float:right} + + +/* Blog header Child*/ +#blog #header h1 { font:bold 1.3em 돋움; margin:2em 0 .4em 30px; letter-spacing:-.05em; } +#blog #header h1 a { color:#FFFFFF;} +#blog #header #tagLine { padding:0 0 0 30px; color:#f6c8c8;} +#blog #header #globalNavigation { width:100%; margin:2.4em 0 0 0; padding:.8em 0 .8em 53.5em; background:#e4e4e4; overflow:hidden;} +#blog #header #globalNavigation li { float:left; margin-left:-1px; background:url(../images/common/bar_1x10_c0c0c0.gif) no-repeat left bottom;} +#blog #header #globalNavigation li.no_bg { background:none;} +#blog #header #globalNavigation li a { display:block; float:left; padding:0 1.2em; font:bold .8em Tahoma; color:#54564b; white-space:nowrap;} +#blog #header #globalNavigation li.on a { color:#ee2126;} + +/* Column Left & Right Common Child */ +.boxTypeA { position:relative; border:5px solid #F2F2F2; margin-bottom:.7em;} +.boxTypeB { position:relative; margin-bottom:.7em;} +.boxTypeB h2 { position:relative; padding:7px 0 0 12px; height:21px; _height:20px; background:#f5f5f5; font-size:1em; color:#ef2121; font-family:Tahoma;} +*:first-child+html .boxTypeB h2 { height:20px; color:#ef2121;} +.boxTypeB .toggleMask {position:absolute; top:8px; right:5px; cursor:pointer; width:13px; height:13px; overflow:hidden;} +.boxTypeB .showHide { position:relative;} +.boxTypeB .optionList { position:absolute; top:8px; right:0; overflow:hidden;} +.boxTypeB .optionList li { float:left; padding:0 .5em; margin-left:-1px; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left center;} +.boxTypeB .optionList li a { color:#a4a4a4; font-size:.9em;} +.boxTypeB .optionList li.on a { color:#000000;} +.boxTypeB .showAll { color:#737373; font:bold .9em tahoma; white-space:nowrap; display:inline-block; padding:.4em .8em; background:url(../images/common/bar_1x8_c0c0c0.gif) no-repeat right center;} +.boxTypeB .showAll.no_bg { background:none;} + +/* Profile */ +#blog div#profile { padding:6px; overflow:hidden;} +#blog div#profile img.profile { width:153px; display:block; margin-bottom:1.2em;} +#blog div#profile dl#hello {} +#blog div#profile dl#hello dt { color:#333333; margin-bottom:.5em;} +#blog div#profile dl#hello dt a { color:#333333;} +#blog div#profile dl#hello dd { color:#777777; margin-bottom:1em;} +#blog div#profile ul#admin { overflow:hidden; height:1.2em;} +#blog div#profile ul#admin li { float:left; padding:0 .4em; font:.8em tahoma;} +#blog div#profile ul#admin li a { display:block;} +#blog div#profile ul#admin li.write a {} +#blog div#profile ul#admin li.setup { border-left:1px solid #e3e3e3;} +#blog div#profile ul#admin li.setup a {} +#blog div#profile ul#admin li a { color:#666666;} + +/* Category */ +#blog div#category {} +#blog div#category #categoryList { padding:1em .8em .5em .8em;} +#blog div#category #categoryList li { position:relative; padding:0 0 0 15px; background:url(../images/common/iconFolderClose.gif) no-repeat 2px top;} +#blog div#category #categoryList li li {} +#blog div#category #categoryList li li li { background:url(../images/common/iconList.gif) no-repeat 5px top;} +#blog div#category #categoryList a { display:block; _display:inline-block; color:#6b6b6b; margin:0 0 6px 5px;} + +/* Search Box */ +#blog div#searchBox { margin-bottom:.7em; padding:.6em; background:#f5f5f5; overflow:hidden;} +#blog div#searchBox fieldset { border:none;} +#blog div#searchBox fieldset legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} + +/* Tags */ +#blog div#tag { padding-bottom:1em;} +#blog div#tag .tagList { padding:1.2em; overflow:hidden;} +#blog div#tag .tagList li { display:inline; color:#a4a4a4; margin-right:.1em; line-height:1.5em;} +#blog div#tag .tagList li a { color:#a4a4a4;} +#blog div#tag .tagList li.typeA a { color:#717171; font-weight:bold;} +#blog div#tag .tagList li.typeB a { color:#3d3d3d;} +#blog div#tag .tagList li.typeC a { font-weight:bold;} +#blog div#tag .tag_sort { width:100%; border-top:1px dashed #ababab; border-bottom:1px dashed #ababab; text-align:center; overflow:hidden;} + +/* Neighbor */ +#blog div#neighbor {} +#blog div#neighbor #neighborList { padding:1.2em 1.2em 0 1.2em;} +#blog div#neighbor #neighborList li { padding:0 0 .7em 1.2em; background:url(../images/common/iconPlus2.gif) no-repeat left top;} +#blog div#neighbor #neighborList li img { padding-left:.3em; top:.1em;} +#blog div#neighbor #neighborList li a { display:inline-block; color:#6b6b6b; font-weight:bold;} +#blog div#neighbor #neighborList li ul { display:none; padding:.7em 0 0 0;} +#blog div#neighbor #neighborList li ul li { padding:0 0 .6em .6em; margin-left:-.6em; background:url(../images/common/iconLineBD.gif) no-repeat left 5px;} +#blog div#neighbor #neighborList li ul li a{ font-weight:normal;} + +/* Calendar */ +#blog div#calendar {} +#blog div#calendar table { width:100%; background:url(../images/common/bg_line_dot_x.gif) repeat-x left top;} +#blog div#calendar table caption { font:bold 1em 돋움; color:#ec1a25; padding:1em;} +#blog div#calendar table caption .mm { font:bold 1em 돋움; color:#555650;} +#blog div#calendar table caption a { padding:.2em;} +#blog div#calendar table caption a img { vertical-align:middle;} +#blog div#calendar table th { padding:.6em 0;} +#blog div#calendar table td { padding:.25em 0;} +#blog div#calendar table th { font:bold .7em tahoma; color:#717171;} +#blog div#calendar table th.sun { color:#000000;} +#blog div#calendar table td { text-align:center;} +#blog div#calendar table td a { font:.7em Tahoma; color:#9a9a9a;} +#blog div#calendar table td.sun { color:#000000;} +#blog div#calendar table td.sun a { color:#000000;} +#blog div#calendar table td.today a { font-weight:bold; color:#54564b;} +#blog div#calendar table td.posted a { text-decoration:underline;} + +#blog .boardWrite div.title { border-top:2px solid #ed1b24;} +#blog .write_post h3 {margin:1.5em 1em 1em 1em; font:bold 1.2em 돋움;} +/* ----- Blog | End ----- */ + + +/* ----- Member | Start ----- */ + +.memberHeader { position:relative; _width:100%; background:#ED2027 url(../images/common/bg_top_title.gif) no-repeat 23px -6px; overflow:hidden;} +.memberHeader h3 { float:left; clear:both; padding:1.2em 0 1em 1.7em; font-size:1.1em; color:#FFFFFF;} +.memberInformation { width:100%; clear:both; margin:0 0 .5em 0; background:#EFEFEF; color:#8D8D8D; overflow:hidden;} +.memberInformation .friendNum { float:left; padding:.7em 0 .7em 2em; background:url(../images/common/iconFriend.gif) no-repeat .5em .4em;} +.memberInformation .friendNum strong { font:bold 11px Tahoma; color:#ec2127;} +.memberInformation .addGroup { float:right; margin:.8em 1em .7em 0;} +.memberInformation .instantMessage { float:right; margin:.7em; overflow:hidden;} +.memberInformation .instantMessage li { float:left; margin:0 0 0 -.1em; padding:0 .5em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left .25em;} +.memberInformation .instantMessage li a {white-space:nowrap; color:#666666;} +.memberInformation .instantMessage li.on a { background-position:left -14px; font-weight:bold;} +.memberInformation .instantMessage li a strong { font:bold 0.75em tahoma; color:#ee202a;} + +/* 친구목록 */ +.memberList { width:100%; position:relative; border-bottom:2px solid #ED2A32; border-collapse:collapse;} + +.memberList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/common/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.memberList th.check { padding:0;} +.memberList th.friendGroup { padding:0 0 0 .3em; text-align:left;} +.memberList th select, +.memberList th input { vertical-align:middle;} +.memberList th.repeat_bg { background:#ffffff url(../images/common/bg_title_repeat_x.gif) repeat-x left bottom;} + +.memberList td { padding:.3em; border-bottom:1px solid #e4e4e2;} +.memberList td.noline { border-bottom:none;} +.memberList td.check { text-align:center;} +.memberList td.friendGroup { } +.memberList td.userId { text-align:center; font:.9em Tahoma;} +.memberList td.userName { text-align:center;} +.memberList td.userNick { text-align:center; color:#999999;} +.memberList td.registDate { text-align:center; font:.8em Tahoma;} +.memberList td.sendMessage { text-align:center;} + + +.smallBox { margin:5em auto 1em auto;} +.smallBox.w268 { width:268px;} +.smallBox.w298 { width:298px;} +.smallBox.w498 { width:498px;} +.smallBox .header { position:relative; _width:100%; background:#ed2027; overflow:hidden;} +.smallBox .header h3 { font-size:1.2em; color:#FFFFFF; padding:1em 2em .8em 1em;} +.smallBox .login { position:relative; border:none; padding:2.4em 0 2em 2.3em;} +.smallBox .login legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} +.smallBox .login dl { overflow:hidden; width:162px; float:left;} +.smallBox .login dl dt { float:left; width:55px; color:#54564b; height:22px; padding-top:5px;} +.smallBox .login dl dd { float:left; width:105px; height:27px;} +.smallBox .login dl dd input { width:90px;} +.smallBox .login .loginButton { display:block; float:left; margin-top:27px; _margin-top:28px;} +*:first-child+html .smallBox .login .loginButton { margin-top:28px;} +.smallBox .login .keep { float:left; clear:both; white-space:nowrap; position:relative; left:55px; _left:52px;} +*:first-child+html .smallBox .login .keep { left:52px;} +.smallBox .login .keep input { vertical-align:middle;} +.smallBox .login .keep label { font-size:11px; color:#999999;} +.smallBox .help { background:#F7F7F7; border-top:1px solid #ed2a32; border-bottom:2px solid #ee2b33; overflow:hidden; padding:1.1em; text-align:center; height:1em;} +.smallBox .help li { display:inline; padding:0 .3em 0 .7em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left center;} +.smallBox .help li:first-child { background:none;} +.smallBox .help li.first-child { _background:none;} +.smallBox .help li a { font-size:11px; color:#54564b;} +.smallBox .text { color:#54564b; text-align:center; padding:4.25em 2em 4.8em 2em;} +.smallBox .text p { margin-bottom:.5em;} +.smallBox .button img { vertical-align:top;} +.smallBox.w268 .button ul { position:absolute; left:79px; } +.smallBox.w298 .button ul { position:absolute; left:110px; } +.smallBox.w498 .button ul { position:absolute; left:220px; } +.smallBox .button ul li { float:left; margin-right:.3em;} +.smallBox .complex { padding:1.5em 2em 2em 2em;} +.smallBox .friend { width:100%;} +.smallBox .friend th { width:7em; padding:.9em; border-bottom:1px solid #e4e5e0;} +.smallBox .friend td { padding:.9em; border-bottom:1px solid #e4e5e0; background:url(../images/common/bar_1x18_e4e5e0.gif) no-repeat left bottom;} +.smallBox .leftHeaderType { border-top:1px solid #e0e1db; border-left:1px solid #e0e1db; width:100%;} +.smallBox .leftHeaderType th, +.smallBox .leftHeaderType td { border-right:1px solid #e0e1db; border-bottom:1px solid #e0e1db; padding:.8em 1em .6em 1em;} +.smallBox .leftHeaderType th { color:#333333; text-align:left; background:#f5f5f3;} +.smallBox .leftHeaderType td { color:#444444;} +.smallBox .inputTypeText { background:#fbfbfb;} +.smallBox .group { overflow:hidden; padding:.5em 0; margin-top:.7em;} +.smallBox .group select { float:left; width:180px; margin-top:1px;} +.smallBox .pwModify { border:none;} +.smallBox .pwModify legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} +.smallBox .pwModify input { width:9em;} +.smallBox .pwModify br { display:block; margin-bottom:.2em} +.smallBox .pwModify p { text-align:center; margin-top:1em; color:#54564b;} + + +/* messageList */ +.messageList { width:100%; position:relative; border-bottom:2px solid #ed2a32; border-collapse:collapse;} +.messageList tr.notice .num { font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; font-weight:bold;} + +.messageList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/common/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.messageList th:first-child, +.messageList th.first-child { background-position:-3px bottom;} +.messageList th.author { background:url(../images/common/bg_title_repeat_x.gif) repeat-x left bottom; text-align:left;} +.messageList th.check { padding:0;} +.messageList th select, +.messageList th input { vertical-align:middle;} + +.messageList td { padding:.3em; border-bottom:1px solid #EFEFEF;} +.messageList td.noline { border-bottom:none;} +.messageList td.category {} +.messageList tr.notice td { padding:.7em .7em .7em .9em; white-space:nowrap;} +.messageList tr.notice td img { margin:-.1em .3em 0 0;} +.messageList td.thumb { padding:.5em 0 .5em .5em; width:145px; table-layout:fixed; white-space:nowrap;} +.messageList td.thumb * { vertical-align:middle;} +.messageList td.title {} +.messageList td.title.bold { font-size:1em; font-weight:bold;} +.messageList td.title.bold a { position:relative; top:.3em;} +.messageList td.title * { vertical-align:middle;} +.messageList td.title, +.messageList td.title a { color:#444444;} +.messageList td.title a:visited { color:#777777;} +.messageList td.author { padding:0 .5em 0 1.3em; color:#333333; font:.95em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;} +.messageList td.author a { font-size:1em; color:#333333;} +.messageList td.reading { font:.8em Tahoma; color:#999999; text-align:center;} +.messageList td.recommend { font:bold .8em Tahoma; color:#ec2127; text-align:center;} +.messageList td.reply { font:bold .8em Tahoma; color:#ff6600; text-align:center;} +.messageList td.date { font:.8em Tahoma; color:#999999; text-align:center;} +.messageList td.registDate { font:.8em Tahoma; color:#999999; text-align:center;} +.messageList td.checkDate { font:.8em Tahoma; color:#333333; text-align:center;} +.messageList td.summary { border-top:none; vertical-align:top; color:#666666; line-height:1.25em;} +.messageList td.summary a { color:#666666; text-decoration:none; line-height:inherit;} +.messageList td.summary a:visited { color:#999999;} +.messageList td.check { text-align:center;} +.messageList td.user { color:#333333; font-size:.9em;} +.messageList td.user a { color:#333333;} +.messageList td.userId { font:.9em Tahoma;} +.messageList td.userNick { font-size:.9em; color:#999999;} +.messageList td.sendMessage { text-align:center; padding:0;} +.messageList td.sendMessage .buttonFixedLeft { position:relative; left:20%; _left:0;} + +.readMessage { margin-bottom:2em;} +.readMessage .messageHeader { padding:1.5em; height:1em; overflow:hidden;} +.readMessage .messageHeader h4 { float:left; padding-left:.5em; font-size:1em; background:url(../images/common/iconArrow99.gif) no-repeat left .3em;} +.readMessage .messageHeader address { float:right; white-space:nowrap;} +.readMessage .messageHeader address em { font-size:.9em; font-style:normal; color:#333333; margin-right:.3em;} +.readMessage .messageHeader address em a { color:#333333;} +.readMessage .messageHeader address .date { font:.8em Tahoma; color:#999999;} +.readMessage .messageBody { border:1px solid #e0e1db; margin:0 1.5em 1.5em 1.5em; padding:1em; position:relative; color:#666666;} +.readMessage .deleteOrKeep { padding:.5em 0; overflow:hidden; background:#f5f5f3; border-top:1px solid #eaebe7; _width:100%;} +.readMessage .deleteOrKeep li { position:relative; left:40%; float:left; margin-right:.5em;} +.readMessage .button { position:relative; background:#f7f7f7; border-top:1px solid #ee2b33; border-bottom:2px solid #ee2b33; overflow:hidden; padding:.7em; text-align:center;} + + +.joinTable.typeA { border-top:2px solid #ee1b24; border-collapse:collapse;} +.joinTable.typeB { border-bottom:2px solid #ee1b24; background:#f9f9f9;} +.joinTable.typeC { border-top:2px solid #ee2b33; border-bottom:2px solid #ee2b33; border-collapse:collapse;} +.joinTable.typeB caption { border-top:1px dashed #919191; background:#f9f9f9;} +.joinTable { width:100%;} +.joinTable caption { padding:2em 0 .5em 1.5em; font-weight:bold; text-align:left; background:url(../images/common/iconH3.gif) no-repeat .5em 2em;} +.joinTable th, +.joinTable td { padding:.7em .5em .7em 1.5em; text-align:left; border-top:1px solid #eff0eb;} +.joinTable td { background:url(../images/common/bar_1x18_e4e5e0.gif) no-repeat left bottom;} +.joinTable th { width:10em;} +.joinTable td textarea { width:40em; height:4.5em; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:3px; line-height:1em; background:#fbfbfb; vertical-align:middle; float:left; margin-right:.5em; margin-bottom:.5em; color:#666666; overflow:auto;} +.joinTable td input { border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:3px; height:1em; line-height:1em; background:#fbfbfb; vertical-align:middle; float:left; margin-right:.5em; margin-bottom:.5em; color:#666666;} +.joinTable td input.radio, +.joinTable td input.check { border:none; padding:0; margin:0; background:none; margin-top:.4em;} +.joinTable td input.w4em { width:4em;} +.joinTable td input.w2em { width:2em;} +.joinTable td select { float:left; margin-right:.5em;} +.joinTable td .fl { margin-right:.5em;} +.joinTable td br { clear:both;} +.joinTable td p { float:left; font-size:.9em; color:#999999; padding-top:.5em; margin-right:.5em;} +.joinTable td label { float:left; color:#3f4040; padding-top:.3em; margin-right:.5em;} +.joinTable td a { color:#333333;} +.joinTable .no_line { border:none;} +.join_button { margin:1em 0 0 0; text-align:center;} +.joinTable .add_info { padding:2.5em .5em .7em 1.5em; background:#f9f9f9; border-top:1px dashed #919191;} +.buttonTypeWrite.join { margin-top:1.2em;} + +/* ----- Member | End ----- */ + + +.smallBox .inputPassword { position:relative; border:none; padding:2em 2em 1.5em 2em;} +.smallBox .inputPassword .inputTypeText { float:left; margin-right:.5em; width:8em;} +.smallBox .inputPassword legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} diff --git a/modules/board/skins/cozy_simple_gallery/css/green.css b/modules/board/skins/cozy_simple_gallery/css/green.css new file mode 100644 index 000000000..592d74f50 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/css/green.css @@ -0,0 +1,20 @@ +@charset "utf-8"; + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; background:#8dc63f url(../images/green/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.boardList { width:100%; position:relative; border-bottom:2px solid #8dc63f; border-collapse:collapse; } + +.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/green/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#27a939; cursor:default; position:relative; top:-.2em;} +.boardList td.recommend { font:bold .8em Tahoma; color:#27a939; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#27a939; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #8dc63f;} +.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #8dc63f; overflow:hidden;} +.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#8dc63f;} + +.boardWrite fieldset.bottomBorder { border-bottom:2px solid #8dc63f;} +.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/green/bg_title_norepeat.gif) no-repeat left bottom;} +.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/green/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} + diff --git a/modules/board/skins/cozy_simple_gallery/css/pink.css b/modules/board/skins/cozy_simple_gallery/css/pink.css new file mode 100644 index 000000000..7269ac2a4 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/css/pink.css @@ -0,0 +1,19 @@ +@charset "utf-8"; + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; background:#f70795 url(../images/pink/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.boardList { width:100%; position:relative; border-bottom:2px solid #f70795; border-collapse:collapse; } + +.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/pink/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#f70795; cursor:default; position:relative; top:-.2em;} +.boardList td.recommend { font:bold .8em Tahoma; color:#f70795; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#f70795; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #f70795;} +.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #f70795; overflow:hidden;} +.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#f70795;} + +.boardWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;} +.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/pink/bg_title_norepeat.gif) no-repeat left bottom;} +.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/pink/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} diff --git a/modules/board/skins/cozy_simple_gallery/css/red.css b/modules/board/skins/cozy_simple_gallery/css/red.css new file mode 100644 index 000000000..b703a9dbb --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/css/red.css @@ -0,0 +1,19 @@ +@charset "utf-8"; + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; background:#ED2027 url(../images/red/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.boardList { width:100%; position:relative; border-bottom:2px solid #ed2a32; border-collapse:collapse; } + +.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/red/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#ed1f29; cursor:default; position:relative; top:-.2em;} +.boardList td.recommend { font:bold .8em Tahoma; color:#ec2127; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#ff6600; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #ed2228;} +.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #ee202a; overflow:hidden;} +.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#eb1c22;} + +.boardWrite fieldset.bottomBorder { border-bottom:2px solid #ed1b24;} +.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/red/bg_title_norepeat.gif) no-repeat left bottom;} +.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/red/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} diff --git a/modules/board/skins/cozy_simple_gallery/delete_comment_form.html b/modules/board/skins/cozy_simple_gallery/delete_comment_form.html new file mode 100644 index 000000000..984c3ac8e --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/delete_comment_form.html @@ -0,0 +1,24 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + + +
+
+ + diff --git a/modules/board/skins/cozy_simple_gallery/delete_form.html b/modules/board/skins/cozy_simple_gallery/delete_form.html new file mode 100644 index 000000000..1ca638c93 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/delete_form.html @@ -0,0 +1,23 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + +
+
+ + diff --git a/modules/board/skins/cozy_simple_gallery/delete_trackback_form.html b/modules/board/skins/cozy_simple_gallery/delete_trackback_form.html new file mode 100644 index 000000000..f907b6793 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/delete_trackback_form.html @@ -0,0 +1,25 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + + +
+
+ + + diff --git a/modules/board/skins/cozy_simple_gallery/extra_var_form.html b/modules/board/skins/cozy_simple_gallery/extra_var_form.html new file mode 100644 index 000000000..564cec9d9 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/extra_var_form.html @@ -0,0 +1,65 @@ + + + + + {@ $val->default = explode(',',$val->default) } + + + +{@ $val->column_name = "extra_vars".$key} + + +{@ $val->value = $oDocument->getExtraValue($key)} + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
  • value)&&in_array($v, $val->value))-->checked="checked"/> {$v}
  • + +
+ + + + + + + + + +
{zdate($val->value,"Y-m-d")}
+ {$lang->cmd_open_calendar} + + + +

{$val->desc}

+ diff --git a/modules/board/skins/cozy_simple_gallery/extra_var_value.html b/modules/board/skins/cozy_simple_gallery/extra_var_value.html new file mode 100644 index 000000000..0d5b21657 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/extra_var_value.html @@ -0,0 +1,57 @@ + + + +{@ $val->column_name = "extra_vars".$key} + + +{@ $val->value = $oDocument->getExtraValue($key)} + + + + {htmlspecialchars($val->value)} + + + + + {$val->value} + +   + + + + + + {$val->value} + +   + + + + + {htmlspecialchars($val->value[0])} + - + {htmlspecialchars($val->value[1])} + - + {htmlspecialchars($val->value[2])} + + + + {nl2br(htmlspecialchars($val->value))} + + + + + {@ $_tmp_value[] = htmlspecialchars($v)} + + {implode(",",$_tmp_value)} + + + + {htmlspecialchars($val->value)} + + + + {zdate($val->value,"Y-m-d")} + + +  diff --git a/modules/board/skins/cozy_simple_gallery/filter/delete_comment.xml b/modules/board/skins/cozy_simple_gallery/filter/delete_comment.xml new file mode 100644 index 000000000..115ea00d9 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/filter/delete_comment.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_gallery/filter/delete_document.xml b/modules/board/skins/cozy_simple_gallery/filter/delete_document.xml new file mode 100644 index 000000000..7627f5a63 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/filter/delete_document.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_gallery/filter/delete_trackback.xml b/modules/board/skins/cozy_simple_gallery/filter/delete_trackback.xml new file mode 100644 index 000000000..2140675f8 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/filter/delete_trackback.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_gallery/filter/input_password.xml b/modules/board/skins/cozy_simple_gallery/filter/input_password.xml new file mode 100644 index 000000000..55cb6d8e0 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/filter/input_password.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_gallery/filter/insert.xml b/modules/board/skins/cozy_simple_gallery/filter/insert.xml new file mode 100644 index 000000000..85d1ed4ce --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/filter/insert.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_gallery/filter/insert_comment.xml b/modules/board/skins/cozy_simple_gallery/filter/insert_comment.xml new file mode 100644 index 000000000..ba2216c8a --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/filter/insert_comment.xml @@ -0,0 +1,28 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_gallery/filter/search.xml b/modules/board/skins/cozy_simple_gallery/filter/search.xml new file mode 100644 index 000000000..6c85e1254 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/filter/search.xml @@ -0,0 +1,15 @@ + +
+ + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_gallery/filter/vote.xml b/modules/board/skins/cozy_simple_gallery/filter/vote.xml new file mode 100644 index 000000000..0870a7551 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/filter/vote.xml @@ -0,0 +1,13 @@ + +
+ + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_gallery/footer.html b/modules/board/skins/cozy_simple_gallery/footer.html new file mode 100644 index 000000000..c6171637a --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/footer.html @@ -0,0 +1,2 @@ + +{$module_info->footer_text} diff --git a/modules/board/skins/cozy_simple_gallery/header.html b/modules/board/skins/cozy_simple_gallery/header.html new file mode 100644 index 000000000..faf6313b1 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/header.html @@ -0,0 +1,50 @@ + + + + + + {@$module_info->colorset = "red"} + + + + + + + + + + + + +{$module_info->header_text} + + +
+

{$module_info->title}

+
+
+ Total {number_format($total_count)}  +
    + + +
  • {$lang->member_info}
  • +
  • {$lang->cmd_logout}
  • + + + +
  • {$lang->cmd_setup}
  • + + + +
  • {$lang->cmd_signup}
  • +
  • {$lang->cmd_login}
  • + + + +
  • RSS
  • + +
  • +
+
+ + diff --git a/modules/board/skins/cozy_simple_gallery/images/blank.gif b/modules/board/skins/cozy_simple_gallery/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/blank.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/blue/bg_title.gif b/modules/board/skins/cozy_simple_gallery/images/blue/bg_title.gif new file mode 100644 index 000000000..ff67b452b Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/blue/bg_title.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/blue/bg_title_norepeat.gif b/modules/board/skins/cozy_simple_gallery/images/blue/bg_title_norepeat.gif new file mode 100644 index 000000000..aec4de0b0 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/blue/bg_title_norepeat.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/blue/bg_top_title.gif b/modules/board/skins/cozy_simple_gallery/images/blue/bg_top_title.gif new file mode 100644 index 000000000..99eecde67 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/blue/bg_top_title.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/bluish_green/bg_title.gif b/modules/board/skins/cozy_simple_gallery/images/bluish_green/bg_title.gif new file mode 100644 index 000000000..c5cf6b136 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/bluish_green/bg_title.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/bluish_green/bg_title_norepeat.gif b/modules/board/skins/cozy_simple_gallery/images/bluish_green/bg_title_norepeat.gif new file mode 100644 index 000000000..227cf252b Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/bluish_green/bg_title_norepeat.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/bluish_green/bg_top_title.gif b/modules/board/skins/cozy_simple_gallery/images/bluish_green/bg_top_title.gif new file mode 100644 index 000000000..160682e41 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/bluish_green/bg_top_title.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/bar_1x7_c0c0c0.gif b/modules/board/skins/cozy_simple_gallery/images/common/bar_1x7_c0c0c0.gif new file mode 100644 index 000000000..1d2f92ff7 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/bar_1x7_c0c0c0.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/bar_1x8_c0c0c0.gif b/modules/board/skins/cozy_simple_gallery/images/common/bar_1x8_c0c0c0.gif new file mode 100644 index 000000000..f37814f58 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/bar_1x8_c0c0c0.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/bg_repeat_x_eaeaea.gif b/modules/board/skins/cozy_simple_gallery/images/common/bg_repeat_x_eaeaea.gif new file mode 100644 index 000000000..0b011fe5d Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/bg_repeat_x_eaeaea.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn4_rss.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn4_rss.gif new file mode 100644 index 000000000..50584f6d5 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn4_rss.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_admin.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_admin.gif new file mode 100644 index 000000000..bea6e158e Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_admin.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_cancel.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_cancel.gif new file mode 100644 index 000000000..65b303e06 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_cancel.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_cancel3.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_cancel3.gif new file mode 100644 index 000000000..5dfcfd0b7 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_cancel3.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_delete.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_delete.gif new file mode 100644 index 000000000..84a26c508 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_delete.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_delete2.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_delete2.gif new file mode 100644 index 000000000..1fcb5e906 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_delete2.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_edit.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_edit.gif new file mode 100644 index 000000000..3f7bd62b1 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_edit.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_findid.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_findid.gif new file mode 100644 index 000000000..de53c3d16 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_findid.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_findpw.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_findpw.gif new file mode 100644 index 000000000..26f254d9a Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_findpw.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_joinus.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_joinus.gif new file mode 100644 index 000000000..beed35641 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_joinus.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_list.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_list.gif new file mode 100644 index 000000000..8e56215c8 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_list.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_login.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_login.gif new file mode 100755 index 000000000..b5e6a3e9e Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_login.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_logout.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_logout.gif new file mode 100644 index 000000000..0233282e6 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_logout.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_manage.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_manage.gif new file mode 100755 index 000000000..6f5cd05b7 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_manage.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_modify.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_modify.gif new file mode 100644 index 000000000..7b4321472 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_modify.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_my.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_my.gif new file mode 100644 index 000000000..72e626189 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_my.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_preview.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_preview.gif new file mode 100755 index 000000000..e66ee6ca5 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_preview.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_print.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_print.gif new file mode 100755 index 000000000..56e0efb04 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_print.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_reply.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_reply.gif new file mode 100644 index 000000000..1482218b6 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_reply.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_reply2.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_reply2.gif new file mode 100644 index 000000000..5f34a2ea8 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_reply2.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_rss.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_rss.gif new file mode 100755 index 000000000..424624cfd Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_rss.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_scrap.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_scrap.gif new file mode 100755 index 000000000..29d9beb44 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_scrap.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_search.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_search.gif new file mode 100644 index 000000000..0a12014d3 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_search.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_vote.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_vote.gif new file mode 100755 index 000000000..5a637cb0e Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_vote.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/btn_write.gif b/modules/board/skins/cozy_simple_gallery/images/common/btn_write.gif new file mode 100644 index 000000000..53a2e1cf0 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/btn_write.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/buttonAscending.gif b/modules/board/skins/cozy_simple_gallery/images/common/buttonAscending.gif new file mode 100644 index 000000000..b405cc323 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/buttonAscending.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/buttonDescending.gif b/modules/board/skins/cozy_simple_gallery/images/common/buttonDescending.gif new file mode 100644 index 000000000..2dc5575ff Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/buttonDescending.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/buttonTypeInput24.gif b/modules/board/skins/cozy_simple_gallery/images/common/buttonTypeInput24.gif new file mode 100644 index 000000000..0dcfc0e3d Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/buttonTypeInput24.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/iconArrow.gif b/modules/board/skins/cozy_simple_gallery/images/common/iconArrow.gif new file mode 100644 index 000000000..267b36495 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/iconArrow.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/iconFile.gif b/modules/board/skins/cozy_simple_gallery/images/common/iconFile.gif new file mode 100644 index 000000000..d48f9c181 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/iconFile.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/iconTag.gif b/modules/board/skins/cozy_simple_gallery/images/common/iconTag.gif new file mode 100644 index 000000000..ecfdb5585 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/iconTag.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/icon_arrow_reply.gif b/modules/board/skins/cozy_simple_gallery/images/common/icon_arrow_reply.gif new file mode 100644 index 000000000..bbabbd7ea Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/icon_arrow_reply.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/icon_gofirst.gif b/modules/board/skins/cozy_simple_gallery/images/common/icon_gofirst.gif new file mode 100644 index 000000000..68ba6ef96 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/icon_gofirst.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/icon_golast.gif b/modules/board/skins/cozy_simple_gallery/images/common/icon_golast.gif new file mode 100644 index 000000000..f2450047d Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/icon_golast.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/icon_notice.gif b/modules/board/skins/cozy_simple_gallery/images/common/icon_notice.gif new file mode 100644 index 000000000..d9fb255f3 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/icon_notice.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/txt_date.gif b/modules/board/skins/cozy_simple_gallery/images/common/txt_date.gif new file mode 100644 index 000000000..524d2d782 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/txt_date.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/txt_hit.gif b/modules/board/skins/cozy_simple_gallery/images/common/txt_hit.gif new file mode 100644 index 000000000..cc9771319 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/txt_hit.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/txt_hot.gif b/modules/board/skins/cozy_simple_gallery/images/common/txt_hot.gif new file mode 100644 index 000000000..34e12c1ee Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/txt_hot.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/txt_name.gif b/modules/board/skins/cozy_simple_gallery/images/common/txt_name.gif new file mode 100644 index 000000000..789dba359 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/txt_name.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/txt_option.gif b/modules/board/skins/cozy_simple_gallery/images/common/txt_option.gif new file mode 100644 index 000000000..9cb5202b7 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/txt_option.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/common/txt_title.gif b/modules/board/skins/cozy_simple_gallery/images/common/txt_title.gif new file mode 100644 index 000000000..34125f7a7 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/common/txt_title.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/green/bg_title.gif b/modules/board/skins/cozy_simple_gallery/images/green/bg_title.gif new file mode 100644 index 000000000..9223e8058 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/green/bg_title.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/green/bg_title_norepeat.gif b/modules/board/skins/cozy_simple_gallery/images/green/bg_title_norepeat.gif new file mode 100644 index 000000000..57aa0ebea Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/green/bg_title_norepeat.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/green/bg_top_title.gif b/modules/board/skins/cozy_simple_gallery/images/green/bg_top_title.gif new file mode 100644 index 000000000..95cfa0245 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/green/bg_top_title.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/pink/bg_title.gif b/modules/board/skins/cozy_simple_gallery/images/pink/bg_title.gif new file mode 100644 index 000000000..4c587d473 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/pink/bg_title.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/pink/bg_title_norepeat.gif b/modules/board/skins/cozy_simple_gallery/images/pink/bg_title_norepeat.gif new file mode 100644 index 000000000..80a473e84 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/pink/bg_title_norepeat.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/pink/bg_top_title.gif b/modules/board/skins/cozy_simple_gallery/images/pink/bg_top_title.gif new file mode 100644 index 000000000..d218b2a9e Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/pink/bg_top_title.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/red/bg_title.gif b/modules/board/skins/cozy_simple_gallery/images/red/bg_title.gif new file mode 100644 index 000000000..f693fc693 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/red/bg_title.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/red/bg_title_norepeat.gif b/modules/board/skins/cozy_simple_gallery/images/red/bg_title_norepeat.gif new file mode 100644 index 000000000..f1b2417f5 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/red/bg_title_norepeat.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/images/red/bg_top_title.gif b/modules/board/skins/cozy_simple_gallery/images/red/bg_top_title.gif new file mode 100644 index 000000000..c4ae66243 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/images/red/bg_top_title.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/input_password_form.html b/modules/board/skins/cozy_simple_gallery/input_password_form.html new file mode 100644 index 000000000..985f1ffd5 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/input_password_form.html @@ -0,0 +1,27 @@ + + + +
+ +
+

{$lang->msg_input_password}

+
+ +
+ + + + + + + +
+ +
+ + + diff --git a/modules/board/skins/cozy_simple_gallery/js/board.js b/modules/board/skins/cozy_simple_gallery/js/board.js new file mode 100644 index 000000000..f40a0b9c0 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/js/board.js @@ -0,0 +1,152 @@ +/** + * @file modules/board/js/board.js + * @author zero (zero@nzeo.com) + * @brief board 모듈의 javascript + **/ + +/* 관리자가 카트 선택시 세션에 넣음 */ +function doAddCart(mid, obj) { + var srl = obj.value; + var check_flag = obj.checked?'add':'remove'; + + var params = new Array(); + params["mid"] = mid; + params["srl"] = srl; + params["check_flag"] = check_flag; + + exec_xml("board","procBoardAdminAddCart", params, null); +} + +/* 글쓰기 작성후 */ +function completeDocumentInserted(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var category_srl = ret_obj['category_srl']; + + alert(message); + + var url = current_url.setQuery('mid',mid).setQuery('document_srl',document_srl).setQuery('act',''); + if(category_srl) url = url.setQuery('category',category_srl); + location.href = url; +} + +/* 글 삭제 */ +function completeDeleteDocument(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var page = ret_obj['page']; + + var url = "./?mid="+mid; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 검색 실행 */ +function completeSearch(fo_obj, params) { + fo_obj.submit(); +} + +/* 추천, 추천은 별도의 폼입력이 필요 없어 직접 필터 사용 */ +function doVote() { + var fo_obj = document.getElementById('fo_document_info'); + procFilter(fo_obj, vote); +} + +function completeVote(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + alert(message); + location.href = location.href; +} + +// 현재 페이지 reload +function completeReload(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + location.href = location.href; +} + +/* 댓글 글쓰기 작성후 */ +function completeInsertComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var comment_srl = ret_obj['comment_srl']; + + var url = "./?mid="+mid+"&document_srl="+document_srl; + if(comment_srl) url += "#comment_"+comment_srl; + + alert(message); + + location.href = url; +} + +/* 댓글 삭제 */ +function completeDeleteComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 트랙백 삭제 */ +function completeDeleteTrackback(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 카테고리 이동 */ +function doChangeCategory() { + var sel_obj = xGetElementById("board_category"); + var sel_idx = sel_obj.selectedIndex; + var category_srl = sel_obj.options[sel_idx].value; + location.href = current_url.setQuery('category',category_srl); +} + +/* 스크랩 */ +function doScrap(document_srl) { + var params = new Array(); + params["document_srl"] = document_srl; + exec_xml("member","procMemberScrapDocument", params, null); +} + +// Editor Reply And Trackback Toggle +function toggleReply() { + xGetElementById('reply').style.display = 'block'; + xGetElementById('trackback').style.display = 'none'; + xGetElementById('toggleReply').parentNode.className = 'selected'; + xGetElementById('toggleTrackback').parentNode.className = ''; +} + +function toggleTrackback() { + xGetElementById('reply').style.display = 'none'; + xGetElementById('trackback').style.display = 'block'; + xGetElementById('toggleReply').parentNode.className = ''; + xGetElementById('toggleTrackback').parentNode.className = 'selected'; +} diff --git a/modules/board/skins/cozy_simple_gallery/list.html b/modules/board/skins/cozy_simple_gallery/list.html new file mode 100644 index 000000000..78bf2f938 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/list.html @@ -0,0 +1,196 @@ + + + + + + + + + + + + + {@ $order_icon = "buttonDescending.gif" } + {@ $order_type = "asc"; } + + {@ $order_icon = "buttonAscending.gif" } + {@ $order_type = "desc"; } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
{$lang->title}{$lang->nick_name}{$lang->readed_count}{$lang->voted_count}{$lang->regdate}
{$lang->notice}{$category_list[$document->get('category_srl')]->title} +
+ + document_srl])-->checked="checked" /> + + + + + {$document->getTitleText($module_info->subject_cut_size)} + + {$document->getTitleText($module_info->subject_cut_size)} + + + {$document->getTitleText($module_info->subject_cut_size)} + + + + [R{$document->getCommentCount()}] + + + + [T{$document->getTrackbackCount()}] + +
+
{$document->getNickName()}
{$document->get('readed_count')}{$document->get('voted_count')}{$document->getRegdate('Y-m-d')}
+ + + + + + + + +
+ + +
+ + + + + + +
+ + document_srl])-->checked="checked" /> + + + + {$document->getTitleText(8,'')} + + {$document->getTitleText(8,'')} + + + {$document->getTitleText(8,'')} + + + + ({$document->getCommentCount()}) + + + + [{$document->getTrackbackCount()}] + + +
+
{$document->getNickName()}
+
{$document->getRegdate('Y.m.d')}
+
+
+
+ {$lang->readed_count} {$document->get('readed_count')} + | {$lang->voted_count} {$document->get('voted_count')} +
+
+ + +
+ + + + + + + +
+ {$lang->cmd_list} + + {$lang->cmd_write} + + + {$lang->cmd_manage_document} + +
+
+ + + + + + diff --git a/modules/board/skins/cozy_simple_gallery/message.html b/modules/board/skins/cozy_simple_gallery/message.html new file mode 100644 index 000000000..00bf01814 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/message.html @@ -0,0 +1,11 @@ + + +
+ {$message} +
+ + + {$lang->cmd_login} + + + diff --git a/modules/board/skins/cozy_simple_gallery/screenshot/blue.gif b/modules/board/skins/cozy_simple_gallery/screenshot/blue.gif new file mode 100644 index 000000000..13e76a099 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/screenshot/blue.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/screenshot/bluish_green.gif b/modules/board/skins/cozy_simple_gallery/screenshot/bluish_green.gif new file mode 100644 index 000000000..61e7d63c9 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/screenshot/bluish_green.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/screenshot/green.gif b/modules/board/skins/cozy_simple_gallery/screenshot/green.gif new file mode 100644 index 000000000..b1430d44a Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/screenshot/green.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/screenshot/pink.gif b/modules/board/skins/cozy_simple_gallery/screenshot/pink.gif new file mode 100644 index 000000000..c4a4ba4d1 Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/screenshot/pink.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/screenshot/red.gif b/modules/board/skins/cozy_simple_gallery/screenshot/red.gif new file mode 100644 index 000000000..63cd8880c Binary files /dev/null and b/modules/board/skins/cozy_simple_gallery/screenshot/red.gif differ diff --git a/modules/board/skins/cozy_simple_gallery/skin.xml b/modules/board/skins/cozy_simple_gallery/skin.xml new file mode 100644 index 000000000..090036ff0 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/skin.xml @@ -0,0 +1,100 @@ + + + cozy simple (갤러리형) + Cozyシンプル(ギャラリースタイル) + cozy simple skin (gallery style) + Cozy样式皮肤(相册型) + + (주)NHN + (株)NHN + (株)NHN + NHN Corp + + cozy simple 스킨의 갤러리형입니다. + 디자인 : 서기정 (http://blog.naver.com/addcozy) + HTML/CSS : 소지훈 + + + Cozyシンプルスキンのギャラリースタイルです。 + デザイン:ソギジョン(http://blog.naver.com/addcozy) + HTML/CSS:ソジフン + + + This is gallery style board of cozy simple skin. + Design : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + Cozy样式皮肤。(相册型) + 设计 : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + + + 빨간색(기본) + + Red (default) + 红色(默认) + + + 녹색 + + Green + 绿色 + + + 파란색 + + Blue + 蓝色 + + + 분홍색 + ピンク + Pink + 粉红色 + + + 청록색 + 青緑 + Cyan + 青绿色 + + + + + 정렬 대상 + ソート対象 + 排序对象 + Align Target + select + 등록된 순서 또는 변경된 순서로 정렬을 할 수 있습니다. + 登録された順、変更された順でソートできます。 + 可对主题按发表顺或最后更新顺进行排序。 + It can align articles as registered order or modified order. + newest + updated + + + 게시판 제목 + 掲示板タイトル + 版面标题 + Title of Board + 게시판의 제목을 적어주세요. + 掲示板タイトルを入力してください。 + 请输入版面标题。(留空为不显示) + Please input the title of board. + + + 제목 글자수 + タイトルの文字数 + 标题字数 + Length of Subject + 제목 글자수를 지정할 수 있습니다. (0또는 비워주시면 자르지 않습니다) + タイトルの文字数が指定できます(「0」または空欄の場合は、文字数を制限しません)。 + 可以指定标题字数。(0或留空为不限) + You may set length of title. (0 or blank value will not restrict the length) + + + diff --git a/modules/board/skins/cozy_simple_gallery/trackback.html b/modules/board/skins/cozy_simple_gallery/trackback.html new file mode 100644 index 000000000..29b00b1d1 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/trackback.html @@ -0,0 +1,25 @@ + + +
+ + + {@ $idx = 0 } + + +
+ +
+ {htmlspecialchars($val->blog_name)} + + {zdate($val->regdate, "Y.m.d H:i")} + ({$val->ipaddress}) + +
+
+ {@ $idx++} + + +
diff --git a/modules/board/skins/cozy_simple_gallery/view_document.html b/modules/board/skins/cozy_simple_gallery/view_document.html new file mode 100644 index 000000000..90b7060d6 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/view_document.html @@ -0,0 +1,134 @@ + + + +
+ + +
+ + +
+
+
+
+

{$oDocument->getTitleText()}

+ + |{$category_list[$oDocument->get('category_srl')]->title} + +
+ +
+ + {$oDocument->getRegdate('Y.m.d')} {$oDocument->getRegdate('H:i:s')} + + + {$lang->cmd_modify} + {$lang->cmd_delete} + +
+
+ +
+
{$lang->document_url} : {$oDocument->getPermanentUrl()}
+ +
{$lang->trackback_url} : {$oDocument->getTrackbackUrl()}
+ +
+ +
+
{$oDocument->getNickName()}
+ +
{$oDocument->get('ipaddress')}
+ +
+
+ + + + + + + + + + + + + +
{$val->name} + + +
+ + +
{$oDocument->getContent()}
+ +
+ {@ $tag_list = $oDocument->get('tag_list') } + +
+
{$lang->tag}
+ +
+ + + + + +
+ +
    +
  • + {$lang->cmd_print} + {$lang->cmd_scrap} + {$lang->cmd_vote} + {$lang->cmd_list} +
  • +
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_gallery/write_form.html b/modules/board/skins/cozy_simple_gallery/write_form.html new file mode 100644 index 000000000..016412f57 --- /dev/null +++ b/modules/board/skins/cozy_simple_gallery/write_form.html @@ -0,0 +1,115 @@ + + + +
+
fileupload)-->enctype="multipart/form-data" class="boardEditor" id="fo_write"> +
+ + + + + +
+ + + + + + + + + + + +
+ + +
+ + + + + + + +
+ +
+
{$lang->setup}
+ +
+ isNotice())-->checked="checked" id="is_notice" /> + +
+
+ isLocked())-->checked="checked" id="lock_comment" /> + +
+ +
+ isSecret())-->checked="checked" id="is_secret" /> + +
+
+ allowComment())-->checked="checked" id="allow_comment" /> + +
+
+ allowTrackback())-->checked="checked" id="allow_trackback" /> + +
+ +
+ useNotify())-->checked="checked" id="notify_message" /> + +
+ +
+ +
{$editor}
+ +
+ + + +
+ +
+ + +

{$lang->about_tag}

+
+ + + +
+ + + +
+ + + +
+ +
+ {$lang->cmd_preview} + + {$lang->cmd_back} +
+
+
+ diff --git a/modules/board/skins/cozy_simple_list/comment.html b/modules/board/skins/cozy_simple_list/comment.html new file mode 100644 index 000000000..d92cb2cfb --- /dev/null +++ b/modules/board/skins/cozy_simple_list/comment.html @@ -0,0 +1,62 @@ +
+ {@ $idx = 0 } + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + +
{$val->content} + + {$lang->cmd_delete} + {$lang->cmd_modify} + + {$lang->cmd_reply} +
+ +
+
{htmlspecialchars($val->nick_name)}
+ + {zdate($val->regdate, "Y.m.d H:i")} + + ({$val->ipaddress}) + + +
+ + +
+
+ +
+ + {@ $idx++} + + +
diff --git a/modules/board/skins/cozy_simple_list/comment_form.html b/modules/board/skins/cozy_simple_list/comment_form.html new file mode 100644 index 000000000..0e2048ede --- /dev/null +++ b/modules/board/skins/cozy_simple_list/comment_form.html @@ -0,0 +1,67 @@ + + + + + + + + + +
+
+
+
+ {$source_comment->content} +
+ +
{htmlspecialchars($source_comment->nick_name)}
+ + {zdate($source_comment->regdate, "Y.m.d H:i")} + + ({$source_comment->ipaddress}) + + +
+
+
+ + + +
+ +
fileupload)-->enctype="multipart/form-data" class="boardEditor" id="fo_comment_write" > +
+ + + + + + + +
+ + + + + + + + + + + +
+ + +
{$comment_editor}
+ +
+ +
+ +
+
+ + + + diff --git a/modules/board/skins/cozy_simple_list/css/blue.css b/modules/board/skins/cozy_simple_list/css/blue.css new file mode 100644 index 000000000..085c6985c --- /dev/null +++ b/modules/board/skins/cozy_simple_list/css/blue.css @@ -0,0 +1,19 @@ +@charset "utf-8"; + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; background:#1187d8 url(../images/blue/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.boardList { width:100%; position:relative; border-bottom:2px solid #1187d8; border-collapse:collapse; } + +.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/blue/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#007ed5; cursor:default; position:relative; top:-.2em;} +.boardList td.recommend { font:bold .8em Tahoma; color:#007ed5; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#007ed5; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #1187d8;} +.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #1187d8; overflow:hidden;} +.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#007ed5;} + +.boardWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;} +.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/blue/bg_title_norepeat.gif) no-repeat left bottom;} +.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/blue/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} diff --git a/modules/board/skins/cozy_simple_list/css/bluish_green.css b/modules/board/skins/cozy_simple_list/css/bluish_green.css new file mode 100644 index 000000000..9c221ce62 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/css/bluish_green.css @@ -0,0 +1,19 @@ +@charset "utf-8"; + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; background:#9ab09f url(../images/bluish_green/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.boardList { width:100%; position:relative; border-bottom:2px solid #9ab09f; border-collapse:collapse; } + +.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/bluish_green/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#9ab09f; cursor:default; position:relative; top:-.2em;} +.boardList td.recommend { font:bold .8em Tahoma; color:#9ab09f; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#9ab09f; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #9ab09f;} +.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #9ab09f; overflow:hidden;} +.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#9ab09f;} + +.boardWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;} +.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/bluish_green/bg_title_norepeat.gif) no-repeat left bottom;} +.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/bluish_green/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} diff --git a/modules/board/skins/cozy_simple_list/css/common.css b/modules/board/skins/cozy_simple_list/css/common.css new file mode 100644 index 000000000..628c96ab0 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/css/common.css @@ -0,0 +1,540 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +/* ----- List+Read+Write+Modify | Start ----- */ +.boardHeader h3 { float:left; clear:both; padding:1.9em 1.5em 1.8em 1.5em; font-size:1.2em; color:#FFFFFF;} + +/* boardInformation */ +.boardInformation { width:100%; clear:both; margin:0 0 .5em 0; background:#EFEFEF; color:#8D8D8D; overflow:hidden;} +.articleNum { float:left; padding:.5em 0 .5em 2.3em; font:.8em Tahoma;} +.articleNum strong { margin:0 0 0 .5em; padding:0 0 0 .7em; font:bold .9em Tahoma; color:#6F6F6F; background:url(../images/common/bar_1x8_c0c0c0.gif) no-repeat left .1em;} +.accountNavigation { float:right; margin:.3em .5em 0 0; overflow:hidden;} +.accountNavigation li { list-style:none; float:left; margin:0 0 0 -.1em; padding:.1em .8em 0 .8em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left .3em;} +.accountNavigation li a {} + +/* boardList */ +.boardList tr:first-child td, .boardList tr.first-child td {} +.boardList tr.notice {} +.boardList tr.notice .num { font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; font-weight:bold;} + +.boardList th a { color:#3e3f3e;} +.boardList th span.on { font-weight:bold;} +.boardList th.num { background-position:-3px bottom; padding:0;} +.boardList th select { height:20px; } +.boardList th.category { padding:0 .2em 0 .5em;} +.boardList th.category.thumbStyle { background-position:-3px bottom !important; border-left:1px solid #ffffff; text-align:left;} +.boardList th:first-child { background-position:-2px bottom;} +.boardList th.first-child { background-position:-2px bottom;} +.boardList th.author {} +.boardList th.title {} +.boardList th.reading { white-space:nowrap;} +.boardList th.recommend { white-space:nowrap;} +.boardList th.reply { white-space:nowrap;} +.boardList th.date {} +.boardList th.check { padding:0;} +.boardList th.user {} +.boardList th.registDate {} +.boardList th.checkDate {} +.boardList th.friendGroup {} +.boardList th.userId {} +.boardList th.userName {} +.boardList th.userNick {} +.boardList th.sendMessage {} +.boardList th.last-child { border-right:1px solid #ffffff;} +.boardList th .sort { padding:0 .2em; vertical-align:middle;} +.boardList th select, +.boardList th input { vertical-align:middle;} + +.boardList td { padding:.3em; border-bottom:1px solid #e4e4e2;} +.boardList td.noline { border-bottom:none;} +.boardList td.num { font:.8em Tahoma; color:#999999; padding:.5em .5em .5em 1.5em;} +.boardList td.category {} +.boardList tr.notice td { padding:.3em; white-space:nowrap;} +.boardList tr.notice td img { margin:-.1em .3em 0 0;} +.boardList td.thumb { padding:.5em 0 .5em .5em; width:145px; table-layout:fixed; white-space:nowrap;} +.boardList td.thumb * { vertical-align:middle;} +.boardList td.title.bold { font-size:1em; font-weight:bold;} +.boardList td.title.bold a { position:relative; top:.3em;} +.boardList td.title * { vertical-align:middle;} +.boardList td.title, +.boardList td.title a { color:#444444; text-decoration:none; } +.boardList td.title a:visited { color:#777777;} +.boardList td.title .title_wrap { width:100%; overflow:hidden; white-space:nowrap;} +.boardList td.author { padding:0 .5em 0 1.3em; color:#333333; font:.95em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;} +.boardList td.author a { font-size:1em; color:#333333;} +.boardList td.reading { font:.8em Tahoma; color:#999999; text-align:center;} +.boardList td.reply { font:bold .8em Tahoma; color:#ff6600; text-align:center;} +.boardList td.date { font:.8em Tahoma; color:#999999; text-align:center;} +.boardList td.registDate { font:.8em Tahoma; color:#999999; text-align:center;} +.boardList td.checkDate { font:.8em Tahoma; color:#333333; text-align:center;} +.boardList td.summary { border-top:none; vertical-align:top; color:#666666; line-height:1.25em;} +.boardList td.summary a { color:#666666; text-decoration:none; line-height:inherit;} +.boardList td.summary a:visited { color:#999999;} +.boardList td.check { text-align:center;} +.boardList td.user { color:#333333; font-size:.9em;} +.boardList td.user a { color:#333333;} +.boardList td.userId { font:.9em Tahoma;} +.boardList td.userName {} +.boardList td.userNick { font-size:.9em; color:#999999;} +.boardList td.friendGroup {} +.boardList td.sendMessage { text-align:center; padding:0;} +.boardList td.sendMessage .buttonFixedLeft { position:relative; left:20%; _left:0;} +*:first-child+html .boardList td.sendMessage .buttonFixedLeft { left:0;} +.boardList td input { _margin:-3px;} +.boardList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#ff6600; cursor:default; position:relative; top:.3em;} +.boardList td .replyAndTrackback strong { font:bold 1em Tahoma;} + +.boardList td .thumbnailSmall { margin:0 .3em 0 .3em;} +.boardList td .thumbnailSmall img {} +.boardList td .thumbnailMedium { margin:0 .3em 0 .3em;} +.boardList td .thumbnailMedium img {} + +.boardList.thumbnail {} +.boardList.thumbnail td { border-top:none; border-bottom:1px solid #eff0ed; padding:1.5em 0 0 1.5em; overflow:hidden;} +.boardList.thumbnail div.cell { float:left; width:131px; margin:0 1.6em 0 0; padding-bottom:1.5em;} +.boardList.thumbnail div.cell .fix_img { width:131px; height:106px; overflow:hidden;} +.boardList.thumbnail div.title { color:#444444; margin:.5em 0 .2em 0;} +.boardList.thumbnail div.title a { color:#444444;} +.boardList.thumbnail div.nameAndDate { font-size:.9em; color:#999999; margin-bottom:.2em; padding-left:3px;} +.boardList.thumbnail div.nameAndDate a { color:#999999;} +.boardList.thumbnail div.nameAndDate .date { font:.8em Tahoma; color:#999999;} +.boardList.thumbnail div.readAndRecommend { font-size:.9em; color:#666666; padding-left:3px;} +.boardList.thumbnail div.readAndRecommend .num { font:.8em Tahoma;} +.boardList.thumbnail div.readAndRecommend .vr { color:#dddddd;} +.boardList.thumbnail div.readAndRecommend strong.num { font:bold .8em Tahoma; color:#494949;} + +/* boardSearch */ +.boardSearch { clear:both; text-align:center; margin-top:3em;} +.boardSearch fieldset { display:inline; padding:10px 15px 10px 15px; border:none; background:#F4F4F4; overflow:hidden; } +.boardSearch fieldset legend { overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} +.boardSearch * { vertical-align:middle;} +.boardSearch select { float:left;} +.boardSearch input { float:left; margin:0 .3em; background:#fbfbfb;} +.searchButton ul { overflow:hidden;} +.searchButton li { float:left; margin-right:.3em; list-style:none;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; background:url(../images/common/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} + + +/* pageNavigation */ +.pageNavigation { float:left; display:block; margin:2.2em 0 2em 1.1em; font:bold .8em Tahoma; } +.pageNavigation a, .pageNavigation a:visited, .pageNavigation a:active { margin-left:-4px; font:bold .8em Tahoma; color:#676767; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } +.pageNavigation a:hover { text-decoration:none; } +.pageNavigation a.goToFirst, +.pageNavigation a.goToLast { border:none; border-right:1px solid #ffffff; border-left:1px solid #ffffff; z-index:99; padding:1px 5px 3px 4px;} +.pageNavigation a.goToFirst img, +.pageNavigation a.goToLast img { vertical-align:middle;} + +.buttonBox { float:right; margin:1.2em 0 0 0; } + +/* boardRead */ +#blog .boardRead { position:relative; margin:0; _overflow:hidden;} +.boardRead .originalContent { padding:2em 0 2em 0;} +.boardRead .titleAndCategory { float:left;} +.boardRead .titleAndCategory h4 { font-size:1.4em; display:inline; padding-left:.2em;} +.boardRead .titleAndCategory .vr { font-size:.9em; margin:0 .3em; color:#c5c7c0;} +.boardRead .titleAndCategory .category { font-size:.9em; color:#999999; white-space:nowrap;} + +.boardRead .dateAndModify { font-size:.8em; float:right; white-space:nowrap;} +.boardRead .dateAndModify .date { font-size:.8em; font-family:Tahoma; color:#999999; margin-right:.5em; float:left; position:relative; top:.1em;} +.boardRead .dateAndModify .date strong { font-size:1em; font-family:Tahoma;} +.boardRead .dateAndModify ul { display:inline; margin:0 .4em 0 0;} +.boardRead .dateAndModify ul li { float:left; margin-left:.3em; list-style:none;} +.boardRead dl.uri { float:right; overflow:hidden; margin:0 0 3em .3em;} +.boardRead dl.uri dt { float:left; clear:left; font-size:.9em; margin-right:.3em; color:#999999;} +.boardRead dl.uri dd { clear:right; font-size:.8em; color:#d4d5d0;} +.boardRead dl.uri dd span { font-family:Tahoma; color:#d4d5d0;} +.boardRead .readBody { padding:0 .3em; color:#555555; overflow:hidden; margin-bottom:2em;} +.boardRead .readBody p { margin:1em 0; line-height:1.5em;} +.boardRead .contentBody { width:100%; overflow:hidden; } + +.boardRead .userInfo { float:left; white-space:nowrap;} +.boardRead .userInfo .author { padding:0 .3em 0 0; color:#3074a5; margin-right:.3em;} +.boardRead .userInfo .ipaddress { font-size:.9em; font-family:Tahoma; color:#888888; margin-right:.5em; } + +/* extraVars list */ +.extraVarsList { width:100%; border:1px solid #e0e1db; clear:both; margin-bottom:1em;} +.extraVarsList tr.notice { background:#f8f8f8;} +.extraVarsList tr.notice .num { font-size:.9em; font-weight:bold;} +.extraVarsList tr.bg1 { background:#ffffff} +.extraVarsList tr.bg2 { background:#fbfbfb;} +.extraVarsList th { color:#3e3f3e; font-weight:bold; padding:.8em .5em .5em .5em; border-bottom:1px solid #eff0ed; border-right:1px solid #eff0ed;} +.extraVarsList td { border-bottom:1px solid #eff0ed; padding:.5em .5em .5em 1em;} + +.boardRead .readFooter { border-top:1px solid #dfe0db; } +.boardRead .readFooter .tag { margin-bottom:1em; padding:1em 0 0 0; } +.boardRead .readFooter .tag h5 { display:inline; font-size:1em; margin:0 .3em 0 1.8em;} +.boardRead .readFooter .tag ul, +.boardRead .readFooter .tag li { display:inline;} +.boardRead .readFooter .tag a { color:#444444; text-decoration:none;} +.boardRead .readFooter .tag .tagIcon { vertical-align:middle;} +.boardRead .readFooter .fileAttached { padding:1em 1em .8em 0; position:relative; _width:100%; border-bottom:1px solid #dfdfdd; overflow:hidden; background:#f9f9f9;} +.boardRead .readFooter .fileAttached h5 {} +.boardRead .readFooter .fileAttached ul { margin-left:1.8em;} +.boardRead .readFooter .fileAttached li { float:left; margin-right:.75em; line-height:1.6em; color:#888888; white-space:nowrap; list-style:none;} +.boardRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em .2em; white-space:nowrap; position:relative; color:#888888; text-decoration:none; } +.boardRead .readFooter .fileAttached li a:visited { color:#777777;} + +.listButton li { list-style:none; clear:both; text-align:right; margin-top:.5em; } + +.boardRead .replyAndTrackback { float:left; width:100%; background:url(../images/common/bg_repeat_x_eaeaea.gif) repeat-x left bottom; overflow:hidden;} +.boardRead .replyAndTrackback li { float:left; font-weight:bold; margin:.3em 0 0 0; padding:.7em 1.1em .7em 1.2em; color:#FFFFFF; background:#B8B8B8; list-style:none;} +.boardRead .replyAndTrackback li a { color:#FFFFFF; text-decoration:none; } +.boardRead .replyAndTrackback li strong { padding:0 1.1em 0 0; background:#B8B8B8 url(../images/common/icon_close.gif) no-repeat right .2em;} +.boardRead .replyAndTrackback li.selected a { color:#666666;} +.boardRead .replyAndTrackback li.selected strong { padding:0 1.1em 0 0; background:#FFFFFF url(../images/common/icon_open.gif) no-repeat right .2em;} +.boardRead .replyAndTrackback a#toggleReply { background:url(../images/common/buttonToggleReply.gif) no-repeat right top;} +.boardRead .replyAndTrackback a#toggleTrackback { background:url(../images/common/buttonToggleReply.gif) no-repeat right -13px;} + +.boardRead #reply, +.boardRead #trackback { color:#666666; border-left:1px solid #EAEAEA; border-right:1px solid #EAEAEA; border-bottom:1px solid #EAEAEA; padding-top:1em;} +.boardRead #reply { } +.boardRead #trackback { display:none;} + +.boardRead .topBorder { border-top:1px solid #EAEAEA; } + +.boardRead #reply .contentBox, +.boardRead #trackback .contentBox { line-height:1.25em; color:#676767; clear:both; padding:1em; overflow:hidden;} +.boardRead #reply .top_border, +.boardRead #trackback .top_border { border-top:1px dashed #d8d8d8; } + +.boardRead .contentBox .content { width:100%; overflow:hidden; clear:both; margin-bottom:1em; } +.boardRead .contentBox .author { float:left; overflow:hidden; color:#3173a3;} +.boardRead .contentBox .date { float:right; font:.8em Tahoma; color:#cccccc; margin-left:.5em; } +.boardRead .contentBox .replyOption { float:right; display:inline; white-space:nowrap; margin-left:.5em; } +.boardRead .contentBox .replyOption img { vertical-align:middle;} + +.boardRead .contentBox .fileAttached { position:relative; _width:100%; overflow:hidden; clear:both; } +.boardRead .contentBox .fileAttached h5 {} +.boardRead .contentBox .fileAttached ul { margin-bottom:.5em;} +.boardRead .contentBox .fileAttached li { float:left; margin-right:.75em; line-height:1.6em; color:#888888; white-space:nowrap; list-style:none;} +.boardRead .contentBox .fileAttached li a { font-size:.9em; padding:.1em 0 .1em .2em; white-space:nowrap; position:relative; color:#888888; text-decoration:none; } +.boardRead .contentBox .fileAttached li a:visited { color:#777777;} + +.boardRead .contentBox .title a { color:#676767 ; margin-right:.3em; text-decoration:none;} +.boardRead .contentBox address a { font-size:.9em; color:#3173a3; margin-right:.3em; text-decoration:none; } +.boardRead .contentBox address .trackback_date { font:.8em Tahoma; color:#cccccc; margin-left:.5em; } +.boardRead .indent_box { background-color:#FBFBFB; } +.boardRead .contentBox .indent {padding-left:1.5em; background:url(../images/common/icon_arrow_reply.gif) no-repeat left .1em;} + +/* boardEditor */ +.boardEditor { padding:.5em 0 1em 0; width:100%; overflow:hidden;} +.boardEditor.reply { padding:.5em 1em 1em 1em; width:auto; overflow:hidden;} +.boardEditor legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em;} +.boardEditor fieldset { _width:100%; border:0px solid #eaeae7; border-top:none;} +.boardEditor .userNameAndPw { position:relative; background:#fbfbfb; border-top:1px solid #eaeae7; border-bottom:1px solid #e1e1e1; padding:.5em 1em; white-space:nowrap;} +.boardEditor .userNameAndPw * { vertical-align:middle;} +.boardEditor .userNameAndPw label { margin-right:.2em; color:#666760;} +.boardEditor .userNameAndPw input { color:#aaaaaa;} +.boardEditor .userNameAndPw .userName { width:6em; margin-right:.8em;} +.boardEditor .userNameAndPw .userPw { width:5em;} +.boardEditor .userNameAndPw .emailAddress { width:6em;} +.boardEditor .userNameAndPw .homePage { width:6em;} +.boardEditor .userNameAndPw .checkSecret { position:absolute; right:2em; top:.7em;} + +/* boardWrite */ +.boardWrite { width:100%; position:relative;} +.boardWrite .userNameAndPw { margin-bottom:-1px;} + +.boardWrite div.title label.title { display:block; float:left; font-weight:bold; padding:.4em 0 0 1.5em; width:9.5em; white-space:nowrap;} +.boardWrite div.title input#title { width:60%;} + +.boardWrite .option dt { display:block; float:left; font-weight:bold; padding:.3em 0 0 1.5em; width:9.5em; white-space:nowrap;} +.boardWrite .option dd { float:left; margin-right:1em; padding-top:.2em; _padding-top:.1em;} +.boardWrite .option dd * { vertical-align:middle;} +.boardWrite .inputTypeText { background:#fbfbfb;} +.boardWrite .trackbackURI { clear:both; border-top:1px solid #eff0ed; padding:4px 0 .8em 0;} +.boardWrite .trackbackURI label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .trackbackURI .inputTypeText { width:50%;} +.boardWrite .tag { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;} +.boardWrite .tag label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .tag .inputTypeText { width:50%;} +.boardWrite .tag .help { vertical-align:middle;} +.boardWrite .tag .info { padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;} +.boardWrite .extra_vars { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;} +.boardWrite .extra_vars label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .extra_vars .info { clear:both; padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;} +.boardWrite .extra_vars ul li { float:left; margin-right:1em; } + +/* ----- List+Read+Write+Modify | End ----- */ + +/* ----- Blog | Start ----- */ +#blog #bodyWrap #login_menu { padding:0 1.2em;} +#blog #bodyWrap #login_menu .member { float:right} +#blog #bodyWrap #login_menu .member li {display:inline; margin:0 0 0 -.1em; padding:0 .6em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left center;} +#blog #bodyWrap #login_menu .login {float:right} + + +/* Blog header Child*/ +#blog #header h1 { font:bold 1.3em 돋움; margin:2em 0 .4em 30px; letter-spacing:-.05em; } +#blog #header h1 a { color:#FFFFFF;} +#blog #header #tagLine { padding:0 0 0 30px; color:#f6c8c8;} +#blog #header #globalNavigation { width:100%; margin:2.4em 0 0 0; padding:.8em 0 .8em 53.5em; background:#e4e4e4; overflow:hidden;} +#blog #header #globalNavigation li { float:left; margin-left:-1px; background:url(../images/common/bar_1x10_c0c0c0.gif) no-repeat left bottom;} +#blog #header #globalNavigation li.no_bg { background:none;} +#blog #header #globalNavigation li a { display:block; float:left; padding:0 1.2em; font:bold .8em Tahoma; color:#54564b; white-space:nowrap;} +#blog #header #globalNavigation li.on a { color:#ee2126;} + +/* Column Left & Right Common Child */ +.boxTypeA { position:relative; border:5px solid #F2F2F2; margin-bottom:.7em;} +.boxTypeB { position:relative; margin-bottom:.7em;} +.boxTypeB h2 { position:relative; padding:7px 0 0 12px; height:21px; _height:20px; background:#f5f5f5; font-size:1em; color:#ef2121; font-family:Tahoma;} +*:first-child+html .boxTypeB h2 { height:20px; color:#ef2121;} +.boxTypeB .toggleMask {position:absolute; top:8px; right:5px; cursor:pointer; width:13px; height:13px; overflow:hidden;} +.boxTypeB .showHide { position:relative;} +.boxTypeB .optionList { position:absolute; top:8px; right:0; overflow:hidden;} +.boxTypeB .optionList li { float:left; padding:0 .5em; margin-left:-1px; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left center;} +.boxTypeB .optionList li a { color:#a4a4a4; font-size:.9em;} +.boxTypeB .optionList li.on a { color:#000000;} +.boxTypeB .showAll { color:#737373; font:bold .9em tahoma; white-space:nowrap; display:inline-block; padding:.4em .8em; background:url(../images/common/bar_1x8_c0c0c0.gif) no-repeat right center;} +.boxTypeB .showAll.no_bg { background:none;} + +/* Profile */ +#blog div#profile { padding:6px; overflow:hidden;} +#blog div#profile img.profile { width:153px; display:block; margin-bottom:1.2em;} +#blog div#profile dl#hello {} +#blog div#profile dl#hello dt { color:#333333; margin-bottom:.5em;} +#blog div#profile dl#hello dt a { color:#333333;} +#blog div#profile dl#hello dd { color:#777777; margin-bottom:1em;} +#blog div#profile ul#admin { overflow:hidden; height:1.2em;} +#blog div#profile ul#admin li { float:left; padding:0 .4em; font:.8em tahoma;} +#blog div#profile ul#admin li a { display:block;} +#blog div#profile ul#admin li.write a {} +#blog div#profile ul#admin li.setup { border-left:1px solid #e3e3e3;} +#blog div#profile ul#admin li.setup a {} +#blog div#profile ul#admin li a { color:#666666;} + +/* Category */ +#blog div#category {} +#blog div#category #categoryList { padding:1em .8em .5em .8em;} +#blog div#category #categoryList li { position:relative; padding:0 0 0 15px; background:url(../images/common/iconFolderClose.gif) no-repeat 2px top;} +#blog div#category #categoryList li li {} +#blog div#category #categoryList li li li { background:url(../images/common/iconList.gif) no-repeat 5px top;} +#blog div#category #categoryList a { display:block; _display:inline-block; color:#6b6b6b; margin:0 0 6px 5px;} + +/* Search Box */ +#blog div#searchBox { margin-bottom:.7em; padding:.6em; background:#f5f5f5; overflow:hidden;} +#blog div#searchBox fieldset { border:none;} +#blog div#searchBox fieldset legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} + +/* Tags */ +#blog div#tag { padding-bottom:1em;} +#blog div#tag .tagList { padding:1.2em; overflow:hidden;} +#blog div#tag .tagList li { display:inline; color:#a4a4a4; margin-right:.1em; line-height:1.5em;} +#blog div#tag .tagList li a { color:#a4a4a4;} +#blog div#tag .tagList li.typeA a { color:#717171; font-weight:bold;} +#blog div#tag .tagList li.typeB a { color:#3d3d3d;} +#blog div#tag .tagList li.typeC a { font-weight:bold;} +#blog div#tag .tag_sort { width:100%; border-top:1px dashed #ababab; border-bottom:1px dashed #ababab; text-align:center; overflow:hidden;} + +/* Neighbor */ +#blog div#neighbor {} +#blog div#neighbor #neighborList { padding:1.2em 1.2em 0 1.2em;} +#blog div#neighbor #neighborList li { padding:0 0 .7em 1.2em; background:url(../images/common/iconPlus2.gif) no-repeat left top;} +#blog div#neighbor #neighborList li img { padding-left:.3em; top:.1em;} +#blog div#neighbor #neighborList li a { display:inline-block; color:#6b6b6b; font-weight:bold;} +#blog div#neighbor #neighborList li ul { display:none; padding:.7em 0 0 0;} +#blog div#neighbor #neighborList li ul li { padding:0 0 .6em .6em; margin-left:-.6em; background:url(../images/common/iconLineBD.gif) no-repeat left 5px;} +#blog div#neighbor #neighborList li ul li a{ font-weight:normal;} + +/* Calendar */ +#blog div#calendar {} +#blog div#calendar table { width:100%; background:url(../images/common/bg_line_dot_x.gif) repeat-x left top;} +#blog div#calendar table caption { font:bold 1em 돋움; color:#ec1a25; padding:1em;} +#blog div#calendar table caption .mm { font:bold 1em 돋움; color:#555650;} +#blog div#calendar table caption a { padding:.2em;} +#blog div#calendar table caption a img { vertical-align:middle;} +#blog div#calendar table th { padding:.6em 0;} +#blog div#calendar table td { padding:.25em 0;} +#blog div#calendar table th { font:bold .7em tahoma; color:#717171;} +#blog div#calendar table th.sun { color:#000000;} +#blog div#calendar table td { text-align:center;} +#blog div#calendar table td a { font:.7em Tahoma; color:#9a9a9a;} +#blog div#calendar table td.sun { color:#000000;} +#blog div#calendar table td.sun a { color:#000000;} +#blog div#calendar table td.today a { font-weight:bold; color:#54564b;} +#blog div#calendar table td.posted a { text-decoration:underline;} + +#blog .boardWrite div.title { border-top:2px solid #ed1b24;} +#blog .write_post h3 {margin:1.5em 1em 1em 1em; font:bold 1.2em 돋움;} +/* ----- Blog | End ----- */ + + +/* ----- Member | Start ----- */ + +.memberHeader { position:relative; _width:100%; background:#ED2027 url(../images/common/bg_top_title.gif) no-repeat 23px -6px; overflow:hidden;} +.memberHeader h3 { float:left; clear:both; padding:1.2em 0 1em 1.7em; font-size:1.1em; color:#FFFFFF;} +.memberInformation { width:100%; clear:both; margin:0 0 .5em 0; background:#EFEFEF; color:#8D8D8D; overflow:hidden;} +.memberInformation .friendNum { float:left; padding:.7em 0 .7em 2em; background:url(../images/common/iconFriend.gif) no-repeat .5em .4em;} +.memberInformation .friendNum strong { font:bold 11px Tahoma; color:#ec2127;} +.memberInformation .addGroup { float:right; margin:.8em 1em .7em 0;} +.memberInformation .instantMessage { float:right; margin:.7em; overflow:hidden;} +.memberInformation .instantMessage li { float:left; margin:0 0 0 -.1em; padding:0 .5em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left .25em;} +.memberInformation .instantMessage li a {white-space:nowrap; color:#666666;} +.memberInformation .instantMessage li.on a { background-position:left -14px; font-weight:bold;} +.memberInformation .instantMessage li a strong { font:bold 0.75em tahoma; color:#ee202a;} + +/* 친구목록 */ +.memberList { width:100%; position:relative; border-bottom:2px solid #ED2A32; border-collapse:collapse;} + +.memberList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/common/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.memberList th.check { padding:0;} +.memberList th.friendGroup { padding:0 0 0 .3em; text-align:left;} +.memberList th select, +.memberList th input { vertical-align:middle;} +.memberList th.repeat_bg { background:#ffffff url(../images/common/bg_title_repeat_x.gif) repeat-x left bottom;} + +.memberList td { padding:.3em; border-bottom:1px solid #e4e4e2;} +.memberList td.noline { border-bottom:none;} +.memberList td.check { text-align:center;} +.memberList td.friendGroup { } +.memberList td.userId { text-align:center; font:.9em Tahoma;} +.memberList td.userName { text-align:center;} +.memberList td.userNick { text-align:center; color:#999999;} +.memberList td.registDate { text-align:center; font:.8em Tahoma;} +.memberList td.sendMessage { text-align:center;} + + +.smallBox { margin:5em auto 1em auto;} +.smallBox.w268 { width:268px;} +.smallBox.w298 { width:298px;} +.smallBox.w498 { width:498px;} +.smallBox .header { position:relative; _width:100%; background:#ed2027; overflow:hidden;} +.smallBox .header h3 { font-size:1.2em; color:#FFFFFF; padding:1em 2em .8em 1em;} +.smallBox .login { position:relative; border:none; padding:2.4em 0 2em 2.3em;} +.smallBox .login legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} +.smallBox .login dl { overflow:hidden; width:162px; float:left;} +.smallBox .login dl dt { float:left; width:55px; color:#54564b; height:22px; padding-top:5px;} +.smallBox .login dl dd { float:left; width:105px; height:27px;} +.smallBox .login dl dd input { width:90px;} +.smallBox .login .loginButton { display:block; float:left; margin-top:27px; _margin-top:28px;} +*:first-child+html .smallBox .login .loginButton { margin-top:28px;} +.smallBox .login .keep { float:left; clear:both; white-space:nowrap; position:relative; left:55px; _left:52px;} +*:first-child+html .smallBox .login .keep { left:52px;} +.smallBox .login .keep input { vertical-align:middle;} +.smallBox .login .keep label { font-size:11px; color:#999999;} +.smallBox .help { background:#F7F7F7; border-top:1px solid #ed2a32; border-bottom:2px solid #ee2b33; overflow:hidden; padding:1.1em; text-align:center; height:1em;} +.smallBox .help li { display:inline; padding:0 .3em 0 .7em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left center;} +.smallBox .help li:first-child { background:none;} +.smallBox .help li.first-child { _background:none;} +.smallBox .help li a { font-size:11px; color:#54564b;} +.smallBox .text { color:#54564b; text-align:center; padding:4.25em 2em 4.8em 2em;} +.smallBox .text p { margin-bottom:.5em;} +.smallBox .button img { vertical-align:top;} +.smallBox.w268 .button ul { position:absolute; left:79px; } +.smallBox.w298 .button ul { position:absolute; left:110px; } +.smallBox.w498 .button ul { position:absolute; left:220px; } +.smallBox .button ul li { float:left; margin-right:.3em;} +.smallBox .complex { padding:1.5em 2em 2em 2em;} +.smallBox .friend { width:100%;} +.smallBox .friend th { width:7em; padding:.9em; border-bottom:1px solid #e4e5e0;} +.smallBox .friend td { padding:.9em; border-bottom:1px solid #e4e5e0; background:url(../images/common/bar_1x18_e4e5e0.gif) no-repeat left bottom;} +.smallBox .leftHeaderType { border-top:1px solid #e0e1db; border-left:1px solid #e0e1db; width:100%;} +.smallBox .leftHeaderType th, +.smallBox .leftHeaderType td { border-right:1px solid #e0e1db; border-bottom:1px solid #e0e1db; padding:.8em 1em .6em 1em;} +.smallBox .leftHeaderType th { color:#333333; text-align:left; background:#f5f5f3;} +.smallBox .leftHeaderType td { color:#444444;} +.smallBox .inputTypeText { background:#fbfbfb;} +.smallBox .group { overflow:hidden; padding:.5em 0; margin-top:.7em;} +.smallBox .group select { float:left; width:180px; margin-top:1px;} +.smallBox .pwModify { border:none;} +.smallBox .pwModify legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} +.smallBox .pwModify input { width:9em;} +.smallBox .pwModify br { display:block; margin-bottom:.2em} +.smallBox .pwModify p { text-align:center; margin-top:1em; color:#54564b;} + + +/* messageList */ +.messageList { width:100%; position:relative; border-bottom:2px solid #ed2a32; border-collapse:collapse;} +.messageList tr.notice .num { font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; font-weight:bold;} + +.messageList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/common/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.messageList th:first-child, +.messageList th.first-child { background-position:-3px bottom;} +.messageList th.author { background:url(../images/common/bg_title_repeat_x.gif) repeat-x left bottom; text-align:left;} +.messageList th.check { padding:0;} +.messageList th select, +.messageList th input { vertical-align:middle;} + +.messageList td { padding:.3em; border-bottom:1px solid #EFEFEF;} +.messageList td.noline { border-bottom:none;} +.messageList td.category {} +.messageList tr.notice td { padding:.7em .7em .7em .9em; white-space:nowrap;} +.messageList tr.notice td img { margin:-.1em .3em 0 0;} +.messageList td.thumb { padding:.5em 0 .5em .5em; width:145px; table-layout:fixed; white-space:nowrap;} +.messageList td.thumb * { vertical-align:middle;} +.messageList td.title {} +.messageList td.title.bold { font-size:1em; font-weight:bold;} +.messageList td.title.bold a { position:relative; top:.3em;} +.messageList td.title * { vertical-align:middle;} +.messageList td.title, +.messageList td.title a { color:#444444;} +.messageList td.title a:visited { color:#777777;} +.messageList td.author { padding:0 .5em 0 1.3em; color:#333333; font:.95em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;} +.messageList td.author a { font-size:1em; color:#333333;} +.messageList td.reading { font:.8em Tahoma; color:#999999; text-align:center;} +.messageList td.recommend { font:bold .8em Tahoma; color:#ec2127; text-align:center;} +.messageList td.reply { font:bold .8em Tahoma; color:#ff6600; text-align:center;} +.messageList td.date { font:.8em Tahoma; color:#999999; text-align:center;} +.messageList td.registDate { font:.8em Tahoma; color:#999999; text-align:center;} +.messageList td.checkDate { font:.8em Tahoma; color:#333333; text-align:center;} +.messageList td.summary { border-top:none; vertical-align:top; color:#666666; line-height:1.25em;} +.messageList td.summary a { color:#666666; text-decoration:none; line-height:inherit;} +.messageList td.summary a:visited { color:#999999;} +.messageList td.check { text-align:center;} +.messageList td.user { color:#333333; font-size:.9em;} +.messageList td.user a { color:#333333;} +.messageList td.userId { font:.9em Tahoma;} +.messageList td.userNick { font-size:.9em; color:#999999;} +.messageList td.sendMessage { text-align:center; padding:0;} +.messageList td.sendMessage .buttonFixedLeft { position:relative; left:20%; _left:0;} + +.readMessage { margin-bottom:2em;} +.readMessage .messageHeader { padding:1.5em; height:1em; overflow:hidden;} +.readMessage .messageHeader h4 { float:left; padding-left:.5em; font-size:1em; background:url(../images/common/iconArrow99.gif) no-repeat left .3em;} +.readMessage .messageHeader address { float:right; white-space:nowrap;} +.readMessage .messageHeader address em { font-size:.9em; font-style:normal; color:#333333; margin-right:.3em;} +.readMessage .messageHeader address em a { color:#333333;} +.readMessage .messageHeader address .date { font:.8em Tahoma; color:#999999;} +.readMessage .messageBody { border:1px solid #e0e1db; margin:0 1.5em 1.5em 1.5em; padding:1em; position:relative; color:#666666;} +.readMessage .deleteOrKeep { padding:.5em 0; overflow:hidden; background:#f5f5f3; border-top:1px solid #eaebe7; _width:100%;} +.readMessage .deleteOrKeep li { position:relative; left:40%; float:left; margin-right:.5em;} +.readMessage .button { position:relative; background:#f7f7f7; border-top:1px solid #ee2b33; border-bottom:2px solid #ee2b33; overflow:hidden; padding:.7em; text-align:center;} + + +.joinTable.typeA { border-top:2px solid #ee1b24; border-collapse:collapse;} +.joinTable.typeB { border-bottom:2px solid #ee1b24; background:#f9f9f9;} +.joinTable.typeC { border-top:2px solid #ee2b33; border-bottom:2px solid #ee2b33; border-collapse:collapse;} +.joinTable.typeB caption { border-top:1px dashed #919191; background:#f9f9f9;} +.joinTable { width:100%;} +.joinTable caption { padding:2em 0 .5em 1.5em; font-weight:bold; text-align:left; background:url(../images/common/iconH3.gif) no-repeat .5em 2em;} +.joinTable th, +.joinTable td { padding:.7em .5em .7em 1.5em; text-align:left; border-top:1px solid #eff0eb;} +.joinTable td { background:url(../images/common/bar_1x18_e4e5e0.gif) no-repeat left bottom;} +.joinTable th { width:10em;} +.joinTable td textarea { width:40em; height:4.5em; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:3px; line-height:1em; background:#fbfbfb; vertical-align:middle; float:left; margin-right:.5em; margin-bottom:.5em; color:#666666; overflow:auto;} +.joinTable td input { border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:3px; height:1em; line-height:1em; background:#fbfbfb; vertical-align:middle; float:left; margin-right:.5em; margin-bottom:.5em; color:#666666;} +.joinTable td input.radio, +.joinTable td input.check { border:none; padding:0; margin:0; background:none; margin-top:.4em;} +.joinTable td input.w4em { width:4em;} +.joinTable td input.w2em { width:2em;} +.joinTable td select { float:left; margin-right:.5em;} +.joinTable td .fl { margin-right:.5em;} +.joinTable td br { clear:both;} +.joinTable td p { float:left; font-size:.9em; color:#999999; padding-top:.5em; margin-right:.5em;} +.joinTable td label { float:left; color:#3f4040; padding-top:.3em; margin-right:.5em;} +.joinTable td a { color:#333333;} +.joinTable .no_line { border:none;} +.join_button { margin:1em 0 0 0; text-align:center;} +.joinTable .add_info { padding:2.5em .5em .7em 1.5em; background:#f9f9f9; border-top:1px dashed #919191;} +.buttonTypeWrite.join { margin-top:1.2em;} + +/* ----- Member | End ----- */ + + +.smallBox .inputPassword { position:relative; border:none; padding:2em 2em 1.5em 2em;} +.smallBox .inputPassword .inputTypeText { float:left; margin-right:.5em; width:8em;} +.smallBox .inputPassword legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} diff --git a/modules/board/skins/cozy_simple_list/css/green.css b/modules/board/skins/cozy_simple_list/css/green.css new file mode 100644 index 000000000..592d74f50 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/css/green.css @@ -0,0 +1,20 @@ +@charset "utf-8"; + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; background:#8dc63f url(../images/green/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.boardList { width:100%; position:relative; border-bottom:2px solid #8dc63f; border-collapse:collapse; } + +.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/green/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#27a939; cursor:default; position:relative; top:-.2em;} +.boardList td.recommend { font:bold .8em Tahoma; color:#27a939; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#27a939; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #8dc63f;} +.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #8dc63f; overflow:hidden;} +.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#8dc63f;} + +.boardWrite fieldset.bottomBorder { border-bottom:2px solid #8dc63f;} +.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/green/bg_title_norepeat.gif) no-repeat left bottom;} +.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/green/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} + diff --git a/modules/board/skins/cozy_simple_list/css/pink.css b/modules/board/skins/cozy_simple_list/css/pink.css new file mode 100644 index 000000000..7269ac2a4 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/css/pink.css @@ -0,0 +1,19 @@ +@charset "utf-8"; + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; background:#f70795 url(../images/pink/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.boardList { width:100%; position:relative; border-bottom:2px solid #f70795; border-collapse:collapse; } + +.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/pink/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#f70795; cursor:default; position:relative; top:-.2em;} +.boardList td.recommend { font:bold .8em Tahoma; color:#f70795; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#f70795; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #f70795;} +.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #f70795; overflow:hidden;} +.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#f70795;} + +.boardWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;} +.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/pink/bg_title_norepeat.gif) no-repeat left bottom;} +.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/pink/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} diff --git a/modules/board/skins/cozy_simple_list/css/red.css b/modules/board/skins/cozy_simple_list/css/red.css new file mode 100644 index 000000000..b703a9dbb --- /dev/null +++ b/modules/board/skins/cozy_simple_list/css/red.css @@ -0,0 +1,19 @@ +@charset "utf-8"; + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; background:#ED2027 url(../images/red/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.boardList { width:100%; position:relative; border-bottom:2px solid #ed2a32; border-collapse:collapse; } + +.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/red/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#ed1f29; cursor:default; position:relative; top:-.2em;} +.boardList td.recommend { font:bold .8em Tahoma; color:#ec2127; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#ff6600; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #ed2228;} +.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #ee202a; overflow:hidden;} +.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#eb1c22;} + +.boardWrite fieldset.bottomBorder { border-bottom:2px solid #ed1b24;} +.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/red/bg_title_norepeat.gif) no-repeat left bottom;} +.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/red/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} diff --git a/modules/board/skins/cozy_simple_list/delete_comment_form.html b/modules/board/skins/cozy_simple_list/delete_comment_form.html new file mode 100644 index 000000000..984c3ac8e --- /dev/null +++ b/modules/board/skins/cozy_simple_list/delete_comment_form.html @@ -0,0 +1,24 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + + +
+
+ + diff --git a/modules/board/skins/cozy_simple_list/delete_form.html b/modules/board/skins/cozy_simple_list/delete_form.html new file mode 100644 index 000000000..1ca638c93 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/delete_form.html @@ -0,0 +1,23 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + +
+
+ + diff --git a/modules/board/skins/cozy_simple_list/delete_trackback_form.html b/modules/board/skins/cozy_simple_list/delete_trackback_form.html new file mode 100644 index 000000000..f907b6793 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/delete_trackback_form.html @@ -0,0 +1,25 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + + +
+
+ + + diff --git a/modules/board/skins/cozy_simple_list/extra_var_form.html b/modules/board/skins/cozy_simple_list/extra_var_form.html new file mode 100644 index 000000000..564cec9d9 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/extra_var_form.html @@ -0,0 +1,65 @@ + + + + + {@ $val->default = explode(',',$val->default) } + + + +{@ $val->column_name = "extra_vars".$key} + + +{@ $val->value = $oDocument->getExtraValue($key)} + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
  • value)&&in_array($v, $val->value))-->checked="checked"/> {$v}
  • + +
+ + + + + + + + + +
{zdate($val->value,"Y-m-d")}
+ {$lang->cmd_open_calendar} + + + +

{$val->desc}

+ diff --git a/modules/board/skins/cozy_simple_list/extra_var_value.html b/modules/board/skins/cozy_simple_list/extra_var_value.html new file mode 100644 index 000000000..0d5b21657 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/extra_var_value.html @@ -0,0 +1,57 @@ + + + +{@ $val->column_name = "extra_vars".$key} + + +{@ $val->value = $oDocument->getExtraValue($key)} + + + + {htmlspecialchars($val->value)} + + + + + {$val->value} + +   + + + + + + {$val->value} + +   + + + + + {htmlspecialchars($val->value[0])} + - + {htmlspecialchars($val->value[1])} + - + {htmlspecialchars($val->value[2])} + + + + {nl2br(htmlspecialchars($val->value))} + + + + + {@ $_tmp_value[] = htmlspecialchars($v)} + + {implode(",",$_tmp_value)} + + + + {htmlspecialchars($val->value)} + + + + {zdate($val->value,"Y-m-d")} + + +  diff --git a/modules/board/skins/cozy_simple_list/filter/delete_comment.xml b/modules/board/skins/cozy_simple_list/filter/delete_comment.xml new file mode 100644 index 000000000..115ea00d9 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/filter/delete_comment.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_list/filter/delete_document.xml b/modules/board/skins/cozy_simple_list/filter/delete_document.xml new file mode 100644 index 000000000..7627f5a63 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/filter/delete_document.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_list/filter/delete_trackback.xml b/modules/board/skins/cozy_simple_list/filter/delete_trackback.xml new file mode 100644 index 000000000..2140675f8 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/filter/delete_trackback.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_list/filter/input_password.xml b/modules/board/skins/cozy_simple_list/filter/input_password.xml new file mode 100644 index 000000000..55cb6d8e0 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/filter/input_password.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_list/filter/insert.xml b/modules/board/skins/cozy_simple_list/filter/insert.xml new file mode 100644 index 000000000..85d1ed4ce --- /dev/null +++ b/modules/board/skins/cozy_simple_list/filter/insert.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_list/filter/insert_comment.xml b/modules/board/skins/cozy_simple_list/filter/insert_comment.xml new file mode 100644 index 000000000..ba2216c8a --- /dev/null +++ b/modules/board/skins/cozy_simple_list/filter/insert_comment.xml @@ -0,0 +1,28 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_list/filter/search.xml b/modules/board/skins/cozy_simple_list/filter/search.xml new file mode 100644 index 000000000..6c85e1254 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/filter/search.xml @@ -0,0 +1,15 @@ + +
+ + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_list/filter/vote.xml b/modules/board/skins/cozy_simple_list/filter/vote.xml new file mode 100644 index 000000000..0870a7551 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/filter/vote.xml @@ -0,0 +1,13 @@ + +
+ + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_list/footer.html b/modules/board/skins/cozy_simple_list/footer.html new file mode 100644 index 000000000..c6171637a --- /dev/null +++ b/modules/board/skins/cozy_simple_list/footer.html @@ -0,0 +1,2 @@ + +{$module_info->footer_text} diff --git a/modules/board/skins/cozy_simple_list/header.html b/modules/board/skins/cozy_simple_list/header.html new file mode 100644 index 000000000..0f408784f --- /dev/null +++ b/modules/board/skins/cozy_simple_list/header.html @@ -0,0 +1,51 @@ + + + + + + {@$module_info->colorset = "red"} + + + + + + + + + + + + +{$module_info->header_text} + + +
+

{$module_info->title}

+
+
+ Total {number_format($total_count)}  +
    + + +
  • {$lang->member_info}
  • +
  • {$lang->cmd_logout}
  • + + + +
  • {$lang->cmd_setup}
  • + + + +
  • {$lang->cmd_signup}
  • +
  • {$lang->cmd_login}
  • + + + +
  • RSS
  • + + +
  • +
+
+ + diff --git a/modules/board/skins/cozy_simple_list/images/blue/bg_title.gif b/modules/board/skins/cozy_simple_list/images/blue/bg_title.gif new file mode 100644 index 000000000..ff67b452b Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/blue/bg_title.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/blue/bg_title_norepeat.gif b/modules/board/skins/cozy_simple_list/images/blue/bg_title_norepeat.gif new file mode 100644 index 000000000..aec4de0b0 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/blue/bg_title_norepeat.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/blue/bg_top_title.gif b/modules/board/skins/cozy_simple_list/images/blue/bg_top_title.gif new file mode 100644 index 000000000..99eecde67 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/blue/bg_top_title.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/bluish_green/bg_title.gif b/modules/board/skins/cozy_simple_list/images/bluish_green/bg_title.gif new file mode 100644 index 000000000..c5cf6b136 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/bluish_green/bg_title.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/bluish_green/bg_title_norepeat.gif b/modules/board/skins/cozy_simple_list/images/bluish_green/bg_title_norepeat.gif new file mode 100644 index 000000000..227cf252b Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/bluish_green/bg_title_norepeat.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/bluish_green/bg_top_title.gif b/modules/board/skins/cozy_simple_list/images/bluish_green/bg_top_title.gif new file mode 100644 index 000000000..160682e41 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/bluish_green/bg_top_title.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/bar_1x7_c0c0c0.gif b/modules/board/skins/cozy_simple_list/images/common/bar_1x7_c0c0c0.gif new file mode 100644 index 000000000..1d2f92ff7 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/bar_1x7_c0c0c0.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/bar_1x8_c0c0c0.gif b/modules/board/skins/cozy_simple_list/images/common/bar_1x8_c0c0c0.gif new file mode 100644 index 000000000..f37814f58 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/bar_1x8_c0c0c0.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/bg_repeat_x_eaeaea.gif b/modules/board/skins/cozy_simple_list/images/common/bg_repeat_x_eaeaea.gif new file mode 100644 index 000000000..0b011fe5d Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/bg_repeat_x_eaeaea.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn4_rss.gif b/modules/board/skins/cozy_simple_list/images/common/btn4_rss.gif new file mode 100644 index 000000000..50584f6d5 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn4_rss.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_admin.gif b/modules/board/skins/cozy_simple_list/images/common/btn_admin.gif new file mode 100644 index 000000000..bea6e158e Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_admin.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_cancel.gif b/modules/board/skins/cozy_simple_list/images/common/btn_cancel.gif new file mode 100644 index 000000000..65b303e06 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_cancel.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_cancel3.gif b/modules/board/skins/cozy_simple_list/images/common/btn_cancel3.gif new file mode 100644 index 000000000..5dfcfd0b7 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_cancel3.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_delete.gif b/modules/board/skins/cozy_simple_list/images/common/btn_delete.gif new file mode 100644 index 000000000..84a26c508 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_delete.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_delete2.gif b/modules/board/skins/cozy_simple_list/images/common/btn_delete2.gif new file mode 100644 index 000000000..1fcb5e906 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_delete2.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_edit.gif b/modules/board/skins/cozy_simple_list/images/common/btn_edit.gif new file mode 100644 index 000000000..3f7bd62b1 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_edit.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_findid.gif b/modules/board/skins/cozy_simple_list/images/common/btn_findid.gif new file mode 100644 index 000000000..de53c3d16 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_findid.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_findpw.gif b/modules/board/skins/cozy_simple_list/images/common/btn_findpw.gif new file mode 100644 index 000000000..26f254d9a Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_findpw.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_joinus.gif b/modules/board/skins/cozy_simple_list/images/common/btn_joinus.gif new file mode 100644 index 000000000..beed35641 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_joinus.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_list.gif b/modules/board/skins/cozy_simple_list/images/common/btn_list.gif new file mode 100644 index 000000000..8e56215c8 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_list.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_login.gif b/modules/board/skins/cozy_simple_list/images/common/btn_login.gif new file mode 100755 index 000000000..b5e6a3e9e Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_login.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_logout.gif b/modules/board/skins/cozy_simple_list/images/common/btn_logout.gif new file mode 100644 index 000000000..0233282e6 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_logout.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_manage.gif b/modules/board/skins/cozy_simple_list/images/common/btn_manage.gif new file mode 100755 index 000000000..6f5cd05b7 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_manage.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_modify.gif b/modules/board/skins/cozy_simple_list/images/common/btn_modify.gif new file mode 100644 index 000000000..7b4321472 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_modify.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_my.gif b/modules/board/skins/cozy_simple_list/images/common/btn_my.gif new file mode 100644 index 000000000..72e626189 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_my.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_preview.gif b/modules/board/skins/cozy_simple_list/images/common/btn_preview.gif new file mode 100755 index 000000000..e66ee6ca5 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_preview.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_print.gif b/modules/board/skins/cozy_simple_list/images/common/btn_print.gif new file mode 100755 index 000000000..56e0efb04 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_print.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_reply.gif b/modules/board/skins/cozy_simple_list/images/common/btn_reply.gif new file mode 100644 index 000000000..1482218b6 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_reply.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_reply2.gif b/modules/board/skins/cozy_simple_list/images/common/btn_reply2.gif new file mode 100644 index 000000000..5f34a2ea8 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_reply2.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_rss.gif b/modules/board/skins/cozy_simple_list/images/common/btn_rss.gif new file mode 100755 index 000000000..424624cfd Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_rss.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_scrap.gif b/modules/board/skins/cozy_simple_list/images/common/btn_scrap.gif new file mode 100755 index 000000000..29d9beb44 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_scrap.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_search.gif b/modules/board/skins/cozy_simple_list/images/common/btn_search.gif new file mode 100644 index 000000000..0a12014d3 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_search.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_vote.gif b/modules/board/skins/cozy_simple_list/images/common/btn_vote.gif new file mode 100755 index 000000000..5a637cb0e Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_vote.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/btn_write.gif b/modules/board/skins/cozy_simple_list/images/common/btn_write.gif new file mode 100644 index 000000000..53a2e1cf0 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/btn_write.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/buttonAscending.gif b/modules/board/skins/cozy_simple_list/images/common/buttonAscending.gif new file mode 100644 index 000000000..b405cc323 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/buttonAscending.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/buttonDescending.gif b/modules/board/skins/cozy_simple_list/images/common/buttonDescending.gif new file mode 100644 index 000000000..2dc5575ff Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/buttonDescending.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/buttonTypeInput24.gif b/modules/board/skins/cozy_simple_list/images/common/buttonTypeInput24.gif new file mode 100644 index 000000000..0dcfc0e3d Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/buttonTypeInput24.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/iconArrow.gif b/modules/board/skins/cozy_simple_list/images/common/iconArrow.gif new file mode 100644 index 000000000..267b36495 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/iconArrow.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/iconFile.gif b/modules/board/skins/cozy_simple_list/images/common/iconFile.gif new file mode 100644 index 000000000..d48f9c181 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/iconFile.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/iconTag.gif b/modules/board/skins/cozy_simple_list/images/common/iconTag.gif new file mode 100644 index 000000000..ecfdb5585 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/iconTag.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/icon_arrow_reply.gif b/modules/board/skins/cozy_simple_list/images/common/icon_arrow_reply.gif new file mode 100644 index 000000000..bbabbd7ea Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/icon_arrow_reply.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/icon_gofirst.gif b/modules/board/skins/cozy_simple_list/images/common/icon_gofirst.gif new file mode 100644 index 000000000..68ba6ef96 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/icon_gofirst.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/icon_golast.gif b/modules/board/skins/cozy_simple_list/images/common/icon_golast.gif new file mode 100644 index 000000000..f2450047d Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/icon_golast.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/icon_notice.gif b/modules/board/skins/cozy_simple_list/images/common/icon_notice.gif new file mode 100644 index 000000000..d9fb255f3 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/icon_notice.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/txt_date.gif b/modules/board/skins/cozy_simple_list/images/common/txt_date.gif new file mode 100644 index 000000000..524d2d782 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/txt_date.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/txt_hit.gif b/modules/board/skins/cozy_simple_list/images/common/txt_hit.gif new file mode 100644 index 000000000..cc9771319 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/txt_hit.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/txt_hot.gif b/modules/board/skins/cozy_simple_list/images/common/txt_hot.gif new file mode 100644 index 000000000..34e12c1ee Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/txt_hot.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/txt_name.gif b/modules/board/skins/cozy_simple_list/images/common/txt_name.gif new file mode 100644 index 000000000..789dba359 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/txt_name.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/txt_option.gif b/modules/board/skins/cozy_simple_list/images/common/txt_option.gif new file mode 100644 index 000000000..9cb5202b7 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/txt_option.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/common/txt_title.gif b/modules/board/skins/cozy_simple_list/images/common/txt_title.gif new file mode 100644 index 000000000..34125f7a7 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/common/txt_title.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/green/bg_title.gif b/modules/board/skins/cozy_simple_list/images/green/bg_title.gif new file mode 100644 index 000000000..9223e8058 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/green/bg_title.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/green/bg_title_norepeat.gif b/modules/board/skins/cozy_simple_list/images/green/bg_title_norepeat.gif new file mode 100644 index 000000000..57aa0ebea Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/green/bg_title_norepeat.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/green/bg_top_title.gif b/modules/board/skins/cozy_simple_list/images/green/bg_top_title.gif new file mode 100644 index 000000000..95cfa0245 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/green/bg_top_title.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/pink/bg_title.gif b/modules/board/skins/cozy_simple_list/images/pink/bg_title.gif new file mode 100644 index 000000000..4c587d473 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/pink/bg_title.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/pink/bg_title_norepeat.gif b/modules/board/skins/cozy_simple_list/images/pink/bg_title_norepeat.gif new file mode 100644 index 000000000..80a473e84 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/pink/bg_title_norepeat.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/pink/bg_top_title.gif b/modules/board/skins/cozy_simple_list/images/pink/bg_top_title.gif new file mode 100644 index 000000000..d218b2a9e Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/pink/bg_top_title.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/red/bg_title.gif b/modules/board/skins/cozy_simple_list/images/red/bg_title.gif new file mode 100644 index 000000000..f693fc693 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/red/bg_title.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/red/bg_title_norepeat.gif b/modules/board/skins/cozy_simple_list/images/red/bg_title_norepeat.gif new file mode 100644 index 000000000..f1b2417f5 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/red/bg_title_norepeat.gif differ diff --git a/modules/board/skins/cozy_simple_list/images/red/bg_top_title.gif b/modules/board/skins/cozy_simple_list/images/red/bg_top_title.gif new file mode 100644 index 000000000..c4ae66243 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/images/red/bg_top_title.gif differ diff --git a/modules/board/skins/cozy_simple_list/input_password_form.html b/modules/board/skins/cozy_simple_list/input_password_form.html new file mode 100644 index 000000000..985f1ffd5 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/input_password_form.html @@ -0,0 +1,27 @@ + + + +
+ +
+

{$lang->msg_input_password}

+
+ +
+ + + + + + + +
+ +
+ + + diff --git a/modules/board/skins/cozy_simple_list/js/board.js b/modules/board/skins/cozy_simple_list/js/board.js new file mode 100644 index 000000000..f40a0b9c0 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/js/board.js @@ -0,0 +1,152 @@ +/** + * @file modules/board/js/board.js + * @author zero (zero@nzeo.com) + * @brief board 모듈의 javascript + **/ + +/* 관리자가 카트 선택시 세션에 넣음 */ +function doAddCart(mid, obj) { + var srl = obj.value; + var check_flag = obj.checked?'add':'remove'; + + var params = new Array(); + params["mid"] = mid; + params["srl"] = srl; + params["check_flag"] = check_flag; + + exec_xml("board","procBoardAdminAddCart", params, null); +} + +/* 글쓰기 작성후 */ +function completeDocumentInserted(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var category_srl = ret_obj['category_srl']; + + alert(message); + + var url = current_url.setQuery('mid',mid).setQuery('document_srl',document_srl).setQuery('act',''); + if(category_srl) url = url.setQuery('category',category_srl); + location.href = url; +} + +/* 글 삭제 */ +function completeDeleteDocument(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var page = ret_obj['page']; + + var url = "./?mid="+mid; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 검색 실행 */ +function completeSearch(fo_obj, params) { + fo_obj.submit(); +} + +/* 추천, 추천은 별도의 폼입력이 필요 없어 직접 필터 사용 */ +function doVote() { + var fo_obj = document.getElementById('fo_document_info'); + procFilter(fo_obj, vote); +} + +function completeVote(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + alert(message); + location.href = location.href; +} + +// 현재 페이지 reload +function completeReload(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + location.href = location.href; +} + +/* 댓글 글쓰기 작성후 */ +function completeInsertComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var comment_srl = ret_obj['comment_srl']; + + var url = "./?mid="+mid+"&document_srl="+document_srl; + if(comment_srl) url += "#comment_"+comment_srl; + + alert(message); + + location.href = url; +} + +/* 댓글 삭제 */ +function completeDeleteComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 트랙백 삭제 */ +function completeDeleteTrackback(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 카테고리 이동 */ +function doChangeCategory() { + var sel_obj = xGetElementById("board_category"); + var sel_idx = sel_obj.selectedIndex; + var category_srl = sel_obj.options[sel_idx].value; + location.href = current_url.setQuery('category',category_srl); +} + +/* 스크랩 */ +function doScrap(document_srl) { + var params = new Array(); + params["document_srl"] = document_srl; + exec_xml("member","procMemberScrapDocument", params, null); +} + +// Editor Reply And Trackback Toggle +function toggleReply() { + xGetElementById('reply').style.display = 'block'; + xGetElementById('trackback').style.display = 'none'; + xGetElementById('toggleReply').parentNode.className = 'selected'; + xGetElementById('toggleTrackback').parentNode.className = ''; +} + +function toggleTrackback() { + xGetElementById('reply').style.display = 'none'; + xGetElementById('trackback').style.display = 'block'; + xGetElementById('toggleReply').parentNode.className = ''; + xGetElementById('toggleTrackback').parentNode.className = 'selected'; +} diff --git a/modules/board/skins/cozy_simple_list/list.html b/modules/board/skins/cozy_simple_list/list.html new file mode 100644 index 000000000..b93e4e1c8 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/list.html @@ -0,0 +1,158 @@ + + + + + + + + + + + + + {@ $order_icon = "buttonDescending.gif" } + {@ $order_type = "asc"; } + + {@ $order_icon = "buttonAscending.gif" } + {@ $order_type = "desc"; } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
{$lang->title}{$lang->nick_name}{$lang->readed_count}{$lang->voted_count}{$lang->regdate}
{$lang->notice}
{$no}{$category_list[$document->get('category_srl')]->title} +
+ + document_srl])-->checked="checked" /> + + + + + {$document->getTitleText($module_info->subject_cut_size)} + + {$document->getTitleText($module_info->subject_cut_size)} + + + {$document->getTitleText($module_info->subject_cut_size)} + + + + [R{$document->getCommentCount()}] + + + + [T{$document->getTrackbackCount()}] + +
+
{$document->getNickName()}
{$document->get('readed_count')}{$document->get('voted_count')}{$document->getRegdate('Y-m-d')}
+ + + + + + + +
+ {$lang->cmd_list} + + {$lang->cmd_write} + + + {$lang->cmd_manage_document} + +
+
+ + + + + + diff --git a/modules/board/skins/cozy_simple_list/message.html b/modules/board/skins/cozy_simple_list/message.html new file mode 100644 index 000000000..00bf01814 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/message.html @@ -0,0 +1,11 @@ + + +
+ {$message} +
+ + + {$lang->cmd_login} + + + diff --git a/modules/board/skins/cozy_simple_list/screenshot/blue.gif b/modules/board/skins/cozy_simple_list/screenshot/blue.gif new file mode 100644 index 000000000..9748eb1df Binary files /dev/null and b/modules/board/skins/cozy_simple_list/screenshot/blue.gif differ diff --git a/modules/board/skins/cozy_simple_list/screenshot/bluish_green.gif b/modules/board/skins/cozy_simple_list/screenshot/bluish_green.gif new file mode 100644 index 000000000..797ad039d Binary files /dev/null and b/modules/board/skins/cozy_simple_list/screenshot/bluish_green.gif differ diff --git a/modules/board/skins/cozy_simple_list/screenshot/green.gif b/modules/board/skins/cozy_simple_list/screenshot/green.gif new file mode 100644 index 000000000..d82e8e629 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/screenshot/green.gif differ diff --git a/modules/board/skins/cozy_simple_list/screenshot/pink.gif b/modules/board/skins/cozy_simple_list/screenshot/pink.gif new file mode 100644 index 000000000..e1ad8580a Binary files /dev/null and b/modules/board/skins/cozy_simple_list/screenshot/pink.gif differ diff --git a/modules/board/skins/cozy_simple_list/screenshot/red.gif b/modules/board/skins/cozy_simple_list/screenshot/red.gif new file mode 100644 index 000000000..cefacbff1 Binary files /dev/null and b/modules/board/skins/cozy_simple_list/screenshot/red.gif differ diff --git a/modules/board/skins/cozy_simple_list/skin.xml b/modules/board/skins/cozy_simple_list/skin.xml new file mode 100644 index 000000000..6d1fffadb --- /dev/null +++ b/modules/board/skins/cozy_simple_list/skin.xml @@ -0,0 +1,145 @@ + + + cozy simple (목록형) + Cozyシンプル(リストスタイル) + cozy simple skin (list style) + Cozy样式皮肤(目录型) + + (주)NHN + (株)NHN + (株)NHN + NHN Corp + + cozy simple 스킨의 목록형입니다. + 디자인 : 서기정 (http://blog.naver.com/addcozy) + HTML/CSS : 소지훈 + + + Cozyシンプルスキンのリストスタイルです。 + 디자인 : 서기정 (http://blog.naver.com/addcozy) + HTML/CSS : 소지훈 + + + This is list style board of cozy simple skin. + Design : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + Cozy样式皮肤。(目录型) + 设计 : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + + + 빨간색(기본) + + Red (default) + 红色(默认) + + + 녹색 + + Green + 绿色 + + + 파란색 + + Blue + 蓝色 + + + 분홍색 + ピンク + Pink + 粉红色 + + + 청록색 + 青緑 + Cyan + 青绿色 + + + + + 정렬 대상 + ソート対象 + 排序对象 + Align Target + select + 등록된 순서 또는 변경된 순서로 정렬을 할 수 있습니다. + 登録された順、変更された順でソートできます。 + 可对主题按发表顺或最后更新顺进行排序。 + It can align articles as registered order or modified order. + newest + updated + + + 게시판 제목 + 掲示板タイトル + 版面标题 + Title of Board + 게시판의 제목을 적어주세요. + 掲示板タイトルを入力してください。 + 请输入版面标题。(留空为不显示) + Please input the title of board. + + + 제목 글자수 + タイトルの文字数 + 标题字数 + Length of Subject + 제목 글자수를 지정할 수 있습니다. (0또는 비워주시면 자르지 않습니다) + タイトルの文字数が指定できます(「0」または空欄の場合は、文字数を制限しません)。 + 可以指定标题字数。(0或留空为不限) + You may set length of title. (0 or blank value will not restrict the length) + + + 번호 표시 + 番号表示 + 显示编号 + Display Number + Y + N + + + + 글쓴이 표시 + 投稿者表示 + 显示昵称 + Display Author + Y + N + + + + 작성일 표시 + 作成日表示 + 显示发表日期 + Display Registered Date + Y + N + + + + 조회수 표시 + 照合数表示 + 显示查看数 + Display Hit + Y + N + + + + 추천수 표시 + 推薦数表示 + 显示推荐数 + Display Votes + Y + N + + + + diff --git a/modules/board/skins/cozy_simple_list/trackback.html b/modules/board/skins/cozy_simple_list/trackback.html new file mode 100644 index 000000000..29b00b1d1 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/trackback.html @@ -0,0 +1,25 @@ + + +
+ + + {@ $idx = 0 } + + +
+ +
+ {htmlspecialchars($val->blog_name)} + + {zdate($val->regdate, "Y.m.d H:i")} + ({$val->ipaddress}) + +
+
+ {@ $idx++} + + +
diff --git a/modules/board/skins/cozy_simple_list/view_document.html b/modules/board/skins/cozy_simple_list/view_document.html new file mode 100644 index 000000000..90b7060d6 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/view_document.html @@ -0,0 +1,134 @@ + + + +
+ + +
+ + +
+
+
+
+

{$oDocument->getTitleText()}

+ + |{$category_list[$oDocument->get('category_srl')]->title} + +
+ +
+ + {$oDocument->getRegdate('Y.m.d')} {$oDocument->getRegdate('H:i:s')} + + + {$lang->cmd_modify} + {$lang->cmd_delete} + +
+
+ +
+
{$lang->document_url} : {$oDocument->getPermanentUrl()}
+ +
{$lang->trackback_url} : {$oDocument->getTrackbackUrl()}
+ +
+ +
+
{$oDocument->getNickName()}
+ +
{$oDocument->get('ipaddress')}
+ +
+
+ + + + + + + + + + + + + +
{$val->name} + + +
+ + +
{$oDocument->getContent()}
+ +
+ {@ $tag_list = $oDocument->get('tag_list') } + +
+
{$lang->tag}
+ +
+ + + + + +
+ +
    +
  • + {$lang->cmd_print} + {$lang->cmd_scrap} + {$lang->cmd_vote} + {$lang->cmd_list} +
  • +
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_list/write_form.html b/modules/board/skins/cozy_simple_list/write_form.html new file mode 100644 index 000000000..016412f57 --- /dev/null +++ b/modules/board/skins/cozy_simple_list/write_form.html @@ -0,0 +1,115 @@ + + + +
+
fileupload)-->enctype="multipart/form-data" class="boardEditor" id="fo_write"> +
+ + + + + +
+ + + + + + + + + + + +
+ + +
+ + + + + + + +
+ +
+
{$lang->setup}
+ +
+ isNotice())-->checked="checked" id="is_notice" /> + +
+
+ isLocked())-->checked="checked" id="lock_comment" /> + +
+ +
+ isSecret())-->checked="checked" id="is_secret" /> + +
+
+ allowComment())-->checked="checked" id="allow_comment" /> + +
+
+ allowTrackback())-->checked="checked" id="allow_trackback" /> + +
+ +
+ useNotify())-->checked="checked" id="notify_message" /> + +
+ +
+ +
{$editor}
+ +
+ + + +
+ +
+ + +

{$lang->about_tag}

+
+ + + +
+ + + +
+ + + +
+ +
+ {$lang->cmd_preview} + + {$lang->cmd_back} +
+
+
+ diff --git a/modules/board/skins/cozy_simple_webzine/comment.html b/modules/board/skins/cozy_simple_webzine/comment.html new file mode 100644 index 000000000..d92cb2cfb --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/comment.html @@ -0,0 +1,62 @@ +
+ {@ $idx = 0 } + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + +
{$val->content} + + {$lang->cmd_delete} + {$lang->cmd_modify} + + {$lang->cmd_reply} +
+ +
+
{htmlspecialchars($val->nick_name)}
+ + {zdate($val->regdate, "Y.m.d H:i")} + + ({$val->ipaddress}) + + +
+ + +
+
+ +
+ + {@ $idx++} + + +
diff --git a/modules/board/skins/cozy_simple_webzine/comment_form.html b/modules/board/skins/cozy_simple_webzine/comment_form.html new file mode 100644 index 000000000..0e2048ede --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/comment_form.html @@ -0,0 +1,67 @@ + + + + + + + + + +
+
+
+
+ {$source_comment->content} +
+ +
{htmlspecialchars($source_comment->nick_name)}
+ + {zdate($source_comment->regdate, "Y.m.d H:i")} + + ({$source_comment->ipaddress}) + + +
+
+
+ + + +
+ +
fileupload)-->enctype="multipart/form-data" class="boardEditor" id="fo_comment_write" > +
+ + + + + + + +
+ + + + + + + + + + + +
+ + +
{$comment_editor}
+ +
+ +
+ +
+
+ + + + diff --git a/modules/board/skins/cozy_simple_webzine/css/blue.css b/modules/board/skins/cozy_simple_webzine/css/blue.css new file mode 100644 index 000000000..085c6985c --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/css/blue.css @@ -0,0 +1,19 @@ +@charset "utf-8"; + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; background:#1187d8 url(../images/blue/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.boardList { width:100%; position:relative; border-bottom:2px solid #1187d8; border-collapse:collapse; } + +.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/blue/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#007ed5; cursor:default; position:relative; top:-.2em;} +.boardList td.recommend { font:bold .8em Tahoma; color:#007ed5; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#007ed5; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #1187d8;} +.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #1187d8; overflow:hidden;} +.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#007ed5;} + +.boardWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;} +.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/blue/bg_title_norepeat.gif) no-repeat left bottom;} +.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/blue/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} diff --git a/modules/board/skins/cozy_simple_webzine/css/bluish_green.css b/modules/board/skins/cozy_simple_webzine/css/bluish_green.css new file mode 100644 index 000000000..9c221ce62 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/css/bluish_green.css @@ -0,0 +1,19 @@ +@charset "utf-8"; + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; background:#9ab09f url(../images/bluish_green/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.boardList { width:100%; position:relative; border-bottom:2px solid #9ab09f; border-collapse:collapse; } + +.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/bluish_green/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#9ab09f; cursor:default; position:relative; top:-.2em;} +.boardList td.recommend { font:bold .8em Tahoma; color:#9ab09f; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#9ab09f; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #9ab09f;} +.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #9ab09f; overflow:hidden;} +.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#9ab09f;} + +.boardWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;} +.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/bluish_green/bg_title_norepeat.gif) no-repeat left bottom;} +.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/bluish_green/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} diff --git a/modules/board/skins/cozy_simple_webzine/css/common.css b/modules/board/skins/cozy_simple_webzine/css/common.css new file mode 100644 index 000000000..d0256f332 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/css/common.css @@ -0,0 +1,540 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +/* ----- List+Read+Write+Modify | Start ----- */ +.boardHeader h3 { float:left; clear:both; padding:1.9em 1.5em 1.8em 1.5em; font-size:1.2em; color:#FFFFFF;} + +/* boardInformation */ +.boardInformation { width:100%; clear:both; margin:0 0 .5em 0; background:#EFEFEF; color:#8D8D8D; overflow:hidden;} +.articleNum { float:left; padding:.5em 0 .5em 2.3em; font:.8em Tahoma;} +.articleNum strong { margin:0 0 0 .5em; padding:0 0 0 .7em; font:bold .9em Tahoma; color:#6F6F6F; background:url(../images/common/bar_1x8_c0c0c0.gif) no-repeat left .1em;} +.accountNavigation { float:right; margin:.3em .5em 0 0; overflow:hidden;} +.accountNavigation li { list-style:none; float:left; margin:0 0 0 -.1em; padding:.1em .8em 0 .8em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left .3em;} +.accountNavigation li a {} + +/* boardList */ +.boardList tr:first-child td, .boardList tr.first-child td {} +.boardList tr.notice {} +.boardList tr.notice .num { font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; font-weight:bold;} + +.boardList th a { color:#3e3f3e;} +.boardList th span.on { font-weight:bold;} +.boardList th.num { background-position:-3px bottom; padding:0;} +.boardList th select { height:20px; } +.boardList th.category { padding:0 .2em 0 .5em;} +.boardList th.category.thumbStyle { background-position:-3px bottom !important; border-left:1px solid #ffffff; text-align:left;} +.boardList th:first-child { background-position:-2px bottom;} +.boardList th.first-child { background-position:-2px bottom;} +.boardList th.author {} +.boardList th.title {} +.boardList th.reading { white-space:nowrap;} +.boardList th.recommend { white-space:nowrap;} +.boardList th.reply { white-space:nowrap;} +.boardList th.date {} +.boardList th.check { padding:0;} +.boardList th.user {} +.boardList th.registDate {} +.boardList th.checkDate {} +.boardList th.friendGroup {} +.boardList th.userId {} +.boardList th.userName {} +.boardList th.userNick {} +.boardList th.sendMessage {} +.boardList th.last-child { border-right:1px solid #ffffff;} +.boardList th .sort { padding:0 .2em; vertical-align:middle;} +.boardList th select, +.boardList th input { vertical-align:middle;} + +.boardList td { padding:.3em; border-bottom:1px solid #e4e4e2;} +.boardList td.noline { border-bottom:none;} +.boardList td.num { font:.8em Tahoma; color:#999999; padding:.5em .5em .5em 1.5em;} +.boardList td.category {} +.boardList tr.notice td { padding:.3em; white-space:nowrap;} +.boardList tr.notice td img { margin:-.1em .3em 0 0;} +.boardList td.thumb { padding:.5em 0 .5em .5em; width:130px; table-layout:fixed; white-space:nowrap;} +.boardList td.thumb * { vertical-align:middle;} +.boardList td.title.bold { font-size:1em; font-weight:bold;} +.boardList td.title.bold a { position:relative; top:.3em;} +.boardList td.title * { vertical-align:middle;} +.boardList td.title, +.boardList td.title a { color:#444444; text-decoration:none; } +.boardList td.title a:visited { color:#777777;} +.boardList td.title .title_wrap { width:100%; overflow:hidden; white-space:nowrap;} +.boardList td.author { padding:0 .5em 0 1.3em; color:#333333; font:.95em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;} +.boardList td.author a { font-size:1em; color:#333333;} +.boardList td.reading { font:.8em Tahoma; color:#999999; text-align:center;} +.boardList td.reply { font:bold .8em Tahoma; color:#ff6600; text-align:center;} +.boardList td.date { font:.8em Tahoma; color:#999999; text-align:center;} +.boardList td.registDate { font:.8em Tahoma; color:#999999; text-align:center;} +.boardList td.checkDate { font:.8em Tahoma; color:#333333; text-align:center;} +.boardList td.summary { border-top:none; vertical-align:top; color:#666666; line-height:1.25em;padding:5px 5px 10px 5px;} +.boardList td.summary a { color:#666666; text-decoration:none; line-height:inherit;} +.boardList td.summary a:visited { color:#999999;} +.boardList td.check { text-align:center;} +.boardList td.user { color:#333333; font-size:.9em;} +.boardList td.user a { color:#333333;} +.boardList td.userId { font:.9em Tahoma;} +.boardList td.userName {} +.boardList td.userNick { font-size:.9em; color:#999999;} +.boardList td.friendGroup {} +.boardList td.sendMessage { text-align:center; padding:0;} +.boardList td.sendMessage .buttonFixedLeft { position:relative; left:20%; _left:0;} +*:first-child+html .boardList td.sendMessage .buttonFixedLeft { left:0;} +.boardList td input { _margin:-3px;} +.boardList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#ff6600; cursor:default; position:relative; top:.3em;} +.boardList td .replyAndTrackback strong { font:bold 1em Tahoma;} + +.boardList td .thumbnailSmall { margin:0 .3em 0 .3em;} +.boardList td .thumbnailSmall img {} +.boardList td .thumbnailMedium { margin:0 .3em 0 .3em;} +.boardList td .thumbnailMedium img {} + +.boardList.thumbnail {} +.boardList.thumbnail td { border-top:none; border-bottom:1px solid #eff0ed; padding:1.5em 0 0 1.5em; overflow:hidden;} +.boardList.thumbnail div.cell { float:left; width:131px; margin:0 1.6em 0 0; padding-bottom:1.5em;} +.boardList.thumbnail div.cell .fix_img { width:131px; height:106px; overflow:hidden;} +.boardList.thumbnail div.title { color:#444444; margin:.5em 0 .2em 0;} +.boardList.thumbnail div.title a { color:#444444;} +.boardList.thumbnail div.nameAndDate { font-size:.9em; color:#999999; margin-bottom:.2em; padding-left:3px;} +.boardList.thumbnail div.nameAndDate a { color:#999999;} +.boardList.thumbnail div.nameAndDate .date { font:.8em Tahoma; color:#999999;} +.boardList.thumbnail div.readAndRecommend { font-size:.9em; color:#666666; padding-left:3px;} +.boardList.thumbnail div.readAndRecommend .num { font:.8em Tahoma;} +.boardList.thumbnail div.readAndRecommend .vr { color:#dddddd;} +.boardList.thumbnail div.readAndRecommend strong.num { font:bold .8em Tahoma; color:#494949;} + +/* boardSearch */ +.boardSearch { clear:both; text-align:center; margin-top:3em;} +.boardSearch fieldset { display:inline; padding:10px 15px 10px 15px; border:none; background:#F4F4F4; overflow:hidden; } +.boardSearch fieldset legend { overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} +.boardSearch * { vertical-align:middle;} +.boardSearch select { float:left;} +.boardSearch input { float:left; margin:0 .3em; background:#fbfbfb;} +.searchButton ul { overflow:hidden;} +.searchButton li { float:left; margin-right:.3em; list-style:none;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; background:url(../images/common/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} + + +/* pageNavigation */ +.pageNavigation { float:left; display:block; margin:2.2em 0 2em 1.1em; font:bold .8em Tahoma; } +.pageNavigation a, .pageNavigation a:visited, .pageNavigation a:active { margin-left:-4px; font:bold .8em Tahoma; color:#676767; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } +.pageNavigation a:hover { text-decoration:none; } +.pageNavigation a.goToFirst, +.pageNavigation a.goToLast { border:none; border-right:1px solid #ffffff; border-left:1px solid #ffffff; z-index:99; padding:1px 5px 3px 4px;} +.pageNavigation a.goToFirst img, +.pageNavigation a.goToLast img { vertical-align:middle;} + +.buttonBox { float:right; margin:1.2em 0 0 0; } + +/* boardRead */ +#blog .boardRead { position:relative; margin:0; _overflow:hidden;} +.boardRead .originalContent { padding:2em 0 2em 0;} +.boardRead .titleAndCategory { float:left;} +.boardRead .titleAndCategory h4 { font-size:1.4em; display:inline; padding-left:.2em;} +.boardRead .titleAndCategory .vr { font-size:.9em; margin:0 .3em; color:#c5c7c0;} +.boardRead .titleAndCategory .category { font-size:.9em; color:#999999; white-space:nowrap;} + +.boardRead .dateAndModify { font-size:.8em; float:right; white-space:nowrap;} +.boardRead .dateAndModify .date { font-size:.8em; font-family:Tahoma; color:#999999; margin-right:.5em; float:left; position:relative; top:.1em;} +.boardRead .dateAndModify .date strong { font-size:1em; font-family:Tahoma;} +.boardRead .dateAndModify ul { display:inline; margin:0 .4em 0 0;} +.boardRead .dateAndModify ul li { float:left; margin-left:.3em; list-style:none;} +.boardRead dl.uri { float:right; overflow:hidden; margin:0 0 3em .3em;} +.boardRead dl.uri dt { float:left; clear:left; font-size:.9em; margin-right:.3em; color:#999999;} +.boardRead dl.uri dd { clear:right; font-size:.8em; color:#d4d5d0;} +.boardRead dl.uri dd span { font-family:Tahoma; color:#d4d5d0;} +.boardRead .readBody { padding:0 .3em; color:#555555; overflow:hidden; margin-bottom:2em;} +.boardRead .readBody p { margin:1em 0; line-height:1.5em;} +.boardRead .contentBody { width:100%; overflow:hidden; } + +.boardRead .userInfo { float:left; white-space:nowrap;} +.boardRead .userInfo .author { padding:0 .3em 0 0; color:#3074a5; margin-right:.3em;} +.boardRead .userInfo .ipaddress { font-size:.9em; font-family:Tahoma; color:#888888; margin-right:.5em; } + +/* extraVars list */ +.extraVarsList { width:100%; border:1px solid #e0e1db; clear:both; margin-bottom:1em;} +.extraVarsList tr.notice { background:#f8f8f8;} +.extraVarsList tr.notice .num { font-size:.9em; font-weight:bold;} +.extraVarsList tr.bg1 { background:#ffffff} +.extraVarsList tr.bg2 { background:#fbfbfb;} +.extraVarsList th { color:#3e3f3e; font-weight:bold; padding:.8em .5em .5em .5em; border-bottom:1px solid #eff0ed; border-right:1px solid #eff0ed;} +.extraVarsList td { border-bottom:1px solid #eff0ed; padding:.5em .5em .5em 1em;} + +.boardRead .readFooter { border-top:1px solid #dfe0db; } +.boardRead .readFooter .tag { margin-bottom:1em; padding:1em 0 0 0; } +.boardRead .readFooter .tag h5 { display:inline; font-size:1em; margin:0 .3em 0 1.8em;} +.boardRead .readFooter .tag ul, +.boardRead .readFooter .tag li { display:inline;} +.boardRead .readFooter .tag a { color:#444444; text-decoration:none;} +.boardRead .readFooter .tag .tagIcon { vertical-align:middle;} +.boardRead .readFooter .fileAttached { padding:1em 1em .8em 0; position:relative; _width:100%; border-bottom:1px solid #dfdfdd; overflow:hidden; background:#f9f9f9;} +.boardRead .readFooter .fileAttached h5 {} +.boardRead .readFooter .fileAttached ul { margin-left:1.8em;} +.boardRead .readFooter .fileAttached li { float:left; margin-right:.75em; line-height:1.6em; color:#888888; white-space:nowrap; list-style:none;} +.boardRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em .2em; white-space:nowrap; position:relative; color:#888888; text-decoration:none; } +.boardRead .readFooter .fileAttached li a:visited { color:#777777;} + +.listButton li { list-style:none; clear:both; text-align:right; margin-top:.5em; } + +.boardRead .replyAndTrackback { float:left; width:100%; background:url(../images/common/bg_repeat_x_eaeaea.gif) repeat-x left bottom; overflow:hidden;} +.boardRead .replyAndTrackback li { float:left; font-weight:bold; margin:.3em 0 0 0; padding:.7em 1.1em .7em 1.2em; color:#FFFFFF; background:#B8B8B8; list-style:none;} +.boardRead .replyAndTrackback li a { color:#FFFFFF; text-decoration:none; } +.boardRead .replyAndTrackback li strong { padding:0 1.1em 0 0; background:#B8B8B8 url(../images/common/icon_close.gif) no-repeat right .2em;} +.boardRead .replyAndTrackback li.selected a { color:#666666;} +.boardRead .replyAndTrackback li.selected strong { padding:0 1.1em 0 0; background:#FFFFFF url(../images/common/icon_open.gif) no-repeat right .2em;} +.boardRead .replyAndTrackback a#toggleReply { background:url(../images/common/buttonToggleReply.gif) no-repeat right top;} +.boardRead .replyAndTrackback a#toggleTrackback { background:url(../images/common/buttonToggleReply.gif) no-repeat right -13px;} + +.boardRead #reply, +.boardRead #trackback { color:#666666; border-left:1px solid #EAEAEA; border-right:1px solid #EAEAEA; border-bottom:1px solid #EAEAEA; padding-top:1em;} +.boardRead #reply { } +.boardRead #trackback { display:none;} + +.boardRead .topBorder { border-top:1px solid #EAEAEA; } + +.boardRead #reply .contentBox, +.boardRead #trackback .contentBox { line-height:1.25em; color:#676767; clear:both; padding:1em; overflow:hidden;} +.boardRead #reply .top_border, +.boardRead #trackback .top_border { border-top:1px dashed #d8d8d8; } + +.boardRead .contentBox .content { width:100%; overflow:hidden; clear:both; margin-bottom:1em; } +.boardRead .contentBox .author { float:left; overflow:hidden; color:#3173a3;} +.boardRead .contentBox .date { float:right; font:.8em Tahoma; color:#cccccc; margin-left:.5em; } +.boardRead .contentBox .replyOption { float:right; display:inline; white-space:nowrap; margin-left:.5em; } +.boardRead .contentBox .replyOption img { vertical-align:middle;} + +.boardRead .contentBox .fileAttached { position:relative; _width:100%; overflow:hidden; clear:both; } +.boardRead .contentBox .fileAttached h5 {} +.boardRead .contentBox .fileAttached ul { margin-bottom:.5em;} +.boardRead .contentBox .fileAttached li { float:left; margin-right:.75em; line-height:1.6em; color:#888888; white-space:nowrap; list-style:none;} +.boardRead .contentBox .fileAttached li a { font-size:.9em; padding:.1em 0 .1em .2em; white-space:nowrap; position:relative; color:#888888; text-decoration:none; } +.boardRead .contentBox .fileAttached li a:visited { color:#777777;} + +.boardRead .contentBox .title a { color:#676767 ; margin-right:.3em; text-decoration:none;} +.boardRead .contentBox address a { font-size:.9em; color:#3173a3; margin-right:.3em; text-decoration:none; } +.boardRead .contentBox address .trackback_date { font:.8em Tahoma; color:#cccccc; margin-left:.5em; } +.boardRead .indent_box { background-color:#FBFBFB; } +.boardRead .contentBox .indent {padding-left:1.5em; background:url(../images/common/icon_arrow_reply.gif) no-repeat left .1em;} + +/* boardEditor */ +.boardEditor { padding:.5em 0 1em 0; width:100%; overflow:hidden;} +.boardEditor.reply { padding:.5em 1em 1em 1em; width:auto; overflow:hidden;} +.boardEditor legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em;} +.boardEditor fieldset { _width:100%; border:0px solid #eaeae7; border-top:none;} +.boardEditor .userNameAndPw { position:relative; background:#fbfbfb; border-top:1px solid #eaeae7; border-bottom:1px solid #e1e1e1; padding:.5em 1em; white-space:nowrap;} +.boardEditor .userNameAndPw * { vertical-align:middle;} +.boardEditor .userNameAndPw label { margin-right:.2em; color:#666760;} +.boardEditor .userNameAndPw input { color:#aaaaaa;} +.boardEditor .userNameAndPw .userName { width:6em; margin-right:.8em;} +.boardEditor .userNameAndPw .userPw { width:5em;} +.boardEditor .userNameAndPw .emailAddress { width:6em;} +.boardEditor .userNameAndPw .homePage { width:6em;} +.boardEditor .userNameAndPw .checkSecret { position:absolute; right:2em; top:.7em;} + +/* boardWrite */ +.boardWrite { width:100%; position:relative;} +.boardWrite .userNameAndPw { margin-bottom:-1px;} + +.boardWrite div.title label.title { display:block; float:left; font-weight:bold; padding:.4em 0 0 1.5em; width:9.5em; white-space:nowrap;} +.boardWrite div.title input#title { width:60%;} + +.boardWrite .option dt { display:block; float:left; font-weight:bold; padding:.3em 0 0 1.5em; width:9.5em; white-space:nowrap;} +.boardWrite .option dd { float:left; margin-right:1em; padding-top:.2em; _padding-top:.1em;} +.boardWrite .option dd * { vertical-align:middle;} +.boardWrite .inputTypeText { background:#fbfbfb;} +.boardWrite .trackbackURI { clear:both; border-top:1px solid #eff0ed; padding:4px 0 .8em 0;} +.boardWrite .trackbackURI label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .trackbackURI .inputTypeText { width:50%;} +.boardWrite .tag { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;} +.boardWrite .tag label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .tag .inputTypeText { width:50%;} +.boardWrite .tag .help { vertical-align:middle;} +.boardWrite .tag .info { padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;} +.boardWrite .extra_vars { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;} +.boardWrite .extra_vars label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .extra_vars .info { clear:both; padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;} +.boardWrite .extra_vars ul li { float:left; margin-right:1em; } + +/* ----- List+Read+Write+Modify | End ----- */ + +/* ----- Blog | Start ----- */ +#blog #bodyWrap #login_menu { padding:0 1.2em;} +#blog #bodyWrap #login_menu .member { float:right} +#blog #bodyWrap #login_menu .member li {display:inline; margin:0 0 0 -.1em; padding:0 .6em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left center;} +#blog #bodyWrap #login_menu .login {float:right} + + +/* Blog header Child*/ +#blog #header h1 { font:bold 1.3em 돋움; margin:2em 0 .4em 30px; letter-spacing:-.05em; } +#blog #header h1 a { color:#FFFFFF;} +#blog #header #tagLine { padding:0 0 0 30px; color:#f6c8c8;} +#blog #header #globalNavigation { width:100%; margin:2.4em 0 0 0; padding:.8em 0 .8em 53.5em; background:#e4e4e4; overflow:hidden;} +#blog #header #globalNavigation li { float:left; margin-left:-1px; background:url(../images/common/bar_1x10_c0c0c0.gif) no-repeat left bottom;} +#blog #header #globalNavigation li.no_bg { background:none;} +#blog #header #globalNavigation li a { display:block; float:left; padding:0 1.2em; font:bold .8em Tahoma; color:#54564b; white-space:nowrap;} +#blog #header #globalNavigation li.on a { color:#ee2126;} + +/* Column Left & Right Common Child */ +.boxTypeA { position:relative; border:5px solid #F2F2F2; margin-bottom:.7em;} +.boxTypeB { position:relative; margin-bottom:.7em;} +.boxTypeB h2 { position:relative; padding:7px 0 0 12px; height:21px; _height:20px; background:#f5f5f5; font-size:1em; color:#ef2121; font-family:Tahoma;} +*:first-child+html .boxTypeB h2 { height:20px; color:#ef2121;} +.boxTypeB .toggleMask {position:absolute; top:8px; right:5px; cursor:pointer; width:13px; height:13px; overflow:hidden;} +.boxTypeB .showHide { position:relative;} +.boxTypeB .optionList { position:absolute; top:8px; right:0; overflow:hidden;} +.boxTypeB .optionList li { float:left; padding:0 .5em; margin-left:-1px; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left center;} +.boxTypeB .optionList li a { color:#a4a4a4; font-size:.9em;} +.boxTypeB .optionList li.on a { color:#000000;} +.boxTypeB .showAll { color:#737373; font:bold .9em tahoma; white-space:nowrap; display:inline-block; padding:.4em .8em; background:url(../images/common/bar_1x8_c0c0c0.gif) no-repeat right center;} +.boxTypeB .showAll.no_bg { background:none;} + +/* Profile */ +#blog div#profile { padding:6px; overflow:hidden;} +#blog div#profile img.profile { width:153px; display:block; margin-bottom:1.2em;} +#blog div#profile dl#hello {} +#blog div#profile dl#hello dt { color:#333333; margin-bottom:.5em;} +#blog div#profile dl#hello dt a { color:#333333;} +#blog div#profile dl#hello dd { color:#777777; margin-bottom:1em;} +#blog div#profile ul#admin { overflow:hidden; height:1.2em;} +#blog div#profile ul#admin li { float:left; padding:0 .4em; font:.8em tahoma;} +#blog div#profile ul#admin li a { display:block;} +#blog div#profile ul#admin li.write a {} +#blog div#profile ul#admin li.setup { border-left:1px solid #e3e3e3;} +#blog div#profile ul#admin li.setup a {} +#blog div#profile ul#admin li a { color:#666666;} + +/* Category */ +#blog div#category {} +#blog div#category #categoryList { padding:1em .8em .5em .8em;} +#blog div#category #categoryList li { position:relative; padding:0 0 0 15px; background:url(../images/common/iconFolderClose.gif) no-repeat 2px top;} +#blog div#category #categoryList li li {} +#blog div#category #categoryList li li li { background:url(../images/common/iconList.gif) no-repeat 5px top;} +#blog div#category #categoryList a { display:block; _display:inline-block; color:#6b6b6b; margin:0 0 6px 5px;} + +/* Search Box */ +#blog div#searchBox { margin-bottom:.7em; padding:.6em; background:#f5f5f5; overflow:hidden;} +#blog div#searchBox fieldset { border:none;} +#blog div#searchBox fieldset legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} + +/* Tags */ +#blog div#tag { padding-bottom:1em;} +#blog div#tag .tagList { padding:1.2em; overflow:hidden;} +#blog div#tag .tagList li { display:inline; color:#a4a4a4; margin-right:.1em; line-height:1.5em;} +#blog div#tag .tagList li a { color:#a4a4a4;} +#blog div#tag .tagList li.typeA a { color:#717171; font-weight:bold;} +#blog div#tag .tagList li.typeB a { color:#3d3d3d;} +#blog div#tag .tagList li.typeC a { font-weight:bold;} +#blog div#tag .tag_sort { width:100%; border-top:1px dashed #ababab; border-bottom:1px dashed #ababab; text-align:center; overflow:hidden;} + +/* Neighbor */ +#blog div#neighbor {} +#blog div#neighbor #neighborList { padding:1.2em 1.2em 0 1.2em;} +#blog div#neighbor #neighborList li { padding:0 0 .7em 1.2em; background:url(../images/common/iconPlus2.gif) no-repeat left top;} +#blog div#neighbor #neighborList li img { padding-left:.3em; top:.1em;} +#blog div#neighbor #neighborList li a { display:inline-block; color:#6b6b6b; font-weight:bold;} +#blog div#neighbor #neighborList li ul { display:none; padding:.7em 0 0 0;} +#blog div#neighbor #neighborList li ul li { padding:0 0 .6em .6em; margin-left:-.6em; background:url(../images/common/iconLineBD.gif) no-repeat left 5px;} +#blog div#neighbor #neighborList li ul li a{ font-weight:normal;} + +/* Calendar */ +#blog div#calendar {} +#blog div#calendar table { width:100%; background:url(../images/common/bg_line_dot_x.gif) repeat-x left top;} +#blog div#calendar table caption { font:bold 1em 돋움; color:#ec1a25; padding:1em;} +#blog div#calendar table caption .mm { font:bold 1em 돋움; color:#555650;} +#blog div#calendar table caption a { padding:.2em;} +#blog div#calendar table caption a img { vertical-align:middle;} +#blog div#calendar table th { padding:.6em 0;} +#blog div#calendar table td { padding:.25em 0;} +#blog div#calendar table th { font:bold .7em tahoma; color:#717171;} +#blog div#calendar table th.sun { color:#000000;} +#blog div#calendar table td { text-align:center;} +#blog div#calendar table td a { font:.7em Tahoma; color:#9a9a9a;} +#blog div#calendar table td.sun { color:#000000;} +#blog div#calendar table td.sun a { color:#000000;} +#blog div#calendar table td.today a { font-weight:bold; color:#54564b;} +#blog div#calendar table td.posted a { text-decoration:underline;} + +#blog .boardWrite div.title { border-top:2px solid #ed1b24;} +#blog .write_post h3 {margin:1.5em 1em 1em 1em; font:bold 1.2em 돋움;} +/* ----- Blog | End ----- */ + + +/* ----- Member | Start ----- */ + +.memberHeader { position:relative; _width:100%; background:#ED2027 url(../images/common/bg_top_title.gif) no-repeat 23px -6px; overflow:hidden;} +.memberHeader h3 { float:left; clear:both; padding:1.2em 0 1em 1.7em; font-size:1.1em; color:#FFFFFF;} +.memberInformation { width:100%; clear:both; margin:0 0 .5em 0; background:#EFEFEF; color:#8D8D8D; overflow:hidden;} +.memberInformation .friendNum { float:left; padding:.7em 0 .7em 2em; background:url(../images/common/iconFriend.gif) no-repeat .5em .4em;} +.memberInformation .friendNum strong { font:bold 11px Tahoma; color:#ec2127;} +.memberInformation .addGroup { float:right; margin:.8em 1em .7em 0;} +.memberInformation .instantMessage { float:right; margin:.7em; overflow:hidden;} +.memberInformation .instantMessage li { float:left; margin:0 0 0 -.1em; padding:0 .5em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left .25em;} +.memberInformation .instantMessage li a {white-space:nowrap; color:#666666;} +.memberInformation .instantMessage li.on a { background-position:left -14px; font-weight:bold;} +.memberInformation .instantMessage li a strong { font:bold 0.75em tahoma; color:#ee202a;} + +/* 친구목록 */ +.memberList { width:100%; position:relative; border-bottom:2px solid #ED2A32; border-collapse:collapse;} + +.memberList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/common/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.memberList th.check { padding:0;} +.memberList th.friendGroup { padding:0 0 0 .3em; text-align:left;} +.memberList th select, +.memberList th input { vertical-align:middle;} +.memberList th.repeat_bg { background:#ffffff url(../images/common/bg_title_repeat_x.gif) repeat-x left bottom;} + +.memberList td { padding:.3em; border-bottom:1px solid #e4e4e2;} +.memberList td.noline { border-bottom:none;} +.memberList td.check { text-align:center;} +.memberList td.friendGroup { } +.memberList td.userId { text-align:center; font:.9em Tahoma;} +.memberList td.userName { text-align:center;} +.memberList td.userNick { text-align:center; color:#999999;} +.memberList td.registDate { text-align:center; font:.8em Tahoma;} +.memberList td.sendMessage { text-align:center;} + + +.smallBox { margin:5em auto 1em auto;} +.smallBox.w268 { width:268px;} +.smallBox.w298 { width:298px;} +.smallBox.w498 { width:498px;} +.smallBox .header { position:relative; _width:100%; background:#ed2027; overflow:hidden;} +.smallBox .header h3 { font-size:1.2em; color:#FFFFFF; padding:1em 2em .8em 1em;} +.smallBox .login { position:relative; border:none; padding:2.4em 0 2em 2.3em;} +.smallBox .login legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} +.smallBox .login dl { overflow:hidden; width:162px; float:left;} +.smallBox .login dl dt { float:left; width:55px; color:#54564b; height:22px; padding-top:5px;} +.smallBox .login dl dd { float:left; width:105px; height:27px;} +.smallBox .login dl dd input { width:90px;} +.smallBox .login .loginButton { display:block; float:left; margin-top:27px; _margin-top:28px;} +*:first-child+html .smallBox .login .loginButton { margin-top:28px;} +.smallBox .login .keep { float:left; clear:both; white-space:nowrap; position:relative; left:55px; _left:52px;} +*:first-child+html .smallBox .login .keep { left:52px;} +.smallBox .login .keep input { vertical-align:middle;} +.smallBox .login .keep label { font-size:11px; color:#999999;} +.smallBox .help { background:#F7F7F7; border-top:1px solid #ed2a32; border-bottom:2px solid #ee2b33; overflow:hidden; padding:1.1em; text-align:center; height:1em;} +.smallBox .help li { display:inline; padding:0 .3em 0 .7em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left center;} +.smallBox .help li:first-child { background:none;} +.smallBox .help li.first-child { _background:none;} +.smallBox .help li a { font-size:11px; color:#54564b;} +.smallBox .text { color:#54564b; text-align:center; padding:4.25em 2em 4.8em 2em;} +.smallBox .text p { margin-bottom:.5em;} +.smallBox .button img { vertical-align:top;} +.smallBox.w268 .button ul { position:absolute; left:79px; } +.smallBox.w298 .button ul { position:absolute; left:110px; } +.smallBox.w498 .button ul { position:absolute; left:220px; } +.smallBox .button ul li { float:left; margin-right:.3em;} +.smallBox .complex { padding:1.5em 2em 2em 2em;} +.smallBox .friend { width:100%;} +.smallBox .friend th { width:7em; padding:.9em; border-bottom:1px solid #e4e5e0;} +.smallBox .friend td { padding:.9em; border-bottom:1px solid #e4e5e0; background:url(../images/common/bar_1x18_e4e5e0.gif) no-repeat left bottom;} +.smallBox .leftHeaderType { border-top:1px solid #e0e1db; border-left:1px solid #e0e1db; width:100%;} +.smallBox .leftHeaderType th, +.smallBox .leftHeaderType td { border-right:1px solid #e0e1db; border-bottom:1px solid #e0e1db; padding:.8em 1em .6em 1em;} +.smallBox .leftHeaderType th { color:#333333; text-align:left; background:#f5f5f3;} +.smallBox .leftHeaderType td { color:#444444;} +.smallBox .inputTypeText { background:#fbfbfb;} +.smallBox .group { overflow:hidden; padding:.5em 0; margin-top:.7em;} +.smallBox .group select { float:left; width:180px; margin-top:1px;} +.smallBox .pwModify { border:none;} +.smallBox .pwModify legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} +.smallBox .pwModify input { width:9em;} +.smallBox .pwModify br { display:block; margin-bottom:.2em} +.smallBox .pwModify p { text-align:center; margin-top:1em; color:#54564b;} + + +/* messageList */ +.messageList { width:100%; position:relative; border-bottom:2px solid #ed2a32; border-collapse:collapse;} +.messageList tr.notice .num { font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; font-weight:bold;} + +.messageList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/common/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.messageList th:first-child, +.messageList th.first-child { background-position:-3px bottom;} +.messageList th.author { background:url(../images/common/bg_title_repeat_x.gif) repeat-x left bottom; text-align:left;} +.messageList th.check { padding:0;} +.messageList th select, +.messageList th input { vertical-align:middle;} + +.messageList td { padding:.3em; border-bottom:1px solid #EFEFEF;} +.messageList td.noline { border-bottom:none;} +.messageList td.category {} +.messageList tr.notice td { padding:.7em .7em .7em .9em; white-space:nowrap;} +.messageList tr.notice td img { margin:-.1em .3em 0 0;} +.messageList td.thumb { padding:.5em 0 .5em .5em; width:145px; table-layout:fixed; white-space:nowrap;} +.messageList td.thumb * { vertical-align:middle;} +.messageList td.title {} +.messageList td.title.bold { font-size:1em; font-weight:bold;} +.messageList td.title.bold a { position:relative; top:.3em;} +.messageList td.title * { vertical-align:middle;} +.messageList td.title, +.messageList td.title a { color:#444444;} +.messageList td.title a:visited { color:#777777;} +.messageList td.author { padding:0 .5em 0 1.3em; color:#333333; font:.95em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;} +.messageList td.author a { font-size:1em; color:#333333;} +.messageList td.reading { font:.8em Tahoma; color:#999999; text-align:center;} +.messageList td.recommend { font:bold .8em Tahoma; color:#ec2127; text-align:center;} +.messageList td.reply { font:bold .8em Tahoma; color:#ff6600; text-align:center;} +.messageList td.date { font:.8em Tahoma; color:#999999; text-align:center;} +.messageList td.registDate { font:.8em Tahoma; color:#999999; text-align:center;} +.messageList td.checkDate { font:.8em Tahoma; color:#333333; text-align:center;} +.messageList td.summary { border-top:none; vertical-align:top; color:#666666; line-height:1.25em;} +.messageList td.summary a { color:#666666; text-decoration:none; line-height:inherit;} +.messageList td.summary a:visited { color:#999999;} +.messageList td.check { text-align:center;} +.messageList td.user { color:#333333; font-size:.9em;} +.messageList td.user a { color:#333333;} +.messageList td.userId { font:.9em Tahoma;} +.messageList td.userNick { font-size:.9em; color:#999999;} +.messageList td.sendMessage { text-align:center; padding:0;} +.messageList td.sendMessage .buttonFixedLeft { position:relative; left:20%; _left:0;} + +.readMessage { margin-bottom:2em;} +.readMessage .messageHeader { padding:1.5em; height:1em; overflow:hidden;} +.readMessage .messageHeader h4 { float:left; padding-left:.5em; font-size:1em; background:url(../images/common/iconArrow99.gif) no-repeat left .3em;} +.readMessage .messageHeader address { float:right; white-space:nowrap;} +.readMessage .messageHeader address em { font-size:.9em; font-style:normal; color:#333333; margin-right:.3em;} +.readMessage .messageHeader address em a { color:#333333;} +.readMessage .messageHeader address .date { font:.8em Tahoma; color:#999999;} +.readMessage .messageBody { border:1px solid #e0e1db; margin:0 1.5em 1.5em 1.5em; padding:1em; position:relative; color:#666666;} +.readMessage .deleteOrKeep { padding:.5em 0; overflow:hidden; background:#f5f5f3; border-top:1px solid #eaebe7; _width:100%;} +.readMessage .deleteOrKeep li { position:relative; left:40%; float:left; margin-right:.5em;} +.readMessage .button { position:relative; background:#f7f7f7; border-top:1px solid #ee2b33; border-bottom:2px solid #ee2b33; overflow:hidden; padding:.7em; text-align:center;} + + +.joinTable.typeA { border-top:2px solid #ee1b24; border-collapse:collapse;} +.joinTable.typeB { border-bottom:2px solid #ee1b24; background:#f9f9f9;} +.joinTable.typeC { border-top:2px solid #ee2b33; border-bottom:2px solid #ee2b33; border-collapse:collapse;} +.joinTable.typeB caption { border-top:1px dashed #919191; background:#f9f9f9;} +.joinTable { width:100%;} +.joinTable caption { padding:2em 0 .5em 1.5em; font-weight:bold; text-align:left; background:url(../images/common/iconH3.gif) no-repeat .5em 2em;} +.joinTable th, +.joinTable td { padding:.7em .5em .7em 1.5em; text-align:left; border-top:1px solid #eff0eb;} +.joinTable td { background:url(../images/common/bar_1x18_e4e5e0.gif) no-repeat left bottom;} +.joinTable th { width:10em;} +.joinTable td textarea { width:40em; height:4.5em; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:3px; line-height:1em; background:#fbfbfb; vertical-align:middle; float:left; margin-right:.5em; margin-bottom:.5em; color:#666666; overflow:auto;} +.joinTable td input { border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:3px; height:1em; line-height:1em; background:#fbfbfb; vertical-align:middle; float:left; margin-right:.5em; margin-bottom:.5em; color:#666666;} +.joinTable td input.radio, +.joinTable td input.check { border:none; padding:0; margin:0; background:none; margin-top:.4em;} +.joinTable td input.w4em { width:4em;} +.joinTable td input.w2em { width:2em;} +.joinTable td select { float:left; margin-right:.5em;} +.joinTable td .fl { margin-right:.5em;} +.joinTable td br { clear:both;} +.joinTable td p { float:left; font-size:.9em; color:#999999; padding-top:.5em; margin-right:.5em;} +.joinTable td label { float:left; color:#3f4040; padding-top:.3em; margin-right:.5em;} +.joinTable td a { color:#333333;} +.joinTable .no_line { border:none;} +.join_button { margin:1em 0 0 0; text-align:center;} +.joinTable .add_info { padding:2.5em .5em .7em 1.5em; background:#f9f9f9; border-top:1px dashed #919191;} +.buttonTypeWrite.join { margin-top:1.2em;} + +/* ----- Member | End ----- */ + + +.smallBox .inputPassword { position:relative; border:none; padding:2em 2em 1.5em 2em;} +.smallBox .inputPassword .inputTypeText { float:left; margin-right:.5em; width:8em;} +.smallBox .inputPassword legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} diff --git a/modules/board/skins/cozy_simple_webzine/css/green.css b/modules/board/skins/cozy_simple_webzine/css/green.css new file mode 100644 index 000000000..592d74f50 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/css/green.css @@ -0,0 +1,20 @@ +@charset "utf-8"; + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; background:#8dc63f url(../images/green/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.boardList { width:100%; position:relative; border-bottom:2px solid #8dc63f; border-collapse:collapse; } + +.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/green/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#27a939; cursor:default; position:relative; top:-.2em;} +.boardList td.recommend { font:bold .8em Tahoma; color:#27a939; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#27a939; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #8dc63f;} +.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #8dc63f; overflow:hidden;} +.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#8dc63f;} + +.boardWrite fieldset.bottomBorder { border-bottom:2px solid #8dc63f;} +.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/green/bg_title_norepeat.gif) no-repeat left bottom;} +.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/green/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} + diff --git a/modules/board/skins/cozy_simple_webzine/css/pink.css b/modules/board/skins/cozy_simple_webzine/css/pink.css new file mode 100644 index 000000000..7269ac2a4 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/css/pink.css @@ -0,0 +1,19 @@ +@charset "utf-8"; + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; background:#f70795 url(../images/pink/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.boardList { width:100%; position:relative; border-bottom:2px solid #f70795; border-collapse:collapse; } + +.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/pink/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#f70795; cursor:default; position:relative; top:-.2em;} +.boardList td.recommend { font:bold .8em Tahoma; color:#f70795; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#f70795; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #f70795;} +.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #f70795; overflow:hidden;} +.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#f70795;} + +.boardWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;} +.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/pink/bg_title_norepeat.gif) no-repeat left bottom;} +.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/pink/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} diff --git a/modules/board/skins/cozy_simple_webzine/css/red.css b/modules/board/skins/cozy_simple_webzine/css/red.css new file mode 100644 index 000000000..b703a9dbb --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/css/red.css @@ -0,0 +1,19 @@ +@charset "utf-8"; + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; background:#ED2027 url(../images/red/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.boardList { width:100%; position:relative; border-bottom:2px solid #ed2a32; border-collapse:collapse; } + +.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/red/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#ed1f29; cursor:default; position:relative; top:-.2em;} +.boardList td.recommend { font:bold .8em Tahoma; color:#ec2127; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#ff6600; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #ed2228;} +.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #ee202a; overflow:hidden;} +.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#eb1c22;} + +.boardWrite fieldset.bottomBorder { border-bottom:2px solid #ed1b24;} +.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/red/bg_title_norepeat.gif) no-repeat left bottom;} +.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/red/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} diff --git a/modules/board/skins/cozy_simple_webzine/delete_comment_form.html b/modules/board/skins/cozy_simple_webzine/delete_comment_form.html new file mode 100644 index 000000000..984c3ac8e --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/delete_comment_form.html @@ -0,0 +1,24 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + + +
+
+ + diff --git a/modules/board/skins/cozy_simple_webzine/delete_form.html b/modules/board/skins/cozy_simple_webzine/delete_form.html new file mode 100644 index 000000000..1ca638c93 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/delete_form.html @@ -0,0 +1,23 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + +
+
+ + diff --git a/modules/board/skins/cozy_simple_webzine/delete_trackback_form.html b/modules/board/skins/cozy_simple_webzine/delete_trackback_form.html new file mode 100644 index 000000000..f907b6793 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/delete_trackback_form.html @@ -0,0 +1,25 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + + +
+
+ + + diff --git a/modules/board/skins/cozy_simple_webzine/extra_var_form.html b/modules/board/skins/cozy_simple_webzine/extra_var_form.html new file mode 100644 index 000000000..564cec9d9 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/extra_var_form.html @@ -0,0 +1,65 @@ + + + + + {@ $val->default = explode(',',$val->default) } + + + +{@ $val->column_name = "extra_vars".$key} + + +{@ $val->value = $oDocument->getExtraValue($key)} + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
  • value)&&in_array($v, $val->value))-->checked="checked"/> {$v}
  • + +
+ + + + + + + + + +
{zdate($val->value,"Y-m-d")}
+ {$lang->cmd_open_calendar} + + + +

{$val->desc}

+ diff --git a/modules/board/skins/cozy_simple_webzine/extra_var_value.html b/modules/board/skins/cozy_simple_webzine/extra_var_value.html new file mode 100644 index 000000000..0d5b21657 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/extra_var_value.html @@ -0,0 +1,57 @@ + + + +{@ $val->column_name = "extra_vars".$key} + + +{@ $val->value = $oDocument->getExtraValue($key)} + + + + {htmlspecialchars($val->value)} + + + + + {$val->value} + +   + + + + + + {$val->value} + +   + + + + + {htmlspecialchars($val->value[0])} + - + {htmlspecialchars($val->value[1])} + - + {htmlspecialchars($val->value[2])} + + + + {nl2br(htmlspecialchars($val->value))} + + + + + {@ $_tmp_value[] = htmlspecialchars($v)} + + {implode(",",$_tmp_value)} + + + + {htmlspecialchars($val->value)} + + + + {zdate($val->value,"Y-m-d")} + + +  diff --git a/modules/board/skins/cozy_simple_webzine/filter/delete_comment.xml b/modules/board/skins/cozy_simple_webzine/filter/delete_comment.xml new file mode 100644 index 000000000..115ea00d9 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/filter/delete_comment.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_webzine/filter/delete_document.xml b/modules/board/skins/cozy_simple_webzine/filter/delete_document.xml new file mode 100644 index 000000000..7627f5a63 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/filter/delete_document.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_webzine/filter/delete_trackback.xml b/modules/board/skins/cozy_simple_webzine/filter/delete_trackback.xml new file mode 100644 index 000000000..2140675f8 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/filter/delete_trackback.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_webzine/filter/input_password.xml b/modules/board/skins/cozy_simple_webzine/filter/input_password.xml new file mode 100644 index 000000000..55cb6d8e0 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/filter/input_password.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_webzine/filter/insert.xml b/modules/board/skins/cozy_simple_webzine/filter/insert.xml new file mode 100644 index 000000000..85d1ed4ce --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/filter/insert.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_webzine/filter/insert_comment.xml b/modules/board/skins/cozy_simple_webzine/filter/insert_comment.xml new file mode 100644 index 000000000..ba2216c8a --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/filter/insert_comment.xml @@ -0,0 +1,28 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_webzine/filter/search.xml b/modules/board/skins/cozy_simple_webzine/filter/search.xml new file mode 100644 index 000000000..6c85e1254 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/filter/search.xml @@ -0,0 +1,15 @@ + +
+ + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_webzine/filter/vote.xml b/modules/board/skins/cozy_simple_webzine/filter/vote.xml new file mode 100644 index 000000000..0870a7551 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/filter/vote.xml @@ -0,0 +1,13 @@ + +
+ + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_webzine/footer.html b/modules/board/skins/cozy_simple_webzine/footer.html new file mode 100644 index 000000000..c6171637a --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/footer.html @@ -0,0 +1,2 @@ + +{$module_info->footer_text} diff --git a/modules/board/skins/cozy_simple_webzine/header.html b/modules/board/skins/cozy_simple_webzine/header.html new file mode 100644 index 000000000..faf6313b1 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/header.html @@ -0,0 +1,50 @@ + + + + + + {@$module_info->colorset = "red"} + + + + + + + + + + + + +{$module_info->header_text} + + +
+

{$module_info->title}

+
+
+ Total {number_format($total_count)}  +
    + + +
  • {$lang->member_info}
  • +
  • {$lang->cmd_logout}
  • + + + +
  • {$lang->cmd_setup}
  • + + + +
  • {$lang->cmd_signup}
  • +
  • {$lang->cmd_login}
  • + + + +
  • RSS
  • + +
  • +
+
+ + diff --git a/modules/board/skins/cozy_simple_webzine/images/blue/bg_title.gif b/modules/board/skins/cozy_simple_webzine/images/blue/bg_title.gif new file mode 100644 index 000000000..ff67b452b Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/blue/bg_title.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/blue/bg_title_norepeat.gif b/modules/board/skins/cozy_simple_webzine/images/blue/bg_title_norepeat.gif new file mode 100644 index 000000000..aec4de0b0 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/blue/bg_title_norepeat.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/blue/bg_top_title.gif b/modules/board/skins/cozy_simple_webzine/images/blue/bg_top_title.gif new file mode 100644 index 000000000..99eecde67 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/blue/bg_top_title.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/bluish_green/bg_title.gif b/modules/board/skins/cozy_simple_webzine/images/bluish_green/bg_title.gif new file mode 100644 index 000000000..c5cf6b136 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/bluish_green/bg_title.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/bluish_green/bg_title_norepeat.gif b/modules/board/skins/cozy_simple_webzine/images/bluish_green/bg_title_norepeat.gif new file mode 100644 index 000000000..227cf252b Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/bluish_green/bg_title_norepeat.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/bluish_green/bg_top_title.gif b/modules/board/skins/cozy_simple_webzine/images/bluish_green/bg_top_title.gif new file mode 100644 index 000000000..160682e41 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/bluish_green/bg_top_title.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/bar_1x7_c0c0c0.gif b/modules/board/skins/cozy_simple_webzine/images/common/bar_1x7_c0c0c0.gif new file mode 100644 index 000000000..1d2f92ff7 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/bar_1x7_c0c0c0.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/bar_1x8_c0c0c0.gif b/modules/board/skins/cozy_simple_webzine/images/common/bar_1x8_c0c0c0.gif new file mode 100644 index 000000000..f37814f58 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/bar_1x8_c0c0c0.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/bg_repeat_x_eaeaea.gif b/modules/board/skins/cozy_simple_webzine/images/common/bg_repeat_x_eaeaea.gif new file mode 100644 index 000000000..0b011fe5d Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/bg_repeat_x_eaeaea.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn4_rss.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn4_rss.gif new file mode 100644 index 000000000..50584f6d5 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn4_rss.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_admin.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_admin.gif new file mode 100644 index 000000000..bea6e158e Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_admin.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_cancel.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_cancel.gif new file mode 100644 index 000000000..65b303e06 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_cancel.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_cancel3.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_cancel3.gif new file mode 100644 index 000000000..5dfcfd0b7 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_cancel3.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_delete.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_delete.gif new file mode 100644 index 000000000..84a26c508 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_delete.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_delete2.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_delete2.gif new file mode 100644 index 000000000..1fcb5e906 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_delete2.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_edit.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_edit.gif new file mode 100644 index 000000000..3f7bd62b1 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_edit.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_findid.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_findid.gif new file mode 100644 index 000000000..de53c3d16 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_findid.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_findpw.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_findpw.gif new file mode 100644 index 000000000..26f254d9a Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_findpw.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_joinus.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_joinus.gif new file mode 100644 index 000000000..beed35641 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_joinus.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_list.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_list.gif new file mode 100644 index 000000000..8e56215c8 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_list.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_login.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_login.gif new file mode 100755 index 000000000..b5e6a3e9e Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_login.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_logout.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_logout.gif new file mode 100644 index 000000000..0233282e6 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_logout.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_manage.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_manage.gif new file mode 100755 index 000000000..6f5cd05b7 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_manage.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_modify.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_modify.gif new file mode 100644 index 000000000..7b4321472 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_modify.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_my.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_my.gif new file mode 100644 index 000000000..72e626189 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_my.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_preview.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_preview.gif new file mode 100755 index 000000000..e66ee6ca5 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_preview.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_print.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_print.gif new file mode 100755 index 000000000..56e0efb04 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_print.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_reply.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_reply.gif new file mode 100644 index 000000000..1482218b6 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_reply.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_reply2.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_reply2.gif new file mode 100644 index 000000000..5f34a2ea8 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_reply2.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_rss.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_rss.gif new file mode 100755 index 000000000..424624cfd Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_rss.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_scrap.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_scrap.gif new file mode 100755 index 000000000..29d9beb44 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_scrap.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_search.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_search.gif new file mode 100644 index 000000000..0a12014d3 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_search.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_vote.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_vote.gif new file mode 100755 index 000000000..5a637cb0e Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_vote.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/btn_write.gif b/modules/board/skins/cozy_simple_webzine/images/common/btn_write.gif new file mode 100644 index 000000000..53a2e1cf0 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/btn_write.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/buttonAscending.gif b/modules/board/skins/cozy_simple_webzine/images/common/buttonAscending.gif new file mode 100644 index 000000000..b405cc323 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/buttonAscending.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/buttonDescending.gif b/modules/board/skins/cozy_simple_webzine/images/common/buttonDescending.gif new file mode 100644 index 000000000..2dc5575ff Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/buttonDescending.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/buttonTypeInput24.gif b/modules/board/skins/cozy_simple_webzine/images/common/buttonTypeInput24.gif new file mode 100644 index 000000000..0dcfc0e3d Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/buttonTypeInput24.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/iconArrow.gif b/modules/board/skins/cozy_simple_webzine/images/common/iconArrow.gif new file mode 100644 index 000000000..267b36495 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/iconArrow.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/iconFile.gif b/modules/board/skins/cozy_simple_webzine/images/common/iconFile.gif new file mode 100644 index 000000000..d48f9c181 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/iconFile.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/iconTag.gif b/modules/board/skins/cozy_simple_webzine/images/common/iconTag.gif new file mode 100644 index 000000000..ecfdb5585 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/iconTag.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/icon_arrow_reply.gif b/modules/board/skins/cozy_simple_webzine/images/common/icon_arrow_reply.gif new file mode 100644 index 000000000..bbabbd7ea Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/icon_arrow_reply.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/icon_gofirst.gif b/modules/board/skins/cozy_simple_webzine/images/common/icon_gofirst.gif new file mode 100644 index 000000000..68ba6ef96 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/icon_gofirst.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/icon_golast.gif b/modules/board/skins/cozy_simple_webzine/images/common/icon_golast.gif new file mode 100644 index 000000000..f2450047d Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/icon_golast.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/icon_notice.gif b/modules/board/skins/cozy_simple_webzine/images/common/icon_notice.gif new file mode 100644 index 000000000..d9fb255f3 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/icon_notice.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/txt_date.gif b/modules/board/skins/cozy_simple_webzine/images/common/txt_date.gif new file mode 100644 index 000000000..524d2d782 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/txt_date.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/txt_hit.gif b/modules/board/skins/cozy_simple_webzine/images/common/txt_hit.gif new file mode 100644 index 000000000..cc9771319 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/txt_hit.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/txt_hot.gif b/modules/board/skins/cozy_simple_webzine/images/common/txt_hot.gif new file mode 100644 index 000000000..34e12c1ee Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/txt_hot.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/txt_my.gif b/modules/board/skins/cozy_simple_webzine/images/common/txt_my.gif new file mode 100644 index 000000000..3c1687494 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/txt_my.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/txt_name.gif b/modules/board/skins/cozy_simple_webzine/images/common/txt_name.gif new file mode 100644 index 000000000..789dba359 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/txt_name.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/txt_option.gif b/modules/board/skins/cozy_simple_webzine/images/common/txt_option.gif new file mode 100644 index 000000000..9cb5202b7 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/txt_option.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/common/txt_title.gif b/modules/board/skins/cozy_simple_webzine/images/common/txt_title.gif new file mode 100644 index 000000000..34125f7a7 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/common/txt_title.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/green/bg_title.gif b/modules/board/skins/cozy_simple_webzine/images/green/bg_title.gif new file mode 100644 index 000000000..9223e8058 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/green/bg_title.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/green/bg_title_norepeat.gif b/modules/board/skins/cozy_simple_webzine/images/green/bg_title_norepeat.gif new file mode 100644 index 000000000..57aa0ebea Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/green/bg_title_norepeat.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/green/bg_top_title.gif b/modules/board/skins/cozy_simple_webzine/images/green/bg_top_title.gif new file mode 100644 index 000000000..95cfa0245 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/green/bg_top_title.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/pink/bg_title.gif b/modules/board/skins/cozy_simple_webzine/images/pink/bg_title.gif new file mode 100644 index 000000000..4c587d473 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/pink/bg_title.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/pink/bg_title_norepeat.gif b/modules/board/skins/cozy_simple_webzine/images/pink/bg_title_norepeat.gif new file mode 100644 index 000000000..80a473e84 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/pink/bg_title_norepeat.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/pink/bg_top_title.gif b/modules/board/skins/cozy_simple_webzine/images/pink/bg_top_title.gif new file mode 100644 index 000000000..d218b2a9e Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/pink/bg_top_title.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/red/bg_title.gif b/modules/board/skins/cozy_simple_webzine/images/red/bg_title.gif new file mode 100644 index 000000000..f693fc693 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/red/bg_title.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/red/bg_title_norepeat.gif b/modules/board/skins/cozy_simple_webzine/images/red/bg_title_norepeat.gif new file mode 100644 index 000000000..f1b2417f5 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/red/bg_title_norepeat.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/images/red/bg_top_title.gif b/modules/board/skins/cozy_simple_webzine/images/red/bg_top_title.gif new file mode 100644 index 000000000..c4ae66243 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/images/red/bg_top_title.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/input_password_form.html b/modules/board/skins/cozy_simple_webzine/input_password_form.html new file mode 100644 index 000000000..985f1ffd5 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/input_password_form.html @@ -0,0 +1,27 @@ + + + +
+ +
+

{$lang->msg_input_password}

+
+ +
+ + + + + + + +
+ +
+ + + diff --git a/modules/board/skins/cozy_simple_webzine/js/board.js b/modules/board/skins/cozy_simple_webzine/js/board.js new file mode 100644 index 000000000..f40a0b9c0 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/js/board.js @@ -0,0 +1,152 @@ +/** + * @file modules/board/js/board.js + * @author zero (zero@nzeo.com) + * @brief board 모듈의 javascript + **/ + +/* 관리자가 카트 선택시 세션에 넣음 */ +function doAddCart(mid, obj) { + var srl = obj.value; + var check_flag = obj.checked?'add':'remove'; + + var params = new Array(); + params["mid"] = mid; + params["srl"] = srl; + params["check_flag"] = check_flag; + + exec_xml("board","procBoardAdminAddCart", params, null); +} + +/* 글쓰기 작성후 */ +function completeDocumentInserted(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var category_srl = ret_obj['category_srl']; + + alert(message); + + var url = current_url.setQuery('mid',mid).setQuery('document_srl',document_srl).setQuery('act',''); + if(category_srl) url = url.setQuery('category',category_srl); + location.href = url; +} + +/* 글 삭제 */ +function completeDeleteDocument(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var page = ret_obj['page']; + + var url = "./?mid="+mid; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 검색 실행 */ +function completeSearch(fo_obj, params) { + fo_obj.submit(); +} + +/* 추천, 추천은 별도의 폼입력이 필요 없어 직접 필터 사용 */ +function doVote() { + var fo_obj = document.getElementById('fo_document_info'); + procFilter(fo_obj, vote); +} + +function completeVote(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + alert(message); + location.href = location.href; +} + +// 현재 페이지 reload +function completeReload(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + location.href = location.href; +} + +/* 댓글 글쓰기 작성후 */ +function completeInsertComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var comment_srl = ret_obj['comment_srl']; + + var url = "./?mid="+mid+"&document_srl="+document_srl; + if(comment_srl) url += "#comment_"+comment_srl; + + alert(message); + + location.href = url; +} + +/* 댓글 삭제 */ +function completeDeleteComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 트랙백 삭제 */ +function completeDeleteTrackback(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 카테고리 이동 */ +function doChangeCategory() { + var sel_obj = xGetElementById("board_category"); + var sel_idx = sel_obj.selectedIndex; + var category_srl = sel_obj.options[sel_idx].value; + location.href = current_url.setQuery('category',category_srl); +} + +/* 스크랩 */ +function doScrap(document_srl) { + var params = new Array(); + params["document_srl"] = document_srl; + exec_xml("member","procMemberScrapDocument", params, null); +} + +// Editor Reply And Trackback Toggle +function toggleReply() { + xGetElementById('reply').style.display = 'block'; + xGetElementById('trackback').style.display = 'none'; + xGetElementById('toggleReply').parentNode.className = 'selected'; + xGetElementById('toggleTrackback').parentNode.className = ''; +} + +function toggleTrackback() { + xGetElementById('reply').style.display = 'none'; + xGetElementById('trackback').style.display = 'block'; + xGetElementById('toggleReply').parentNode.className = ''; + xGetElementById('toggleTrackback').parentNode.className = 'selected'; +} diff --git a/modules/board/skins/cozy_simple_webzine/list.html b/modules/board/skins/cozy_simple_webzine/list.html new file mode 100644 index 000000000..71b4f4cc6 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/list.html @@ -0,0 +1,189 @@ + + + + + + + + + + + + + {@ $order_icon = "buttonDescending.gif" } + {@ $order_type = "asc"; } + + {@ $order_icon = "buttonAscending.gif" } + {@ $order_type = "desc"; } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
{$lang->title}{$lang->nick_name}{$lang->readed_count}{$lang->voted_count}{$lang->regdate}
{$lang->notice}{$category_list[$document->get('category_srl')]->title} +
+ + document_srl])-->checked="checked" /> + + + + + {$document->getTitleText($module_info->subject_cut_size)} + + {$document->getTitleText($module_info->subject_cut_size)} + + + {$document->getTitleText($module_info->subject_cut_size)} + + + + [R{$document->getCommentCount()}] + + + + [T{$document->getTrackbackCount()}] + +
+
{$document->getNickName()}
{$document->get('readed_count')}{$document->get('voted_count')}{$document->getRegdate('Y-m-d')}
{$no}{$category_list[$document->get('category_srl')]->title} + + + + + +
+ + document_srl])-->checked="checked" /> + + + + + {$document->getTitleText($module_info->subject_cut_size)} + + {$document->getTitleText($module_info->subject_cut_size)} + + + {$document->getTitleText($module_info->subject_cut_size)} + + + + [R{$document->getCommentCount()}] + + + + [T{$document->getTrackbackCount()}] + +
+
{$document->getNickName()}
{$document->get('readed_count')}{$document->get('voted_count')}{$document->getRegdate('Y-m-d')}
{$document->getSummary(140)}
+ + + + + + + +
+ {$lang->cmd_list} + + {$lang->cmd_write} + + + {$lang->cmd_manage_document} + +
+
+ + + + + + diff --git a/modules/board/skins/cozy_simple_webzine/message.html b/modules/board/skins/cozy_simple_webzine/message.html new file mode 100644 index 000000000..00bf01814 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/message.html @@ -0,0 +1,11 @@ + + +
+ {$message} +
+ + + {$lang->cmd_login} + + + diff --git a/modules/board/skins/cozy_simple_webzine/screenshot/blue.gif b/modules/board/skins/cozy_simple_webzine/screenshot/blue.gif new file mode 100644 index 000000000..d47abf82f Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/screenshot/blue.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/screenshot/bluish_green.gif b/modules/board/skins/cozy_simple_webzine/screenshot/bluish_green.gif new file mode 100644 index 000000000..99e8fd57c Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/screenshot/bluish_green.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/screenshot/green.gif b/modules/board/skins/cozy_simple_webzine/screenshot/green.gif new file mode 100644 index 000000000..6abb59584 Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/screenshot/green.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/screenshot/pink.gif b/modules/board/skins/cozy_simple_webzine/screenshot/pink.gif new file mode 100644 index 000000000..049b9cede Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/screenshot/pink.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/screenshot/red.gif b/modules/board/skins/cozy_simple_webzine/screenshot/red.gif new file mode 100644 index 000000000..6ee55fb6f Binary files /dev/null and b/modules/board/skins/cozy_simple_webzine/screenshot/red.gif differ diff --git a/modules/board/skins/cozy_simple_webzine/skin.xml b/modules/board/skins/cozy_simple_webzine/skin.xml new file mode 100644 index 000000000..84a38059e --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/skin.xml @@ -0,0 +1,100 @@ + + + cozy simple (웹진형) + Cozyシンプル(ウェブジンスタイル) + cozy simple skin (webzine style) + Cozy样式皮肤(网络杂志型) + + (주)NHN + (株)NHN + (株)NHN + NHN Corp + + cozy simple 스킨의 웹진형입니다. + 디자인 : 서기정 (http://blog.naver.com/addcozy) + HTML/CSS : 소지훈 + + + Cozyシンプルスキンのウェブジンスタイルです。 + デザイン:ソギジョン(http://blog.naver.com/addcozy) + HTML/CSS:ソギジョン + + + This is webzine style board of cozy simple skin. + Design : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + Cozy样式皮肤。(网络杂志型) + 设计 : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + + + 빨간색(기본) + + Red (default) + 红色(默认) + + + 녹색 + + Green + 绿色 + + + 파란색 + + Blue + 蓝色 + + + 분홍색 + ピンク + Pink + 粉红色 + + + 청록색 + 青緑 + Cyan + 青绿色 + + + + + 정렬 대상 + ソート対象 + 排序对象 + Align Target + select + 등록된 순서 또는 변경된 순서로 정렬을 할 수 있습니다. + 登録された順、変更された順でソートできます。 + 可对主题按发表顺或最后更新顺进行排序。 + It can align articles as registered order or modified order. + newest + updated + + + 게시판 제목 + 掲示板タイトル + 版面标题 + Title of Board + 게시판의 제목을 적어주세요. + 掲示板タイトルを入力してください。 + 请输入版面标题。(留空为不显示) + Please input the title of board. + + + 제목 글자수 + タイトルの文字数 + 标题字数 + Length of Subject + 제목 글자수를 지정할 수 있습니다. (0또는 비워주시면 자르지 않습니다) + タイトルの文字数が指定できます(「0」または空欄の場合は、文字数を制限しません)。 + 可以指定标题字数。(0或留空为不限) + You may set length of title. (0 or blank value will not restrict the length) + + + diff --git a/modules/board/skins/cozy_simple_webzine/trackback.html b/modules/board/skins/cozy_simple_webzine/trackback.html new file mode 100644 index 000000000..29b00b1d1 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/trackback.html @@ -0,0 +1,25 @@ + + +
+ + + {@ $idx = 0 } + + +
+ +
+ {htmlspecialchars($val->blog_name)} + + {zdate($val->regdate, "Y.m.d H:i")} + ({$val->ipaddress}) + +
+
+ {@ $idx++} + + +
diff --git a/modules/board/skins/cozy_simple_webzine/view_document.html b/modules/board/skins/cozy_simple_webzine/view_document.html new file mode 100644 index 000000000..90b7060d6 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/view_document.html @@ -0,0 +1,134 @@ + + + +
+ + +
+ + +
+
+
+
+

{$oDocument->getTitleText()}

+ + |{$category_list[$oDocument->get('category_srl')]->title} + +
+ +
+ + {$oDocument->getRegdate('Y.m.d')} {$oDocument->getRegdate('H:i:s')} + + + {$lang->cmd_modify} + {$lang->cmd_delete} + +
+
+ +
+
{$lang->document_url} : {$oDocument->getPermanentUrl()}
+ +
{$lang->trackback_url} : {$oDocument->getTrackbackUrl()}
+ +
+ +
+
{$oDocument->getNickName()}
+ +
{$oDocument->get('ipaddress')}
+ +
+
+ + + + + + + + + + + + + +
{$val->name} + + +
+ + +
{$oDocument->getContent()}
+ +
+ {@ $tag_list = $oDocument->get('tag_list') } + +
+
{$lang->tag}
+ +
+ + + + + +
+ +
    +
  • + {$lang->cmd_print} + {$lang->cmd_scrap} + {$lang->cmd_vote} + {$lang->cmd_list} +
  • +
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/cozy_simple_webzine/write_form.html b/modules/board/skins/cozy_simple_webzine/write_form.html new file mode 100644 index 000000000..016412f57 --- /dev/null +++ b/modules/board/skins/cozy_simple_webzine/write_form.html @@ -0,0 +1,115 @@ + + + +
+
fileupload)-->enctype="multipart/form-data" class="boardEditor" id="fo_write"> +
+ + + + + +
+ + + + + + + + + + + +
+ + +
+ + + + + + + +
+ +
+
{$lang->setup}
+ +
+ isNotice())-->checked="checked" id="is_notice" /> + +
+
+ isLocked())-->checked="checked" id="lock_comment" /> + +
+ +
+ isSecret())-->checked="checked" id="is_secret" /> + +
+
+ allowComment())-->checked="checked" id="allow_comment" /> + +
+
+ allowTrackback())-->checked="checked" id="allow_trackback" /> + +
+ +
+ useNotify())-->checked="checked" id="notify_message" /> + +
+ +
+ +
{$editor}
+ +
+ + + +
+ +
+ + +

{$lang->about_tag}

+
+ + + +
+ + + +
+ + + +
+ +
+ {$lang->cmd_preview} + + {$lang->cmd_back} +
+
+
+ diff --git a/modules/board/skins/default/comment.html b/modules/board/skins/default/comment.html new file mode 100644 index 000000000..1848b7a29 --- /dev/null +++ b/modules/board/skins/default/comment.html @@ -0,0 +1,75 @@ + + +
+ {$lang->comment} : {$oDocument->getCommentCount()} +
+ + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->date}{zdate($val->regdate, "Y-m-d H:i:s")}
{$lang->writer}
{htmlspecialchars($val->nick_name)}
{$lang->homepage}{htmlspecialchars($val->homepage)}
{$lang->content}{$val->content}
ipaddress{$val->ipaddress}
{$lang->uploaded_file} + + + +
+ [{$lang->cmd_reply}] + + + [{$lang->cmd_modify}] + [{$lang->cmd_delete}] + +
+
+ + + + + + + + + + +
diff --git a/modules/board/skins/default/comment_form.html b/modules/board/skins/default/comment_form.html new file mode 100644 index 000000000..c53cb32b5 --- /dev/null +++ b/modules/board/skins/default/comment_form.html @@ -0,0 +1,78 @@ + + + + + + + + + +
+ + + + + + + + + + + + + + + +
{$lang->date}{$source_comment->regdate}
{$lang->writer}
{htmlspecialchars($source_comment->nick_name)}
{$lang->content}{$source_comment->content}
+
+ + + +
fileupload)-->enctype="multipart/form-data"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->writer}
{$lang->password}
{$lang->email_address}
{$lang->homepage}
{$comment_editor}
+ + + + + +
+
+ + + + diff --git a/modules/board/skins/default/delete_comment_form.html b/modules/board/skins/default/delete_comment_form.html new file mode 100644 index 000000000..a3ed7cf27 --- /dev/null +++ b/modules/board/skins/default/delete_comment_form.html @@ -0,0 +1,23 @@ + + + +
+ + + + + + + + + + + + +
{$lang->confirm_delete}
+ + +
+
+ + diff --git a/modules/board/skins/default/delete_form.html b/modules/board/skins/default/delete_form.html new file mode 100644 index 000000000..e0890106c --- /dev/null +++ b/modules/board/skins/default/delete_form.html @@ -0,0 +1,27 @@ + + + +
+ + + + + + + + + + + + + + + +
{$lang->confirm_delete}
{$lang->title}{$oDocument->getTitleText()}
+ + +
+ +
+ + diff --git a/modules/board/skins/default/delete_trackback_form.html b/modules/board/skins/default/delete_trackback_form.html new file mode 100644 index 000000000..4ca0aabfc --- /dev/null +++ b/modules/board/skins/default/delete_trackback_form.html @@ -0,0 +1,23 @@ + + + +
+ + + + + + + + + + + + +
{$lang->confirm_delete}
+ + +
+
+ + diff --git a/modules/board/skins/default/extra_var_form.html b/modules/board/skins/default/extra_var_form.html new file mode 100644 index 000000000..4f2f31455 --- /dev/null +++ b/modules/board/skins/default/extra_var_form.html @@ -0,0 +1,65 @@ + + + + + {@ $val->default = explode(',',$val->default) } + + + +{@ $val->column_name = "extra_vars".$key} + + +{@ $val->value = $oDocument->getExtraValue($key)} + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
  • value)&&in_array($v, $val->value))-->checked="checked"/>{$v}
  • + +
+ + + + + + + + + +
{zdate($val->value,"Y-m-d")}
+ {$lang->cmd_open_calendar} + + + +

{$val->desc}

+ diff --git a/modules/board/skins/default/extra_var_value.html b/modules/board/skins/default/extra_var_value.html new file mode 100644 index 000000000..1e09aca59 --- /dev/null +++ b/modules/board/skins/default/extra_var_value.html @@ -0,0 +1,55 @@ + + + +{@ $val->column_name = "extra_vars".$key} + + +{@ $val->value = $oDocument->getExtraValue($key)} + + + + {htmlspecialchars($val->value)} + + + + + {$val->value} + +   + + + + + + {$val->value} + +   + + + + + {htmlspecialchars($val->value[0])} + - + {htmlspecialchars($val->value[1])} + - + {htmlspecialchars($val->value[2])} + + + + {nl2br(htmlspecialchars($val->value))} + + + + + {@ $_tmp_value[] = htmlspecialchars($v)} + + {implode(",",$_tmp_value)} + + + + {htmlspecialchars($val->value)} + + + + {zdate($val->value,"Y-m-d")} + diff --git a/modules/board/skins/default/filter/delete_comment.xml b/modules/board/skins/default/filter/delete_comment.xml new file mode 100644 index 000000000..115ea00d9 --- /dev/null +++ b/modules/board/skins/default/filter/delete_comment.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/default/filter/delete_document.xml b/modules/board/skins/default/filter/delete_document.xml new file mode 100644 index 000000000..7627f5a63 --- /dev/null +++ b/modules/board/skins/default/filter/delete_document.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/board/skins/default/filter/delete_trackback.xml b/modules/board/skins/default/filter/delete_trackback.xml new file mode 100644 index 000000000..2140675f8 --- /dev/null +++ b/modules/board/skins/default/filter/delete_trackback.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/default/filter/input_password.xml b/modules/board/skins/default/filter/input_password.xml new file mode 100644 index 000000000..55cb6d8e0 --- /dev/null +++ b/modules/board/skins/default/filter/input_password.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/board/skins/default/filter/insert.xml b/modules/board/skins/default/filter/insert.xml new file mode 100644 index 000000000..5e9ed7356 --- /dev/null +++ b/modules/board/skins/default/filter/insert.xml @@ -0,0 +1,38 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/default/filter/insert_comment.xml b/modules/board/skins/default/filter/insert_comment.xml new file mode 100644 index 000000000..ba2216c8a --- /dev/null +++ b/modules/board/skins/default/filter/insert_comment.xml @@ -0,0 +1,28 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/default/filter/search.xml b/modules/board/skins/default/filter/search.xml new file mode 100644 index 000000000..6c85e1254 --- /dev/null +++ b/modules/board/skins/default/filter/search.xml @@ -0,0 +1,15 @@ + +
+ + + + + + + + + + + + +
diff --git a/modules/board/skins/default/filter/vote.xml b/modules/board/skins/default/filter/vote.xml new file mode 100644 index 000000000..0870a7551 --- /dev/null +++ b/modules/board/skins/default/filter/vote.xml @@ -0,0 +1,13 @@ + +
+ + + + + + + + + + +
diff --git a/modules/board/skins/default/footer.html b/modules/board/skins/default/footer.html new file mode 100644 index 000000000..9d5404ca8 --- /dev/null +++ b/modules/board/skins/default/footer.html @@ -0,0 +1 @@ +{$module_info->footer_text} diff --git a/modules/board/skins/default/header.html b/modules/board/skins/default/header.html new file mode 100644 index 000000000..8a349def7 --- /dev/null +++ b/modules/board/skins/default/header.html @@ -0,0 +1,46 @@ + +{$module_info->header_text} + + + +
+ + {$module_info->title}
+ + + + {nl2br($module_info->memo)} + +
+ + + +
+ + {$lang->document_count} : {number_format($total_count)}, + {$lang->page_count} : {number_format($page)} / {number_format($total_page)} + + + + rss + + + + [ + {$lang->cmd_view_member_info} | + {$lang->cmd_logout} + ] + + + [ + {$lang->cmd_signup} | + {$lang->cmd_login} + ] + + + + [{$lang->cmd_management}] + + +
+ diff --git a/modules/board/skins/default/input_password_form.html b/modules/board/skins/default/input_password_form.html new file mode 100644 index 000000000..0a26427de --- /dev/null +++ b/modules/board/skins/default/input_password_form.html @@ -0,0 +1,27 @@ + + + +
+ + + + + + + + + + + + + + + + +
{$lang->msg_input_password}
{$lang->password}
+ + +
+
+ + diff --git a/modules/board/skins/default/js/board.js b/modules/board/skins/default/js/board.js new file mode 100644 index 000000000..3725923c8 --- /dev/null +++ b/modules/board/skins/default/js/board.js @@ -0,0 +1,138 @@ +/** + * @file modules/board/js/board.js + * @author zero (zero@nzeo.com) + * @brief board 모듈의 javascript + **/ + +/* 관리자가 카트 선택시 세션에 넣음 */ +function doAddCart(mid, obj) { + var srl = obj.value; + var check_flag = obj.checked?'add':'remove'; + + var params = new Array(); + params["mid"] = mid; + params["srl"] = srl; + params["check_flag"] = check_flag; + + exec_xml("board","procBoardAdminAddCart", params, null); +} + +/* 글쓰기 작성후 */ +function completeDocumentInserted(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var category_srl = ret_obj['category_srl']; + + alert(message); + + var url = current_url.setQuery('mid',mid).setQuery('document_srl',document_srl).setQuery('act',''); + if(category_srl) url = url.setQuery('category',category_srl); + location.href = url; +} + +/* 글 삭제 */ +function completeDeleteDocument(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var page = ret_obj['page']; + + var url = "./?mid="+mid; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 검색 실행 */ +function completeSearch(fo_obj, params) { + fo_obj.submit(); +} + +/* 추천, 추천은 별도의 폼입력이 필요 없어 직접 필터 사용 */ +function doVote() { + var fo_obj = document.getElementById('fo_document_info'); + procFilter(fo_obj, vote); +} + +function completeVote(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + alert(message); + location.href = location.href; +} + +// 현재 페이지 reload +function completeReload(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + location.href = location.href; +} + +/* 댓글 글쓰기 작성후 */ +function completeInsertComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var comment_srl = ret_obj['comment_srl']; + + var url = "./?mid="+mid+"&document_srl="+document_srl; + if(comment_srl) url += "#comment_"+comment_srl; + + alert(message); + + location.href = url; +} + +/* 댓글 삭제 */ +function completeDeleteComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 트랙백 삭제 */ +function completeDeleteTrackback(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 카테고리 이동 */ +function doChangeCategory(sel_obj, url) { + var category_srl = sel_obj.options[sel_obj.selectedIndex].value; + if(!category_srl) location.href=url; + else { + location.href = current_url.setQuery('category',category_srl); + } +} + +/* 스크랩 */ +function doScrap(document_srl) { + var params = new Array(); + params["document_srl"] = document_srl; + exec_xml("member","procMemberScrapDocument", params, null); +} diff --git a/modules/board/skins/default/list.html b/modules/board/skins/default/list.html new file mode 100644 index 000000000..ece24444d --- /dev/null +++ b/modules/board/skins/default/list.html @@ -0,0 +1,127 @@ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->no} +
+ +
+
{$lang->title}{$lang->writer}{$lang->readed_count}{$lang->voted_count}{$lang->date}
{$no}{$category_list[$document->get('category_srl')]->title} + + document_srl])-->checked="checked" /> + + + + + + {$document->getTitleText($module_info->subject_cut_size)} + + + {$document->getTitleText($module_info->subject_cut_size)} + + + {$document->getTitleText($module_info->subject_cut_size)} + + + + [{$document->getCommentCount()}] + + + + [{$document->getTrackbackCount()}] + + +
{$document->getNickName()}
{$document->get('readed_count')}{$document->get('voted_count')}{$document->getRegdate("Y-m-d")}
+
+ + + + + + + +
+ +
+ + + + + + + diff --git a/modules/board/skins/default/message.html b/modules/board/skins/default/message.html new file mode 100644 index 000000000..00bf01814 --- /dev/null +++ b/modules/board/skins/default/message.html @@ -0,0 +1,11 @@ + + +
+ {$message} +
+ + + {$lang->cmd_login} + + + diff --git a/modules/board/skins/default/skin.xml b/modules/board/skins/default/skin.xml new file mode 100644 index 000000000..2c1e128c1 --- /dev/null +++ b/modules/board/skins/default/skin.xml @@ -0,0 +1,57 @@ + + + 게시판 기본 스킨 + 掲示板デフォルトスキン + 版面默认皮肤 + Basic Board Skin + + 제로 + Zero + zero + zero + board모듈의 default스킨 + 掲示板(board)モジュールのデフォルト(default)スキン + 版面模块的默认皮肤。 + default skin of board module + + + + 기본 + デフォルト + 默认 + Default + + + + + 제목 + タイトル + 标题 + Title + 게시판의 제목을 적어주세요. + 掲示板のタイトルを入力してください。 + 请输入版面标题。 + Input the title of board. + + + 게시판 설명 + 掲示板の説明 + 版面说明 + Description of board + 내용의 기본값 + 内容のデフォルト値 + 内容的基本值 + Default Content + + + 제목 글자수 + タイトルの文字数 + 标题字数 + Length of Subject + 제목 글자수를 지정할 수 있습니다. (0또는 비워주시면 자르지 않습니다) + タイトルの文字数が指定できます(「0」または空欄の場合は、文字数を制限しません)。 + 可以设置标题的字数。(0或留空为不限) + You may set length of title. (0 or blank value will not restrict the length) + + + diff --git a/modules/board/skins/default/trackback.html b/modules/board/skins/default/trackback.html new file mode 100644 index 000000000..1e00e1052 --- /dev/null +++ b/modules/board/skins/default/trackback.html @@ -0,0 +1,46 @@ + +
+ {$lang->trackback} : {$oDocument->getTrackbackCount()} +
+ + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->title}{$val->title}
{$lang->date}{zdate($val->regdate, "Y-m-d H:i:s")}
{$lang->blog_name}{$val->blog_name}
{$lang->excerpt}{nl2br($val->excerpt)}
ipaddress{$val->ipaddress}
+ [{$lang->cmd_delete}] +
+
+ + +
+ diff --git a/modules/board/skins/default/view_document.html b/modules/board/skins/default/view_document.html new file mode 100644 index 000000000..a0dd9b472 --- /dev/null +++ b/modules/board/skins/default/view_document.html @@ -0,0 +1,140 @@ + + + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {@ $tag_list = $oDocument->get('tag_list') } + + + + + + + + + + + + + + + + + + + + + +
{$lang->category}{$category_list[$oDocument->get('category_srl')]->title}
{$lang->title}{$oDocument->getTitleText()}
{$lang->date}{$oDocument->getRegdate('Y-m-d H:i:s')}
{$lang->writer}
{$oDocument->getNickName()}
{$lang->readed_count}{$oDocument->get('readed_count')}
{$lang->voted_count}{$oDocument->get('voted_count')}
{$val->name} + + + +
{$lang->content}{$oDocument->getContent()}
{$lang->document_url}{$oDocument->getPermanentUrl()}
{$lang->trackback_url}{$oDocument->getTrackbackUrl()}
{$lang->tag} + + {@ $tag = $tag_list[$i]; } + , + +
{$lang->uploaded_file} + {@ $uploaded_list = $oDocument->getUploadedFiles() } + + {$file->source_filename} ({FileHandler::filesize($file->file_size)}) ({number_format($file->download_count)}) + +
ipaddress{$oDocument->get('ipaddress')}
+ + {$lang->allow_comment} + + + + {$lang->lock_comment} + + + + {$lang->allow_trackback} + +
+
+ + + + + + + + + + + + + + + + diff --git a/modules/board/skins/default/write_form.html b/modules/board/skins/default/write_form.html new file mode 100644 index 000000000..526ed01ad --- /dev/null +++ b/modules/board/skins/default/write_form.html @@ -0,0 +1,124 @@ + + + +
fileupload)-->enctype="multipart/form-data"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->category} + +
{$lang->writer}
{$lang->password}
{$lang->email_address}
{$lang->homepage}
{$lang->title}
+ + isNotice())-->checked="checked" id="is_notice" /> + + + + isSecret())-->checked="checked" id="is_secret" /> + + + allowComment())-->checked="checked" id="allow_comment" /> + + + isLocked())-->checked="checked" id="lock_comment" /> + + + allowTrackback())-->checked="checked" id="allow_trackback" /> + + + + useNotify())-->checked="checked" id="notify_message" /> + + +
{$editor}
{$lang->cmd_send_trackback} + + +
{$lang->tag} +
+ {$lang->about_tag} +
+ {$val->name} + * + + + +
+ + + +
+ +
+ + diff --git a/modules/board/skins/xe_gallery/comment.html b/modules/board/skins/xe_gallery/comment.html new file mode 100644 index 000000000..eba62e23d --- /dev/null +++ b/modules/board/skins/xe_gallery/comment.html @@ -0,0 +1,56 @@ + + + + + + + + diff --git a/modules/board/skins/xe_gallery/comment_form.html b/modules/board/skins/xe_gallery/comment_form.html new file mode 100644 index 000000000..f03e13bf3 --- /dev/null +++ b/modules/board/skins/xe_gallery/comment_form.html @@ -0,0 +1,72 @@ + + + + + + + + + +
    +
  • +
    {htmlspecialchars($source_comment->nick_name)}
    +
    + {zdate($source_comment->regdate, "Y.m.d H:i")} + + ({$source_comment->ipaddress}) + +
    + +
    + {$source_comment->content} +
    +
  • +
+ + + +
+ +
fileupload)-->enctype="multipart/form-data" class="boardEditor" id="fo_comment_write" > +
+ + + + + + + +
+ + + + + + + + + + + +
+ + +
class="borderTop">{$comment_editor}
+ +
+ +
+ + + + + +
+ + +
+
+ + + + diff --git a/modules/board/skins/xe_gallery/css/common.css b/modules/board/skins/xe_gallery/css/common.css new file mode 100644 index 000000000..b19352dad --- /dev/null +++ b/modules/board/skins/xe_gallery/css/common.css @@ -0,0 +1,259 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ +.gap1 { margin-top:.8em; } +.commentButton { margin:.8em 0 .8em 0; } + +/* pathNavigation */ +.pathNavigation { background:url(../images/common/bullet_3x3_d8d8d8.gif) no-repeat left .4em; padding:0 0 0 .5em; color:#999999; margin:0 0 1.5em 0;} +.pathNavigation * { font-size:.9em;} +.pathNavigation a { color:#999999;} +.pathNavigation strong { color:#666666;} + +/* boardComment */ +.boardComment { color:#AEAEAE; position:relative; border:1px solid #DDDDDD; overflow:hidden;padding:.8em; margin-top:.4em;} +.boardComment a { color:#f38d2a; text-decoration:none; border-bottom:1px dotted #f38d2a;} + +/* boardInformation */ +.boardInformation { width:100%; clear:both; margin:1em 0 .5em 0; overflow:hidden; color:#666666;} + +.accountNavigation { float:right; overflow:hidden;} +.accountNavigation li { float:left; padding:0 .5em 0 .6em; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left .4em; list-style:none;} +.accountNavigation li a { font-size:11px; white-space:nowrap; color:#666666; text-decoration:none;} +.accountNavigation li.rss { background:none; padding-top:.4em;} +.accountNavigation li.skin_info { padding-top:3px;} +.accountNavigation li.join { background:none; padding-top:.4em;} +.accountNavigation li.myInfo { padding-top:.4em; background:none;} +.accountNavigation li.admin { padding-top:.4em;} +.accountNavigation li.admin a { display:block; background:url(../images/common/iconAdmin.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.setup { padding-top:.4em;} +.accountNavigation li.setup a { display:block; background:url(../images/common/iconSetup.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.loginAndLogout { background:none; padding-left:0;} + +/* boardList */ +.boardList { width:100%; position:relative; border:1px solid #e0e1db; table-layout:fixed;} +.boardList tr.notice { background:#f8f8f8;} +.boardList tr.notice .num { font-size:.9em; font-weight:bold;} +.boardList tr.bg1 { background:#ffffff} +.boardList tr.bg2 { background:#fbfbfb;} +.boardList th a { color:#3e3f3e; text-decoration:none; } +.boardList th.num { background-position:-3px bottom; border-left:1px solid #ffffff; } +.boardList th.title { text-align:center; } +.boardList th.category { text-align:center; } +.boardList th.title select { vertical-align:middle; margin-left:.5em; } +.boardList th.reading { white-space:nowrap;} +.boardList th.recommend { white-space:nowrap;} +.boardList th.date { border-right:1px solid #ffffff;} +.boardList th .sort { padding:0 .2em; vertical-align:middle;} +.boardList td { border-top:1px solid #eff0ed; padding:.5em;} +.boardList td.num { font:.8em tahoma; color:#999999; padding:.5em 1em; text-align:center;} +.boardList tr.notice td.num { padding:.5em; white-space:nowrap;} +.boardList tr.notice td.notice { font-size:.9em; color:#999999; font-weight:bold; text-align:center;} +.boardList td.thumb { padding:.5em 0 .5em .5em; width:145px; table-layout:fixed; white-space:nowrap;} +.boardList td.thumb * { vertical-align:middle;} +.boardList td.title {padding-left:1em; } +.boardList td.title strong.category { font-size:1em; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat right 3px; padding-right:.5em; margin-right:.5em;} +.boardList td.title.bold { font-size:1.2em; font-weight:bold;} +.boardList td.title.bold a { position:relative; top:.3em;} +.boardList td.title * { vertical-align:middle;} +.boardList td.title, +.boardList td.title a { color:#444444; text-decoration:none;} +.boardList td.title a:visited { color:#777777;} +.boardList td.author { color:#333333; font-size:.95em; padding-left:1em;} +.boardList td.author a { font-size:1em; color:#333333;} +.boardList td.reading { font:.8em Tahoma; color:#999999; text-align:center;} +.boardList td.date { font:.8em Tahoma; color:#999999; text-align:center; white-space:nowrap;} +.boardList td.summary { border-top:none; vertical-align:top; color:#666666; line-height:1.25em;} +.boardList td.summary a { color:#666666; text-decoration:none; line-height:inherit;} +.boardList td.summary a:visited { color:#999999;} +.boardList td input { _margin:-3px;} +.boardList td .replyAndTrackback img.trackback { margin-bottom:-.1em;} +.boardList td .replyAndTrackback strong { font:bold 1em Tahoma;} + +.boardList td .thumbnailSmall { margin:0 .3em 0 .3em;} +.boardList td .thumbnailSmall img { border:1px solid #bcbdb6;} +.boardList td .thumbnailMedium { margin:0 .3em 0 .3em;} +.boardList td .thumbnailMedium img { border:1px solid #e0e1db; padding:3px;} + +.boardList.thumbnail { margin-top:-1px; border-bottom:none;} +.boardList.thumbnail td { border-top:none; border-bottom:1px solid #eff0ed; padding:1.5em 0 0 1.5em; overflow:hidden;} +.boardList.thumbnail div.cell { float:left; width:167px; overflow:hidden; margin:0 1.5em 0 0; padding-bottom:1.5em;} +.boardList.thumbnail div.cell img.thumb { padding:2px; border:1px solid #e0e1db; display:block; margin-bottom:1em;} +.boardList.thumbnail div.title { color:#444444; margin-bottom:.2em; padding-left:3px;} +.boardList.thumbnail div.title a { color:#444444; text-decoration:none;} +.boardList.thumbnail div.nameAndDate { font-size:.9em; color:#999999; margin-bottom:.2em; padding-left:3px;} +.boardList.thumbnail div.nameAndDate a { color:#999999;} +.boardList.thumbnail div.nameAndDate .date { font:.8em Tahoma; color:#999999;} +.boardList.thumbnail div.readAndRecommend { font-size:.9em; color:#666666; padding-left:3px;} +.boardList.thumbnail div.readAndRecommend .num { font:.8em Tahoma;} +.boardList.thumbnail div.readAndRecommend .vr { color:#dddddd;} +.boardList.thumbnail div.readAndRecommend strong.num { font:bold .8em Tahoma; color:#ff6600;} + +/* pageNavigation */ +.pageNavigation { display:block; padding:1.5em 0 2em 0; text-align:center; font:bold 11px Tahoma; } +.pageNavigation a { position:relative; margin-left:-4px; font:bold 1em Tahoma; color:#666666; display:inline-block; padding:1px 7px 2px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } +.pageNavigation a:hover { background:#F7F7F7; text-decoration:none; } +.pageNavigation a:visited { color:#999999;} +.pageNavigation a.goToFirst, +.pageNavigation a.goToLast { border:none; border-right:1px solid #ffffff; border-left:1px solid #ffffff; z-index:99; vertical-align:top; padding:0px 7px 4px 6px;} +.pageNavigation a.goToFirst img, +.pageNavigation a.goToLast img { display:inline-block; padding:2px 0; position:relative; top:2px; _top:1px;} + +/* extraVars list */ +.extraVarsList { width:100%; border:1px solid #e0e1db; clear:both; margin-bottom:1em;} +.extraVarsList tr.notice { background:#f8f8f8;} +.extraVarsList tr.notice .num { font-size:.9em; font-weight:bold;} +.extraVarsList tr.bg1 { background:#ffffff} +.extraVarsList tr.bg2 { background:#fbfbfb;} +.extraVarsList th { color:#3e3f3e; font-weight:bold; padding:.8em .5em .5em .5em; border-bottom:1px solid #eff0ed; border-right:1px solid #eff0ed;} +.extraVarsList td { border-bottom:1px solid #eff0ed; padding:.5em .5em .5em 1em;} + +/* boardSearch */ +.boardSearch { text-align:center; clear:both; width:100%;} +.boardSearch fieldset { border:none; display:inline; overflow:visible; position:relative; white-space:nowrap;} +.boardSearch fieldset legend { overflow:hidden; width:1px; height:1px; font-size:.001em;} +.boardSearch * { vertical-align:middle;} +.boardSearch select { float:left;_margin-top:3px; height:20px;} +.boardSearch input { float:left; margin:0 .3em; _margin-top:3px;background:#fbfbfb;} +*:first-child+html .boardSearch select { margin-top:3px; height:21px;} +*:first-child+html .boardSearch input { margin-top:3px; } +.searchButton ul { overflow:hidden;} +.searchButton li { float:left; margin-right:.3em; list-style:none;} + +/* boardRead */ +.boardRead { padding:0; margin:0; border:1px solid #e0e1db;} +.boardRead .originalContent { padding:2em 1.2em 2em 1.2em;} +.boardRead .readHeader { padding:0 0 .5em 0; margin-bottom:1em; border-bottom:1px solid #eff0ed; overflow:hidden;} + +.boardRead .titleAndCategory { float:left;} +.boardRead .titleAndCategory h4 { font-size:1.4em; display:inline; padding-left:.2em;} +.boardRead .titleAndCategory .vr { font-size:.9em; margin:0 .3em; color:#c5c7c0;} +.boardRead .titleAndCategory .cotegory { font-size:.9em; color:#999999; white-space:nowrap;} + +.boardRead .dateAndModify { float:right; white-space:nowrap; font-size:.8em; color:#999999; position:relative;} +.boardRead .dateAndModify strong { font-size:1em; font-family:Tahoma;} + +.boardRead ul.uri { overflow:hidden; margin:0 0 2em .3em; float:right; clear:left;} +.boardRead ul.uri li { font-size:8pt; color:#c5c7c0; } + +.boardRead .userInfo { float:left; white-space:nowrap;} +.boardRead .userInfo .author { padding:0 .3em 0 0; color:#3074a5; margin-right:.3em;} +.boardRead .userInfo .ipaddress { font-size:.9em; font-family:Tahoma; color:#888888; margin-right:.5em; } + +.boardRead .contentBody { width:100%; overflow:hidden; } +.boardRead .readBody { padding:0 .3em; color:#555555; overflow:hidden; margin-bottom:2em; clear:both; } +.boardRead .readBody p { margin:1em 0; line-height:1.5em;} +.boardRead .readBody .alignLeft { float:left; margin:0 1em 1em 0; } +.boardRead .readBody .alignRight { float:right; margin:0 0 1em 1em; } +.boardRead .readBody .valignCenter { vertical-align:middle;} +.boardRead .readBody .clearBoth { display:block; margin:0 0 1em 0;} +.boardRead .readFooter { padding:0 .3em;} +.boardRead .readFooter .tag { margin-bottom:1em;} +.boardRead .readFooter .tag h5 { display:inline; font-size:1em; margin-right:.5em;} +.boardRead .readFooter .tag ul, +.boardRead .readFooter .tag li { display:inline;} +.boardRead .readFooter .tag a { color:#444444;} +.boardRead .readFooter .tag .tagIcon { vertical-align:middle;} +.boardRead .readFooter .fileAttached { _width:99%; border:1px solid #eaeae7; overflow:hidden; background:#fbfbfb;} +.boardRead .readFooter .fileAttached h5 { font-weight:normal; color:#999999; float:left; font-size:1em; margin:.5em .5em 0 .5em; line-height:1.5em;} +.boardRead .readFooter .fileAttached ul { float:left; margin-top:.5em; padding-bottom:1em; } +.boardRead .readFooter .fileAttached li { display:inline; margin-right:.75em; line-height:1.5em;} +.boardRead .readFooter .fileAttached li a { text-decoration:none; color:#777777;} +.boardRead .readFooter .fileAttached li a:visited { color:#777777;} + +.boardRead .replyAndTrackbackBox { position:relative; _width:100%;} +.boardRead .replyAndTrackback li { margin-top:10px; _margin-top:8px; margin-left:1em; padding-left:1.4em; float:left; list-style:none;} + +.boardRead .replyAndTrackback li.reply { background:url(../images/common/iconReply.gif) no-repeat left top;} +.boardRead .replyAndTrackback li.reply a { position:relative; top:-.3em; _top:-.6em;} + +.boardRead .replyAndTrackback li.trackback { background:url(../images/common/iconTrackback.gif) no-repeat left top;} +.boardRead .replyAndTrackback li.trackback a { position:relative; top:-.3em; _top:0em;} + +.boardRead .replyAndTrackback a { color:#333333; white-space:nowrap; text-decoration:none;} +.boardRead .replyAndTrackback a#toggleReply { background:url(../images/common/buttonToggleReply.gif) no-repeat right top;} +.boardRead .replyAndTrackback a#toggleTrackback { background:url(../images/common/buttonToggleReply.gif) no-repeat right -13px;} + +.boardRead .replyAndTrackback .listButton { position:relative; right: 10px; top:-7px; _top:-6px; float:right;} + +#trackbacks { padding:.6em .6em; color:#666666; border:1px solid #e0e1db;;margin-top:.5em;} +#trackbacks li { padding:.6em .8em .6em .6em; line-height:1.25em; border-bottom:1px dotted #EEEEEE; list-style:none;} +#trackbacks p { display:inline; margin-bottom:1em;} +#trackbacks a { color:#666666; text-decoration:none;} +#trackbacks div { clear:both; } +#trackbacks address { display:block; padding:0 .3em 0 0; } +#trackbacks address a { font-size:.9em; color:#3074a5; margin-right:.3em; float:left;} +#trackbacks address .date { font:.8em Tahoma; color:#cccccc; float:right;} + +#reply { padding:.6em .6em; color:#666666; border:1px solid #e0e1db; margin-top:.5em;} +#reply li { padding:.6em .8em .6em .6em; line-height:1.25em; clear:both; border-bottom:1px dotted #EEEEEE; list-style:none;} +#reply p { display:inline; margin-bottom:1em;} +#reply .author { float:left; padding:0 .3em 0 0; font-size:.9em; color:#3074a5; margin:0 .3em .5em 0;} +#reply .author a { font-size:.9em; color:#3074a5; margin-right:.3em;} +#reply .date { float:right; font:.8em Tahoma; color:#cccccc; margin:.3em 0 .5em 0;} + +#reply .replyOption { float:right; white-space:nowrap; margin-left:.2em;} +#reply .replyOption img { vertical-align:middle;} + +#reply .replyContent { clear:left; } +#reply .reply { background-color:#FAFAFA;} +#reply .replyIndent { background:url(../images/common/iconReplyArrow.gif) no-repeat .0em .3em; padding-left:1.3em;} + +#reply li .fileAttached { _width:99%; border:1px solid #eaeae7; overflow:hidden; background:#fbfbfb; margin-top:.3em; list-style:none;} +#reply li .fileAttached ul { float:left; padding:.3em 1em .2em 0; margin-left:.5em; _margin-left:.25em;} +#reply li .fileAttached li a { font-size:.9em; white-space:nowrap; position:relative; color:#444444; } +#reply li .fileAttached li a:visited { color:#777777;} + +/* boardEditor */ +.boardEditor { padding:.5em 0 1em 0; width:100%; overflow:hidden;} +.boardEditor.reply { padding:.5em 1em 1em 1em; width:auto; overflow:hidden;} +.boardEditor legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em;} +.boardEditor fieldset { _width:100%; border:1px solid #eaeae7; border-top:none;} +.boardEditor .userNameAndPw { position:relative; background:#fbfbfb; border-top:1px solid #eaeae7; border-bottom:1px solid #e1e1e1; padding:.5em 1em; white-space:nowrap;} +.boardEditor .userNameAndPw * { vertical-align:middle;} +.boardEditor .userNameAndPw label { margin-right:.2em; color:#666760;} +.boardEditor .userNameAndPw input { color:#aaaaaa;} +.boardEditor .userNameAndPw .userName { width:6em; margin-right:.8em;} +.boardEditor .userNameAndPw .userPw { width:5em;} +.boardEditor .userNameAndPw .emailAddress { width:6em;} +.boardEditor .userNameAndPw .homePage { width:6em;} +.boardEditor .userNameAndPw .checkSecret { position:absolute; right:2em; top:.7em;} +.boardEditor .borderTop { border-top:1px solid #eaeae7; } + +/* boardWrite */ +.boardWrite { width:100%; position:relative;} +.boardWrite .userNameAndPw { margin-bottom:-1px;} +.boardWrite .boardEditor fieldset { width:auto; position:relative;} +.boardWrite div.title { border-bottom:1px solid #eff0ed; border-top:1px solid #eff0ed; padding:.5em 0; white-space:nowrap;} +.boardWrite div.title label.title { display:block; float:left; font-weight:bold; padding:.4em 0 0 1.5em; width:8em; white-space:nowrap;} +.boardWrite div.title input#title { width:60%;} +.boardWrite .option { border-bottom:1px solid #e1e1e1; padding:.5em 0; overflow:hidden; width:100%;} +.boardWrite .option dt { display:block; float:left; font-weight:bold; padding:.3em 0 0 1.5em; width:8em; white-space:nowrap;} +.boardWrite .option dd { float:left; margin-right:1em; padding-top:.2em; _padding-top:.1em;} +.boardWrite .option dd * { vertical-align:middle;} +.boardWrite .inputTypeText { background:#fbfbfb;} +.boardWrite .trackbackURI { clear:both; border-top:1px solid #eff0ed; padding:4px 0 .8em 0;} +.boardWrite .trackbackURI label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .trackbackURI .inputTypeText { width:50%;} +.boardWrite .tag { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;} +.boardWrite .tag label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .tag .inputTypeText { width:50%;} +.boardWrite .tag .help { vertical-align:middle;} +.boardWrite .tag .info { padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;} +.boardWrite .extra_vars { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;} +.boardWrite .extra_vars label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .extra_vars .info { clear:both; padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;} +.boardWrite .extra_vars ul li { float:left; margin-right:1em; } + +.smallBox { border:1px solid #e0e1db; margin:5em auto 1em auto;} +.smallBox.w268 { width:268px;} +.smallBox .header { position:relative; _width:100%; background:#ffffff url(../images/normal/bgH3.gif) no-repeat left bottom; overflow:hidden;} +.smallBox .header h3 { clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border-bottom:3px solid #fe3614; } +.smallBox .complex { padding:1.5em 2em 2em 2em;} +.smallBox .inputPassword { position:relative; border:none; padding:2em 2em 1.5em 2em;} +.smallBox .inputPassword .inputTypeText { float:left; margin-right:.5em; width:8em;} +.smallBox .inputPassword legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} + +*:first-child+html .buttonTypeGo { position:relative; top:3px; } diff --git a/modules/board/skins/xe_gallery/css/cyan.css b/modules/board/skins/xe_gallery/css/cyan.css new file mode 100644 index 000000000..d1f8116f8 --- /dev/null +++ b/modules/board/skins/xe_gallery/css/cyan.css @@ -0,0 +1,32 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; border-top:1px solid #d1d9db; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} +.boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d1d9db; border-bottom:3px solid #2895c0; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.accountNavigation li.join a { display:block; background:url(../images/cyan/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/cyan/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} + +.articleNum { float:left; background:url(../images/cyan/iconArticle.gif) no-repeat left top; padding:0 0 0 1.5em; margin:.5em 0 0 10px;} +#reply li .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/cyan/iconFile.gif) no-repeat left;} +.articleNum strong { font:bold 11px Tahoma; color:#2895c0;} + +.boardList th { color:#3e3f3e; font-weight:normal; border-bottom:1px solid #ffffff; padding:.5em .5em .3em .5em; background:#ffffff url(../images/cyan/lineBoardListTh.gif) no-repeat left bottom;white-space:nowrap; height:33px;} +.boardList td.recommend { font:bold .8em Tahoma; color:#2895c0; text-align:center;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#2895c0; cursor:default; position:relative; top:-.2em;} +.boardList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#2895c0; cursor:default; position:relative; top:.3em;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; _position:relative; _top:3px; background:url(../images/cyan/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} + +.boardRead .replyAndTrackback { overflow:hidden; _width:100%; height:30px; background:url(../images/cyan/bgBoardListTh.gif) repeat-x left 0px; border-top:1px solid #e0e1db; border-bottom:2px solid #666760;} +.boardRead .replyAndTrackback a strong { color:#2895c0;} +.boardRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; background:url(../images/cyan/iconFile.gif) no-repeat left top;} + + + +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 11px Tahoma; color:#2895c0; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + diff --git a/modules/board/skins/xe_gallery/css/green.css b/modules/board/skins/xe_gallery/css/green.css new file mode 100644 index 000000000..3e54c636d --- /dev/null +++ b/modules/board/skins/xe_gallery/css/green.css @@ -0,0 +1,31 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +.articleNum { float:left; background:url(../images/green/iconArticle.gif) no-repeat left top; padding:0 0 0 1.5em; margin:.5em 0 0 10px;} +#reply li .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/green/iconFile.gif) no-repeat left;} +.boardRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; background:url(../images/green/iconFile.gif) no-repeat left top;} +.accountNavigation li.join a { display:block; background:url(../images/green/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/green/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} + +.boardList th { color:#3e3f3e; font-weight:normal; border-bottom:1px solid #ffffff; padding:.5em .5em .3em .5em; background:#ffffff url(../images/green/lineBoardListTh.gif) no-repeat left bottom;white-space:nowrap; height:33px;} + +.boardList td.recommend { font:bold .8em Tahoma; color:#38b549; text-align:center;} + +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 11px Tahoma; color:#38b549; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#38b549; cursor:default; position:relative; top:-.2em;} +.boardList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#ff6600; cursor:default; position:relative; top:.3em;} + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; border-top:1px solid #d1d9db; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} +.boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d0dbd1; border-bottom:3px solid #38b549; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.articleNum strong { font:bold 11px Tahoma; color:#ff6600;} + +.boardRead .replyAndTrackback { overflow:hidden; _width:100%; height:30px; background:url(../images/green/bgBoardListTh.gif) repeat-x left 0px; border-top:1px solid #e0e1db; border-bottom:2px solid #666760;} +.boardRead .replyAndTrackback a strong { color:#38b549;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; _position:relative; _top:3px; background:url(../images/green/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} diff --git a/modules/board/skins/xe_gallery/css/purple.css b/modules/board/skins/xe_gallery/css/purple.css new file mode 100644 index 000000000..fb7fe1fd0 --- /dev/null +++ b/modules/board/skins/xe_gallery/css/purple.css @@ -0,0 +1,31 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +.articleNum { float:left; background:url(../images/purple/iconArticle.gif) no-repeat left top; padding:0 0 0 1.5em; margin:.5em 0 0 10px;} +#reply li .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/purple/iconFile.gif) no-repeat left;} +.boardRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; background:url(../images/purple/iconFile.gif) no-repeat left top;} +.accountNavigation li.join a { display:block; background:url(../images/purple/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/purple/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} + +.boardList th { color:#3e3f3e; font-weight:normal; border-bottom:1px solid #ffffff; padding:.5em .5em .3em .5em; background:#ffffff url(../images/purple/lineBoardListTh.gif) no-repeat left bottom;white-space:nowrap;height:33px;} + +.boardList td.recommend { font:bold .8em Tahoma; color:#b1ae00; text-align:center;} + +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 11px Tahoma; color:#b1ae00; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#b1ae00; cursor:default; position:relative; top:-.2em;} +.boardList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#b1ae00; cursor:default; position:relative; top:.3em;} + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; border-top:1px solid #d1d9db; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} +.boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d1d9db; border-bottom:3px solid #ac19a9; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.articleNum strong { font:bold 11px Tahoma; color:#b1ae00;} + +.boardRead .replyAndTrackback { overflow:hidden; _width:100%; height:30px; background:url(../images/purple/bgBoardListTh.gif) repeat-x left 0px; border-top:1px solid #e0e1db; border-bottom:2px solid #666760;} +.boardRead .replyAndTrackback a strong { color:#b1ae00;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; _position:relative; _top:3px; background:url(../images/purple/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} diff --git a/modules/board/skins/xe_gallery/css/red.css b/modules/board/skins/xe_gallery/css/red.css new file mode 100644 index 000000000..859aa0cd8 --- /dev/null +++ b/modules/board/skins/xe_gallery/css/red.css @@ -0,0 +1,31 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +.articleNum { float:left; background:url(../images/red/iconArticle.gif) no-repeat left top; padding:0 0 0 1.5em; margin:.5em 0 0 10px;} +#reply li .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/red/iconFile.gif) no-repeat left;} +.boardRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; background:url(../images/red/iconFile.gif) no-repeat left top;} +.accountNavigation li.join a { display:block; background:url(../images/red/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/red/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} + +.boardList th { color:#3e3f3e; font-weight:normal; border-bottom:1px solid #ffffff; padding:.5em .5em .3em .5em; background:#ffffff url(../images/red/lineBoardListTh.gif) no-repeat left bottom; white-space:nowrap; height:33px;} + +.boardList td.recommend { font:bold .8em Tahoma; color:#ff6600; text-align:center;} + +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 11px Tahoma; color:#ff6600; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#ff6600; cursor:default; position:relative; top:-.2em;} +.boardList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#ff6600; cursor:default; position:relative; top:.3em;} + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; border-top:1px solid #d1d9db; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} +.boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d1d9db; border-bottom:3px solid #ed135a; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.articleNum strong { font:bold 11px Tahoma; color:#ff6600;} + +.boardRead .replyAndTrackback { overflow:hidden; _width:100%; height:30px; background:url(../images/red/bgBoardListTh.gif) repeat-x left 0px; border-top:1px solid #e0e1db; border-bottom:2px solid #666760;} +.boardRead .replyAndTrackback a strong { color:#ff6600;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; _position:relative; _top:3px; background:url(../images/red/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} diff --git a/modules/board/skins/xe_gallery/css/white.css b/modules/board/skins/xe_gallery/css/white.css new file mode 100644 index 000000000..cba778ec9 --- /dev/null +++ b/modules/board/skins/xe_gallery/css/white.css @@ -0,0 +1,30 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +.articleNum { float:left; background:url(../images/white/iconArticle.gif) no-repeat left top; padding:0 0 0 1.5em; margin:.5em 0 0 10px;} +#reply li .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/white/iconFile.gif) no-repeat left;} +.boardRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; background:url(../images/white/iconFile.gif) no-repeat left top;} +.accountNavigation li.join a { display:block; background:url(../images/white/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/white/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.boardList th { color:#3e3f3e; font-weight:normal; border-bottom:1px solid #ffffff; padding:.5em .5em .3em .5em; background:#ffffff url(../images/white/lineBoardListTh.gif) no-repeat left bottom;white-space:nowrap; height:33px;} + +.boardList td.recommend { font:bold .8em Tahoma; color:#ff6600; text-align:center;} + +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 11px Tahoma; color:#ff6600; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#ff6600; position:relative; top:-.2em;} +.boardList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#ff6600; position:relative; top:.3em;} + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; border:1px solid #e1e1dd; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) repeat-x left bottom; overflow:hidden;} +.boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-bottom:3px solid #fe3614; background:#ffffff url(../images/common/lineH3.gif) no-repeat right bottom;} + +.articleNum strong { font:bold 11px Tahoma; color:#ff6600;} + +.boardRead .replyAndTrackback { overflow:hidden; height:30px; background:url(../images/white/bgBoardListTh.gif) repeat-x left 0px; border-top:1px solid #e0e1db; border-bottom:2px solid #666760;} +.boardRead .replyAndTrackback a strong { color:#ff6600;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; _position:relative; _top:3px; background:url(../images/white/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} diff --git a/modules/board/skins/xe_gallery/delete_comment_form.html b/modules/board/skins/xe_gallery/delete_comment_form.html new file mode 100644 index 000000000..984c3ac8e --- /dev/null +++ b/modules/board/skins/xe_gallery/delete_comment_form.html @@ -0,0 +1,24 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + + +
+
+ + diff --git a/modules/board/skins/xe_gallery/delete_form.html b/modules/board/skins/xe_gallery/delete_form.html new file mode 100644 index 000000000..1ca638c93 --- /dev/null +++ b/modules/board/skins/xe_gallery/delete_form.html @@ -0,0 +1,23 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + +
+
+ + diff --git a/modules/board/skins/xe_gallery/delete_trackback_form.html b/modules/board/skins/xe_gallery/delete_trackback_form.html new file mode 100644 index 000000000..f907b6793 --- /dev/null +++ b/modules/board/skins/xe_gallery/delete_trackback_form.html @@ -0,0 +1,25 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + + +
+
+ + + diff --git a/modules/board/skins/xe_gallery/extra_var_form.html b/modules/board/skins/xe_gallery/extra_var_form.html new file mode 100644 index 000000000..564cec9d9 --- /dev/null +++ b/modules/board/skins/xe_gallery/extra_var_form.html @@ -0,0 +1,65 @@ + + + + + {@ $val->default = explode(',',$val->default) } + + + +{@ $val->column_name = "extra_vars".$key} + + +{@ $val->value = $oDocument->getExtraValue($key)} + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
  • value)&&in_array($v, $val->value))-->checked="checked"/> {$v}
  • + +
+ + + + + + + + + +
{zdate($val->value,"Y-m-d")}
+ {$lang->cmd_open_calendar} + + + +

{$val->desc}

+ diff --git a/modules/board/skins/xe_gallery/extra_var_value.html b/modules/board/skins/xe_gallery/extra_var_value.html new file mode 100644 index 000000000..0d5b21657 --- /dev/null +++ b/modules/board/skins/xe_gallery/extra_var_value.html @@ -0,0 +1,57 @@ + + + +{@ $val->column_name = "extra_vars".$key} + + +{@ $val->value = $oDocument->getExtraValue($key)} + + + + {htmlspecialchars($val->value)} + + + + + {$val->value} + +   + + + + + + {$val->value} + +   + + + + + {htmlspecialchars($val->value[0])} + - + {htmlspecialchars($val->value[1])} + - + {htmlspecialchars($val->value[2])} + + + + {nl2br(htmlspecialchars($val->value))} + + + + + {@ $_tmp_value[] = htmlspecialchars($v)} + + {implode(",",$_tmp_value)} + + + + {htmlspecialchars($val->value)} + + + + {zdate($val->value,"Y-m-d")} + + +  diff --git a/modules/board/skins/xe_gallery/filter/delete_comment.xml b/modules/board/skins/xe_gallery/filter/delete_comment.xml new file mode 100644 index 000000000..115ea00d9 --- /dev/null +++ b/modules/board/skins/xe_gallery/filter/delete_comment.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_gallery/filter/delete_document.xml b/modules/board/skins/xe_gallery/filter/delete_document.xml new file mode 100644 index 000000000..7627f5a63 --- /dev/null +++ b/modules/board/skins/xe_gallery/filter/delete_document.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_gallery/filter/delete_trackback.xml b/modules/board/skins/xe_gallery/filter/delete_trackback.xml new file mode 100644 index 000000000..2140675f8 --- /dev/null +++ b/modules/board/skins/xe_gallery/filter/delete_trackback.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_gallery/filter/input_password.xml b/modules/board/skins/xe_gallery/filter/input_password.xml new file mode 100644 index 000000000..55cb6d8e0 --- /dev/null +++ b/modules/board/skins/xe_gallery/filter/input_password.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_gallery/filter/insert.xml b/modules/board/skins/xe_gallery/filter/insert.xml new file mode 100644 index 000000000..85d1ed4ce --- /dev/null +++ b/modules/board/skins/xe_gallery/filter/insert.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_gallery/filter/insert_comment.xml b/modules/board/skins/xe_gallery/filter/insert_comment.xml new file mode 100644 index 000000000..ba2216c8a --- /dev/null +++ b/modules/board/skins/xe_gallery/filter/insert_comment.xml @@ -0,0 +1,28 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_gallery/filter/search.xml b/modules/board/skins/xe_gallery/filter/search.xml new file mode 100644 index 000000000..6c85e1254 --- /dev/null +++ b/modules/board/skins/xe_gallery/filter/search.xml @@ -0,0 +1,15 @@ + +
+ + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_gallery/filter/vote.xml b/modules/board/skins/xe_gallery/filter/vote.xml new file mode 100644 index 000000000..0870a7551 --- /dev/null +++ b/modules/board/skins/xe_gallery/filter/vote.xml @@ -0,0 +1,13 @@ + +
+ + + + + + + + + + +
diff --git a/modules/board/skins/xe_gallery/footer.html b/modules/board/skins/xe_gallery/footer.html new file mode 100644 index 000000000..c6171637a --- /dev/null +++ b/modules/board/skins/xe_gallery/footer.html @@ -0,0 +1,2 @@ + +{$module_info->footer_text} diff --git a/modules/board/skins/xe_gallery/header.html b/modules/board/skins/xe_gallery/header.html new file mode 100644 index 000000000..25fda4122 --- /dev/null +++ b/modules/board/skins/xe_gallery/header.html @@ -0,0 +1,83 @@ + + + + + + {@$module_info->colorset = "white"} + + + + + + + + + + + + +{$module_info->header_text} + + + +
+

{$module_info->title} - {$module_info->sub_title}

+
+ + + + +
{$module_info->comment}
+ + + +
+ + + + {$lang->document_count} {number_format($total_count)} + + + + +
diff --git a/modules/board/skins/xe_gallery/images/blank.gif b/modules/board/skins/xe_gallery/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/blank.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/bgBoardEditorOption.gif b/modules/board/skins/xe_gallery/images/common/bgBoardEditorOption.gif new file mode 100644 index 000000000..559588af6 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/bgBoardEditorOption.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/bgEditorFileList.gif b/modules/board/skins/xe_gallery/images/common/bgEditorFileList.gif new file mode 100644 index 000000000..e5050341c Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/bgEditorFileList.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/bgH3.gif b/modules/board/skins/xe_gallery/images/common/bgH3.gif new file mode 100644 index 000000000..0d07bb456 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/bgH3.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/bottomGotoFirst.gif b/modules/board/skins/xe_gallery/images/common/bottomGotoFirst.gif new file mode 100644 index 000000000..e0297fecb Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/bottomGotoFirst.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/bottomGotoLast.gif b/modules/board/skins/xe_gallery/images/common/bottomGotoLast.gif new file mode 100644 index 000000000..0a7141d0d Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/bottomGotoLast.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/bullet_3x3_d8d8d8.gif b/modules/board/skins/xe_gallery/images/common/bullet_3x3_d8d8d8.gif new file mode 100644 index 000000000..c1f245227 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/bullet_3x3_d8d8d8.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/buttonAscending.gif b/modules/board/skins/xe_gallery/images/common/buttonAscending.gif new file mode 100644 index 000000000..b405cc323 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/buttonAscending.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/buttonClose.gif b/modules/board/skins/xe_gallery/images/common/buttonClose.gif new file mode 100644 index 000000000..12cd8aaa9 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/buttonClose.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/buttonDeleteX.gif b/modules/board/skins/xe_gallery/images/common/buttonDeleteX.gif new file mode 100644 index 000000000..c066e49be Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/buttonDeleteX.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/buttonDescending.gif b/modules/board/skins/xe_gallery/images/common/buttonDescending.gif new file mode 100644 index 000000000..2dc5575ff Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/buttonDescending.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/buttonHelp.gif b/modules/board/skins/xe_gallery/images/common/buttonHelp.gif new file mode 100644 index 000000000..ca7a23a9f Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/buttonHelp.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/buttonTextAreaDrag.gif b/modules/board/skins/xe_gallery/images/common/buttonTextAreaDrag.gif new file mode 100644 index 000000000..148e9ee10 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/buttonTextAreaDrag.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/buttonToggleReply.gif b/modules/board/skins/xe_gallery/images/common/buttonToggleReply.gif new file mode 100644 index 000000000..ba3609980 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/buttonToggleReply.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/buttonTypeInput24.gif b/modules/board/skins/xe_gallery/images/common/buttonTypeInput24.gif new file mode 100644 index 000000000..0dcfc0e3d Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/buttonTypeInput24.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/iconAdmin.gif b/modules/board/skins/xe_gallery/images/common/iconAdmin.gif new file mode 100644 index 000000000..4a581a524 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/iconAdmin.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/iconArrowD8.gif b/modules/board/skins/xe_gallery/images/common/iconArrowD8.gif new file mode 100644 index 000000000..fe3143edc Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/iconArrowD8.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/iconCheck.gif b/modules/board/skins/xe_gallery/images/common/iconCheck.gif new file mode 100644 index 000000000..c4fb37ae0 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/iconCheck.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/iconNotice.gif b/modules/board/skins/xe_gallery/images/common/iconNotice.gif new file mode 100644 index 000000000..d32027496 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/iconNotice.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/iconReply.gif b/modules/board/skins/xe_gallery/images/common/iconReply.gif new file mode 100644 index 000000000..a6d4ea112 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/iconReply.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/iconReplyArrow.gif b/modules/board/skins/xe_gallery/images/common/iconReplyArrow.gif new file mode 100644 index 000000000..d1a21a040 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/iconReplyArrow.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/iconRss.gif b/modules/board/skins/xe_gallery/images/common/iconRss.gif new file mode 100644 index 000000000..f495b3ebc Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/iconRss.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/iconSetup.gif b/modules/board/skins/xe_gallery/images/common/iconSetup.gif new file mode 100644 index 000000000..33b41da11 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/iconSetup.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/iconTag.gif b/modules/board/skins/xe_gallery/images/common/iconTag.gif new file mode 100644 index 000000000..ecfdb5585 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/iconTag.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/iconTrackback.gif b/modules/board/skins/xe_gallery/images/common/iconTrackback.gif new file mode 100644 index 000000000..1c83bcadd Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/iconTrackback.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/lineH3.gif b/modules/board/skins/xe_gallery/images/common/lineH3.gif new file mode 100644 index 000000000..fe42fe378 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/lineH3.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/lineTextAreaDrag.gif b/modules/board/skins/xe_gallery/images/common/lineTextAreaDrag.gif new file mode 100644 index 000000000..3df035047 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/lineTextAreaDrag.gif differ diff --git a/modules/board/skins/xe_gallery/images/common/line_1x10_e0e0e0.gif b/modules/board/skins/xe_gallery/images/common/line_1x10_e0e0e0.gif new file mode 100644 index 000000000..6a848dd58 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/common/line_1x10_e0e0e0.gif differ diff --git a/modules/board/skins/xe_gallery/images/cyan/bgBoardListTh.gif b/modules/board/skins/xe_gallery/images/cyan/bgBoardListTh.gif new file mode 100644 index 000000000..aebba7b59 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/cyan/bgBoardListTh.gif differ diff --git a/modules/board/skins/xe_gallery/images/cyan/buttonModifyE.gif b/modules/board/skins/xe_gallery/images/cyan/buttonModifyE.gif new file mode 100644 index 000000000..a1d4340d3 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/cyan/buttonModifyE.gif differ diff --git a/modules/board/skins/xe_gallery/images/cyan/buttonReply.gif b/modules/board/skins/xe_gallery/images/cyan/buttonReply.gif new file mode 100644 index 000000000..1baede5d0 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/cyan/buttonReply.gif differ diff --git a/modules/board/skins/xe_gallery/images/cyan/buttonTypeInput24.gif b/modules/board/skins/xe_gallery/images/cyan/buttonTypeInput24.gif new file mode 100644 index 000000000..7a341a96b Binary files /dev/null and b/modules/board/skins/xe_gallery/images/cyan/buttonTypeInput24.gif differ diff --git a/modules/board/skins/xe_gallery/images/cyan/iconArticle.gif b/modules/board/skins/xe_gallery/images/cyan/iconArticle.gif new file mode 100644 index 000000000..bce58cfe8 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/cyan/iconArticle.gif differ diff --git a/modules/board/skins/xe_gallery/images/cyan/iconFile.gif b/modules/board/skins/xe_gallery/images/cyan/iconFile.gif new file mode 100644 index 000000000..83ad10665 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/cyan/iconFile.gif differ diff --git a/modules/board/skins/xe_gallery/images/cyan/iconList.gif b/modules/board/skins/xe_gallery/images/cyan/iconList.gif new file mode 100644 index 000000000..d41737669 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/cyan/iconList.gif differ diff --git a/modules/board/skins/xe_gallery/images/cyan/iconMyInfo.gif b/modules/board/skins/xe_gallery/images/cyan/iconMyInfo.gif new file mode 100644 index 000000000..1ba5a947e Binary files /dev/null and b/modules/board/skins/xe_gallery/images/cyan/iconMyInfo.gif differ diff --git a/modules/board/skins/xe_gallery/images/cyan/iconWrite.gif b/modules/board/skins/xe_gallery/images/cyan/iconWrite.gif new file mode 100644 index 000000000..9319f7e9b Binary files /dev/null and b/modules/board/skins/xe_gallery/images/cyan/iconWrite.gif differ diff --git a/modules/board/skins/xe_gallery/images/cyan/lineBoardListTh.gif b/modules/board/skins/xe_gallery/images/cyan/lineBoardListTh.gif new file mode 100644 index 000000000..b26bf737c Binary files /dev/null and b/modules/board/skins/xe_gallery/images/cyan/lineBoardListTh.gif differ diff --git a/modules/board/skins/xe_gallery/images/green/bgBoardListTh.gif b/modules/board/skins/xe_gallery/images/green/bgBoardListTh.gif new file mode 100644 index 000000000..ae25c2d82 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/green/bgBoardListTh.gif differ diff --git a/modules/board/skins/xe_gallery/images/green/buttonModifyE.gif b/modules/board/skins/xe_gallery/images/green/buttonModifyE.gif new file mode 100644 index 000000000..6a4ade1a5 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/green/buttonModifyE.gif differ diff --git a/modules/board/skins/xe_gallery/images/green/buttonReply.gif b/modules/board/skins/xe_gallery/images/green/buttonReply.gif new file mode 100644 index 000000000..e142d4263 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/green/buttonReply.gif differ diff --git a/modules/board/skins/xe_gallery/images/green/buttonTypeInput24.gif b/modules/board/skins/xe_gallery/images/green/buttonTypeInput24.gif new file mode 100644 index 000000000..3e01072b9 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/green/buttonTypeInput24.gif differ diff --git a/modules/board/skins/xe_gallery/images/green/iconArticle.gif b/modules/board/skins/xe_gallery/images/green/iconArticle.gif new file mode 100644 index 000000000..a27236ef2 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/green/iconArticle.gif differ diff --git a/modules/board/skins/xe_gallery/images/green/iconFile.gif b/modules/board/skins/xe_gallery/images/green/iconFile.gif new file mode 100644 index 000000000..2040f4fcb Binary files /dev/null and b/modules/board/skins/xe_gallery/images/green/iconFile.gif differ diff --git a/modules/board/skins/xe_gallery/images/green/iconList.gif b/modules/board/skins/xe_gallery/images/green/iconList.gif new file mode 100644 index 000000000..2e67636f5 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/green/iconList.gif differ diff --git a/modules/board/skins/xe_gallery/images/green/iconMyInfo.gif b/modules/board/skins/xe_gallery/images/green/iconMyInfo.gif new file mode 100644 index 000000000..b67f29733 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/green/iconMyInfo.gif differ diff --git a/modules/board/skins/xe_gallery/images/green/iconWrite.gif b/modules/board/skins/xe_gallery/images/green/iconWrite.gif new file mode 100644 index 000000000..2c9832e36 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/green/iconWrite.gif differ diff --git a/modules/board/skins/xe_gallery/images/green/lineBoardListTh.gif b/modules/board/skins/xe_gallery/images/green/lineBoardListTh.gif new file mode 100644 index 000000000..282297cf8 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/green/lineBoardListTh.gif differ diff --git a/modules/board/skins/xe_gallery/images/purple/bgBoardListTh.gif b/modules/board/skins/xe_gallery/images/purple/bgBoardListTh.gif new file mode 100644 index 000000000..ae25c2d82 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/purple/bgBoardListTh.gif differ diff --git a/modules/board/skins/xe_gallery/images/purple/buttonModifyE.gif b/modules/board/skins/xe_gallery/images/purple/buttonModifyE.gif new file mode 100644 index 000000000..a1d4340d3 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/purple/buttonModifyE.gif differ diff --git a/modules/board/skins/xe_gallery/images/purple/buttonReply.gif b/modules/board/skins/xe_gallery/images/purple/buttonReply.gif new file mode 100644 index 000000000..600534865 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/purple/buttonReply.gif differ diff --git a/modules/board/skins/xe_gallery/images/purple/buttonTypeInput24.gif b/modules/board/skins/xe_gallery/images/purple/buttonTypeInput24.gif new file mode 100644 index 000000000..0dcfc0e3d Binary files /dev/null and b/modules/board/skins/xe_gallery/images/purple/buttonTypeInput24.gif differ diff --git a/modules/board/skins/xe_gallery/images/purple/iconArticle.gif b/modules/board/skins/xe_gallery/images/purple/iconArticle.gif new file mode 100644 index 000000000..59c1c8019 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/purple/iconArticle.gif differ diff --git a/modules/board/skins/xe_gallery/images/purple/iconFile.gif b/modules/board/skins/xe_gallery/images/purple/iconFile.gif new file mode 100644 index 000000000..c39a49aa0 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/purple/iconFile.gif differ diff --git a/modules/board/skins/xe_gallery/images/purple/iconList.gif b/modules/board/skins/xe_gallery/images/purple/iconList.gif new file mode 100644 index 000000000..2e67636f5 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/purple/iconList.gif differ diff --git a/modules/board/skins/xe_gallery/images/purple/iconMyInfo.gif b/modules/board/skins/xe_gallery/images/purple/iconMyInfo.gif new file mode 100644 index 000000000..af4545bfa Binary files /dev/null and b/modules/board/skins/xe_gallery/images/purple/iconMyInfo.gif differ diff --git a/modules/board/skins/xe_gallery/images/purple/iconWrite.gif b/modules/board/skins/xe_gallery/images/purple/iconWrite.gif new file mode 100644 index 000000000..f18cb5e9e Binary files /dev/null and b/modules/board/skins/xe_gallery/images/purple/iconWrite.gif differ diff --git a/modules/board/skins/xe_gallery/images/purple/lineBoardListTh.gif b/modules/board/skins/xe_gallery/images/purple/lineBoardListTh.gif new file mode 100644 index 000000000..6c74832c3 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/purple/lineBoardListTh.gif differ diff --git a/modules/board/skins/xe_gallery/images/red/bgBoardListTh.gif b/modules/board/skins/xe_gallery/images/red/bgBoardListTh.gif new file mode 100644 index 000000000..ae25c2d82 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/red/bgBoardListTh.gif differ diff --git a/modules/board/skins/xe_gallery/images/red/buttonModifyE.gif b/modules/board/skins/xe_gallery/images/red/buttonModifyE.gif new file mode 100644 index 000000000..974552d54 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/red/buttonModifyE.gif differ diff --git a/modules/board/skins/xe_gallery/images/red/buttonReply.gif b/modules/board/skins/xe_gallery/images/red/buttonReply.gif new file mode 100644 index 000000000..b9472e1bc Binary files /dev/null and b/modules/board/skins/xe_gallery/images/red/buttonReply.gif differ diff --git a/modules/board/skins/xe_gallery/images/red/buttonTypeInput24.gif b/modules/board/skins/xe_gallery/images/red/buttonTypeInput24.gif new file mode 100644 index 000000000..2ae80ed23 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/red/buttonTypeInput24.gif differ diff --git a/modules/board/skins/xe_gallery/images/red/iconArticle.gif b/modules/board/skins/xe_gallery/images/red/iconArticle.gif new file mode 100644 index 000000000..5cd05be62 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/red/iconArticle.gif differ diff --git a/modules/board/skins/xe_gallery/images/red/iconFile.gif b/modules/board/skins/xe_gallery/images/red/iconFile.gif new file mode 100644 index 000000000..ee0dd83c7 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/red/iconFile.gif differ diff --git a/modules/board/skins/xe_gallery/images/red/iconList.gif b/modules/board/skins/xe_gallery/images/red/iconList.gif new file mode 100644 index 000000000..2e67636f5 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/red/iconList.gif differ diff --git a/modules/board/skins/xe_gallery/images/red/iconMyInfo.gif b/modules/board/skins/xe_gallery/images/red/iconMyInfo.gif new file mode 100644 index 000000000..b48e1fcd2 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/red/iconMyInfo.gif differ diff --git a/modules/board/skins/xe_gallery/images/red/iconWrite.gif b/modules/board/skins/xe_gallery/images/red/iconWrite.gif new file mode 100644 index 000000000..2caff746f Binary files /dev/null and b/modules/board/skins/xe_gallery/images/red/iconWrite.gif differ diff --git a/modules/board/skins/xe_gallery/images/red/lineBoardListTh.gif b/modules/board/skins/xe_gallery/images/red/lineBoardListTh.gif new file mode 100644 index 000000000..ee37cb8df Binary files /dev/null and b/modules/board/skins/xe_gallery/images/red/lineBoardListTh.gif differ diff --git a/modules/board/skins/xe_gallery/images/white/bgBoardListTh.gif b/modules/board/skins/xe_gallery/images/white/bgBoardListTh.gif new file mode 100644 index 000000000..ae25c2d82 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/white/bgBoardListTh.gif differ diff --git a/modules/board/skins/xe_gallery/images/white/buttonModifyE.gif b/modules/board/skins/xe_gallery/images/white/buttonModifyE.gif new file mode 100644 index 000000000..1cde1b60f Binary files /dev/null and b/modules/board/skins/xe_gallery/images/white/buttonModifyE.gif differ diff --git a/modules/board/skins/xe_gallery/images/white/buttonReply.gif b/modules/board/skins/xe_gallery/images/white/buttonReply.gif new file mode 100644 index 000000000..600534865 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/white/buttonReply.gif differ diff --git a/modules/board/skins/xe_gallery/images/white/buttonTypeInput24.gif b/modules/board/skins/xe_gallery/images/white/buttonTypeInput24.gif new file mode 100644 index 000000000..0dcfc0e3d Binary files /dev/null and b/modules/board/skins/xe_gallery/images/white/buttonTypeInput24.gif differ diff --git a/modules/board/skins/xe_gallery/images/white/iconArticle.gif b/modules/board/skins/xe_gallery/images/white/iconArticle.gif new file mode 100644 index 000000000..59c1c8019 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/white/iconArticle.gif differ diff --git a/modules/board/skins/xe_gallery/images/white/iconFile.gif b/modules/board/skins/xe_gallery/images/white/iconFile.gif new file mode 100644 index 000000000..c39a49aa0 Binary files /dev/null and b/modules/board/skins/xe_gallery/images/white/iconFile.gif differ diff --git a/modules/board/skins/xe_gallery/images/white/iconList.gif b/modules/board/skins/xe_gallery/images/white/iconList.gif new file mode 100644 index 000000000..1c83bcadd Binary files /dev/null and b/modules/board/skins/xe_gallery/images/white/iconList.gif differ diff --git a/modules/board/skins/xe_gallery/images/white/iconMyInfo.gif b/modules/board/skins/xe_gallery/images/white/iconMyInfo.gif new file mode 100644 index 000000000..af4545bfa Binary files /dev/null and b/modules/board/skins/xe_gallery/images/white/iconMyInfo.gif differ diff --git a/modules/board/skins/xe_gallery/images/white/iconWrite.gif b/modules/board/skins/xe_gallery/images/white/iconWrite.gif new file mode 100644 index 000000000..f18cb5e9e Binary files /dev/null and b/modules/board/skins/xe_gallery/images/white/iconWrite.gif differ diff --git a/modules/board/skins/xe_gallery/images/white/lineBoardListTh.gif b/modules/board/skins/xe_gallery/images/white/lineBoardListTh.gif new file mode 100644 index 000000000..6d891d82c Binary files /dev/null and b/modules/board/skins/xe_gallery/images/white/lineBoardListTh.gif differ diff --git a/modules/board/skins/xe_gallery/input_password_form.html b/modules/board/skins/xe_gallery/input_password_form.html new file mode 100644 index 000000000..985f1ffd5 --- /dev/null +++ b/modules/board/skins/xe_gallery/input_password_form.html @@ -0,0 +1,27 @@ + + + +
+ +
+

{$lang->msg_input_password}

+
+ +
+ + + + + + + +
+ +
+ + + diff --git a/modules/board/skins/xe_gallery/js/board.js b/modules/board/skins/xe_gallery/js/board.js new file mode 100644 index 000000000..7611a063d --- /dev/null +++ b/modules/board/skins/xe_gallery/js/board.js @@ -0,0 +1,137 @@ +/** + * @file modules/board/js/board.js + * @author zero (zero@nzeo.com) + * @brief board 모듈의 javascript + **/ + +/* 관리자가 카트 선택시 세션에 넣음 */ +function doAddCart(mid, obj) { + var srl = obj.value; + var check_flag = obj.checked?'add':'remove'; + + var params = new Array(); + params["mid"] = mid; + params["srl"] = srl; + params["check_flag"] = check_flag; + + exec_xml("board","procBoardAdminAddCart", params, null); +} + +/* 글쓰기 작성후 */ +function completeDocumentInserted(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var category_srl = ret_obj['category_srl']; + + alert(message); + + var url = current_url.setQuery('mid',mid).setQuery('document_srl',document_srl).setQuery('act',''); + if(category_srl) url = url.setQuery('category',category_srl); + location.href = url; +} + +/* 글 삭제 */ +function completeDeleteDocument(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var page = ret_obj['page']; + + var url = "./?mid="+mid; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 검색 실행 */ +function completeSearch(fo_obj, params) { + fo_obj.submit(); +} + +/* 추천, 추천은 별도의 폼입력이 필요 없어 직접 필터 사용 */ +function doVote() { + var fo_obj = document.getElementById('fo_document_info'); + procFilter(fo_obj, vote); +} + +function completeVote(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + alert(message); + location.href = location.href; +} + +// 현재 페이지 reload +function completeReload(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + location.href = location.href; +} + +/* 댓글 글쓰기 작성후 */ +function completeInsertComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var comment_srl = ret_obj['comment_srl']; + + var url = "./?mid="+mid+"&document_srl="+document_srl; + if(comment_srl) url += "#comment_"+comment_srl; + + alert(message); + + location.href = url; +} + +/* 댓글 삭제 */ +function completeDeleteComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 트랙백 삭제 */ +function completeDeleteTrackback(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 카테고리 이동 */ +function doChangeCategory() { + var sel_obj = xGetElementById("board_category"); + var sel_idx = sel_obj.selectedIndex; + var category_srl = sel_obj.options[sel_idx].value; + location.href = current_url.setQuery('category',category_srl); +} + +/* 스크랩 */ +function doScrap(document_srl) { + var params = new Array(); + params["document_srl"] = document_srl; + exec_xml("member","procMemberScrapDocument", params, null); +} diff --git a/modules/board/skins/xe_gallery/list.html b/modules/board/skins/xe_gallery/list.html new file mode 100644 index 000000000..66f1834fc --- /dev/null +++ b/modules/board/skins/xe_gallery/list.html @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + {@ $order_icon = "buttonDescending.gif" } + {@ $order_type = "asc"; } + + {@ $order_icon = "buttonAscending.gif" } + {@ $order_type = "desc"; } + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + {$lang->title} + +
{$lang->readed_count}{$lang->voted_count}{$lang->date}
{$lang->notice} + + document_srl])-->checked="checked" /> + + + + {$document->getTitleText($module_info->subject_cut_size)} + + {$document->getTitleText($module_info->subject_cut_size)} + + + {$document->getTitleText($module_info->subject_cut_size)} + + + + {$document->getCommentCount()} + + + + {$document->getTrackbackCount()} + + {$document->get('readed_count')}{$document->get('voted_count')}{$document->getRegdate('Y-m-d')}
+ + + + + + + +
+ + + +
+ + + + + + +
+ + document_srl])-->checked="checked" /> + + + + {$document->getTitleText(8,'')} + + {$document->getTitleText(8,'')} + + + {$document->getTitleText(8,'')} + + + + ({$document->getCommentCount()}) + + + + [{$document->getTrackbackCount()}] + + +
+
{$document->getNickName()}
+
{$document->getRegdate('Y.m.d')}
+
+
+
+ {$lang->readed_count} {$document->get('readed_count')} + | {$lang->voted_count} {$document->get('voted_count')} +
+
+ + + +
+ + + +
+ + + + + + + + + + + + + +
+ +
+
+ + + diff --git a/modules/board/skins/xe_gallery/message.html b/modules/board/skins/xe_gallery/message.html new file mode 100644 index 000000000..00bf01814 --- /dev/null +++ b/modules/board/skins/xe_gallery/message.html @@ -0,0 +1,11 @@ + + +
+ {$message} +
+ + + {$lang->cmd_login} + + + diff --git a/modules/board/skins/xe_gallery/screenshot/cyan.gif b/modules/board/skins/xe_gallery/screenshot/cyan.gif new file mode 100644 index 000000000..fe10b89d0 Binary files /dev/null and b/modules/board/skins/xe_gallery/screenshot/cyan.gif differ diff --git a/modules/board/skins/xe_gallery/screenshot/green.gif b/modules/board/skins/xe_gallery/screenshot/green.gif new file mode 100644 index 000000000..42925de0f Binary files /dev/null and b/modules/board/skins/xe_gallery/screenshot/green.gif differ diff --git a/modules/board/skins/xe_gallery/screenshot/purple.gif b/modules/board/skins/xe_gallery/screenshot/purple.gif new file mode 100644 index 000000000..f2d598e6b Binary files /dev/null and b/modules/board/skins/xe_gallery/screenshot/purple.gif differ diff --git a/modules/board/skins/xe_gallery/screenshot/red.gif b/modules/board/skins/xe_gallery/screenshot/red.gif new file mode 100644 index 000000000..3ed75018f Binary files /dev/null and b/modules/board/skins/xe_gallery/screenshot/red.gif differ diff --git a/modules/board/skins/xe_gallery/screenshot/white.gif b/modules/board/skins/xe_gallery/screenshot/white.gif new file mode 100644 index 000000000..c5707785e Binary files /dev/null and b/modules/board/skins/xe_gallery/screenshot/white.gif differ diff --git a/modules/board/skins/xe_gallery/skin.xml b/modules/board/skins/xe_gallery/skin.xml new file mode 100644 index 000000000..3eefb1ba1 --- /dev/null +++ b/modules/board/skins/xe_gallery/skin.xml @@ -0,0 +1,110 @@ + + + 제로보드XE 게시판 기본 스킨 (갤러리형) + ゼロボードXE掲示板のデフォルトスキン(ギャラリースタイル) + Zeroboard XE board 基本皮肤(相册型) + ZeroboardXE Basic Board Skin (Gallery Style) + + (주)NHN + (株)NHN + (株)NHN + NHN Corp + + 제로보드XE 게시판의 갤러리형태의 기본 스킨입니다. + 디자인 : 서기정 (http://blog.naver.com/addcozy) + HTML/CSS : 정찬명 (http://naradesign.net) + + + ゼロボードXEのギャラリースタイルのデフォルトスキンです。 + デザイン:ソギジョン (http://blog.naver.com/addcozy) + HTML/CSS:ジョンチャンミョン (http://naradesign.net) + + + zeroboard XE Board的相册型基本皮肤。 + 设计 : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Chan-Myung Jeong (http://naradesign.net) + + + This is the basic gallery style board skin of Zeroboard XE. + Design : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Chan-Myung Jeong (http://naradesign.net) + + + + + 하얀색(기본) + 白(デフォルト) + 白色(基本) + White (default) + + + 청록색 + 青緑 + 青绿色 + Cyan + + + 초록색 + + 绿色 + Green + + + 빨간색 + + 红色 + Red + + + 보라색 + + 紫色 + Purple + + + + + 정렬 대상 + ソート対象 + 排序对象 + Align Target + select + 등록된 순서 또는 변경된 순서로 정렬을 할 수 있습니다. + 登録された順、変更された順でソートできます。 + 可对主题按发表顺或最后更新顺进行排序。 + It can align articles as registered order or modified order. + newest + updated + + + 게시판 제목 + 掲示板タイトル + 版面标题 + Title of Board + 게시판의 제목을 적어주세요. + 掲示板タイトルを入力してください。 + 请输入版面标题。(留空为不显示) + Please input the title of board. + + + 게시판 부제목 + 掲示板サブタイトル + 版面副标题 + Subtitle of Board + 게시판 제목 옆에 나타날 부제목을 적어주세요. + 掲示板タイトルの横表示されるサブタイトルを入力してください。 + 请输入显示在版面标题旁的副标题。(留空为不显示) + Please input the subtitle of board which will be displayed beside of board title. + + + 게시판 상세 설명 + 掲示板の説明 + 版面详细说明 + Description of Board + 게시판 제목 아래 표시될 설명을 입력하실 수 있습니다. + 掲示板タイトルの下に表示される説明文入力してください。 + 请输入显示在版面标题下的说明。(留空为不显示) + You may input description which will be displayed under the board title. + + + diff --git a/modules/board/skins/xe_gallery/trackback.html b/modules/board/skins/xe_gallery/trackback.html new file mode 100644 index 000000000..5a565f328 --- /dev/null +++ b/modules/board/skins/xe_gallery/trackback.html @@ -0,0 +1,24 @@ + + + + + diff --git a/modules/board/skins/xe_gallery/view_document.html b/modules/board/skins/xe_gallery/view_document.html new file mode 100644 index 000000000..fc9ec9291 --- /dev/null +++ b/modules/board/skins/xe_gallery/view_document.html @@ -0,0 +1,134 @@ + + + +
+ + +
+ + +
+
+
+
+

{$oDocument->getTitleText()}

+ + |{$category_list[$oDocument->get('category_srl')]->title} + +
+ +
+ {$lang->readed_count}: + {$oDocument->get('readed_count')}, + + + {$lang->voted_count}: + {$oDocument->get('voted_count')}, + + + {$oDocument->getRegdate('Y.m.d')} {$oDocument->getRegdate('H:i:s')} + + + {$lang->cmd_modify} + {$lang->cmd_delete} + +
+
+
+ +
    +
  • {$lang->document_url} : {$oDocument->getPermanentUrl()}
  • + +
  • {$lang->trackback_url} : {$oDocument->getTrackbackUrl()}
  • + +
+ +
+
{$oDocument->getNickName()}
+ +
{$oDocument->get('ipaddress')}
+ +
+ + + + + + + + + + + + + +
{$val->name} + + +
+ + +
{$oDocument->getContent()}
+ +
+ {@ $tag_list = $oDocument->get('tag_list') } + +
+
{$lang->tag}
+ +
+ + + +
+
{$lang->uploaded_file} :
+ +
+
+ +
+
+ + +
+ + + + + + + + + + + + diff --git a/modules/board/skins/xe_gallery/write_form.html b/modules/board/skins/xe_gallery/write_form.html new file mode 100644 index 000000000..1cf0ea8c5 --- /dev/null +++ b/modules/board/skins/xe_gallery/write_form.html @@ -0,0 +1,115 @@ + + + +
+
fileupload)-->enctype="multipart/form-data" class="boardEditor" id="fo_write"> +
+ + + + + +
+ + + + + + + + + + + +
+ + +
+ + + + + + + +
+ +
+
{$lang->cmd_option}
+ +
+ isNotice())-->checked="checked" id="is_notice" /> + +
+
+ isLocked())-->checked="checked" id="lock_comment" /> + +
+ +
+ isSecret())-->checked="checked" id="is_secret" /> + +
+
+ allowComment())-->checked="checked" id="allow_comment" /> + +
+
+ allowTrackback())-->checked="checked" id="allow_trackback" /> + +
+ +
+ useNotify())-->checked="checked" id="notify_message" /> + +
+ +
+ +
{$editor}
+ +
+ + + +
+ +
+ + +

{$lang->about_tag}

+
+ + + +
+ + + +
+ + + +
+ + +
+
+ diff --git a/modules/board/skins/xe_list/comment.html b/modules/board/skins/xe_list/comment.html new file mode 100644 index 000000000..eba62e23d --- /dev/null +++ b/modules/board/skins/xe_list/comment.html @@ -0,0 +1,56 @@ + + + + + + + + diff --git a/modules/board/skins/xe_list/comment_form.html b/modules/board/skins/xe_list/comment_form.html new file mode 100644 index 000000000..f03e13bf3 --- /dev/null +++ b/modules/board/skins/xe_list/comment_form.html @@ -0,0 +1,72 @@ + + + + + + + + + +
    +
  • +
    {htmlspecialchars($source_comment->nick_name)}
    +
    + {zdate($source_comment->regdate, "Y.m.d H:i")} + + ({$source_comment->ipaddress}) + +
    + +
    + {$source_comment->content} +
    +
  • +
+ + + +
+ +
fileupload)-->enctype="multipart/form-data" class="boardEditor" id="fo_comment_write" > +
+ + + + + + + +
+ + + + + + + + + + + +
+ + +
class="borderTop">{$comment_editor}
+ +
+ +
+ + + + + +
+ + +
+
+ + + + diff --git a/modules/board/skins/xe_list/css/common.css b/modules/board/skins/xe_list/css/common.css new file mode 100644 index 000000000..ba6fe9d05 --- /dev/null +++ b/modules/board/skins/xe_list/css/common.css @@ -0,0 +1,259 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ +.gap1 { margin-top:.8em; } +.commentButton { margin:.8em 0 .8em 0; } + +/* pathNavigation */ +.pathNavigation { background:url(../images/common/bullet_3x3_d8d8d8.gif) no-repeat left .4em; padding:0 0 0 .5em; color:#999999; margin:0 0 1.5em 0;} +.pathNavigation * { font-size:.9em;} +.pathNavigation a { color:#999999;} +.pathNavigation strong { color:#666666;} + +/* boardComment */ +.boardComment { color:#AEAEAE; position:relative; border:1px solid #DDDDDD; overflow:hidden;padding:.8em; margin-top:.4em;} +.boardComment a { color:#f38d2a; text-decoration:none; border-bottom:1px dotted #f38d2a;} + +/* boardInformation */ +.boardInformation { width:100%; clear:both; margin:1em 0 .5em 0; overflow:hidden; color:#666666;} + +.accountNavigation { float:right; overflow:hidden;} +.accountNavigation li { float:left; padding:0 .5em 0 .6em; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left .4em; list-style:none;} +.accountNavigation li a { font-size:11px; white-space:nowrap; color:#666666; text-decoration:none;} +.accountNavigation li.rss { background:none; padding-top:.4em;} +.accountNavigation li.skin_info { padding-top:3px;} +.accountNavigation li.join { background:none; padding-top:.4em;} +.accountNavigation li.myInfo { padding-top:.4em; background:none;} +.accountNavigation li.admin { padding-top:.4em;} +.accountNavigation li.admin a { display:block; background:url(../images/common/iconAdmin.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.setup { padding-top:.4em;} +.accountNavigation li.setup a { display:block; background:url(../images/common/iconSetup.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.loginAndLogout { background:none; padding-left:0;} + +/* boardList */ +.boardList { width:100%; position:relative; border:1px solid #e0e1db;} +.boardList tr.notice { background:#f8f8f8;} +.boardList tr.notice .num { font-size:.9em; font-weight:bold;} +.boardList tr.bg1 { background:#ffffff} +.boardList tr.bg2 { background:#fbfbfb;} +.boardList th a { color:#3e3f3e; text-decoration:none; } +.boardList th.num { background-position:-3px bottom; border-left:1px solid #ffffff; } +.boardList th.title { text-align:center; } +.boardList th.category { text-align:center; } +.boardList th.title select { vertical-align:middle; margin-left:.5em; } +.boardList th.reading { white-space:nowrap;} +.boardList th.recommend { white-space:nowrap;} +.boardList th.date { border-right:1px solid #ffffff;} +.boardList th .sort { padding:0 .2em; vertical-align:middle;} +.boardList td { border-top:1px solid #eff0ed; padding:.5em;} +.boardList td.num { font:.8em tahoma; color:#999999; padding:.5em 1em; text-align:center;} +.boardList tr.notice td.num { padding:.5em; white-space:nowrap;} +.boardList tr.notice td.notice { font-size:.9em; color:#999999; font-weight:bold; text-align:center;} +.boardList td.thumb { padding:.5em 0 .5em .5em; width:145px; table-layout:fixed; white-space:nowrap;} +.boardList td.thumb * { vertical-align:middle;} +.boardList td.title {padding-left:1em; } +.boardList td.title strong.category { font-size:1em; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat right 3px; padding-right:.5em; margin-right:.5em;} +.boardList td.title.bold { font-size:1.2em; font-weight:bold;} +.boardList td.title.bold a { position:relative; top:.3em;} +.boardList td.title * { vertical-align:middle;} +.boardList td.title, +.boardList td.title a { color:#444444; text-decoration:none;} +.boardList td.title a:visited { color:#777777;} +.boardList td.author { color:#333333; font-size:.95em; padding-left:1em;} +.boardList td.author a { font-size:1em; color:#333333;} +.boardList td.reading { font:.8em Tahoma; color:#999999; text-align:center;} +.boardList td.date { font:.8em Tahoma; color:#999999; text-align:center; white-space:nowrap;} +.boardList td.summary { border-top:none; vertical-align:top; color:#666666; line-height:1.25em;} +.boardList td.summary a { color:#666666; text-decoration:none; line-height:inherit;} +.boardList td.summary a:visited { color:#999999;} +.boardList td input { _margin:-3px;} +.boardList td .replyAndTrackback img.trackback { margin-bottom:-.1em;} +.boardList td .replyAndTrackback strong { font:bold 1em Tahoma;} + +.boardList td .thumbnailSmall { margin:0 .3em 0 .3em;} +.boardList td .thumbnailSmall img { border:1px solid #bcbdb6;} +.boardList td .thumbnailMedium { margin:0 .3em 0 .3em;} +.boardList td .thumbnailMedium img { border:1px solid #e0e1db; padding:3px;} + +.boardList.thumbnail { margin-top:-1px; border-bottom:none;} +.boardList.thumbnail td { border-top:none; border-bottom:1px solid #eff0ed; padding:1.5em 0 0 1.5em; overflow:hidden;} +.boardList.thumbnail div.cell { float:left; width:130px; margin:0 1.5em 0 0; padding-bottom:1.5em;} +.boardList.thumbnail div.cell img.thumb { padding:2px; border:1px solid #e0e1db; display:block; margin-bottom:1em;} +.boardList.thumbnail div.title { color:#444444; margin-bottom:.2em; padding-left:3px;} +.boardList.thumbnail div.title a { color:#444444;} +.boardList.thumbnail div.nameAndDate { font-size:.9em; color:#999999; margin-bottom:.2em; padding-left:3px;} +.boardList.thumbnail div.nameAndDate a { color:#999999;} +.boardList.thumbnail div.nameAndDate .date { font:.8em Tahoma; color:#999999;} +.boardList.thumbnail div.readAndRecommend { font-size:.9em; color:#666666; padding-left:3px;} +.boardList.thumbnail div.readAndRecommend .num { font:.8em Tahoma;} +.boardList.thumbnail div.readAndRecommend .vr { color:#dddddd;} +.boardList.thumbnail div.readAndRecommend strong.num { font:bold .8em Tahoma; color:#ff6600;} + +/* pageNavigation */ +.pageNavigation { display:block; padding:1.5em 0 2em 0; text-align:center; font:bold 11px Tahoma; } +.pageNavigation a { position:relative; margin-left:-4px; font:bold 1em Tahoma; color:#666666; display:inline-block; padding:1px 7px 2px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } +.pageNavigation a:hover { background:#F7F7F7; text-decoration:none; } +.pageNavigation a:visited { color:#999999;} +.pageNavigation a.goToFirst, +.pageNavigation a.goToLast { border:none; border-right:1px solid #ffffff; border-left:1px solid #ffffff; z-index:99; vertical-align:top; padding:0px 7px 4px 6px;} +.pageNavigation a.goToFirst img, +.pageNavigation a.goToLast img { display:inline-block; padding:2px 0; position:relative; top:2px; _top:1px;} + +/* extraVars list */ +.extraVarsList { width:100%; border:1px solid #e0e1db; clear:both; margin-bottom:1em;} +.extraVarsList tr.notice { background:#f8f8f8;} +.extraVarsList tr.notice .num { font-size:.9em; font-weight:bold;} +.extraVarsList tr.bg1 { background:#ffffff} +.extraVarsList tr.bg2 { background:#fbfbfb;} +.extraVarsList th { color:#3e3f3e; font-weight:bold; padding:.8em .5em .5em .5em; border-bottom:1px solid #eff0ed; border-right:1px solid #eff0ed;} +.extraVarsList td { border-bottom:1px solid #eff0ed; padding:.5em .5em .5em 1em;} + +/* boardSearch */ +.boardSearch { text-align:center; clear:both; width:100%;} +.boardSearch fieldset { border:none; display:inline; overflow:visible; position:relative; white-space:nowrap;} +.boardSearch fieldset legend { overflow:hidden; width:1px; height:1px; font-size:.001em;} +.boardSearch * { vertical-align:middle;} +.boardSearch select { float:left;_margin-top:3px; height:20px;} +.boardSearch input { float:left; margin:0 .3em; _margin-top:3px;background:#fbfbfb;} +*:first-child+html .boardSearch select { margin-top:3px; height:21px;} +*:first-child+html .boardSearch input { margin-top:3px; } +.searchButton ul { overflow:hidden;} +.searchButton li { float:left; margin-right:.3em; list-style:none;} + +/* boardRead */ +.boardRead { padding:0; margin:0; border:1px solid #e0e1db;} +.boardRead .originalContent { padding:2em 1.2em 2em 1.2em;} +.boardRead .readHeader { padding:0 0 .5em 0; margin-bottom:1em; border-bottom:1px solid #eff0ed; overflow:hidden;} + +.boardRead .titleAndCategory { float:left;} +.boardRead .titleAndCategory h4 { font-size:1.4em; display:inline; padding-left:.2em;} +.boardRead .titleAndCategory .vr { font-size:.9em; margin:0 .3em; color:#c5c7c0;} +.boardRead .titleAndCategory .cotegory { font-size:.9em; color:#999999; white-space:nowrap;} + +.boardRead .dateAndModify { float:right; white-space:nowrap; font-size:.8em; color:#999999; position:relative;} +.boardRead .dateAndModify strong { font-size:1em; font-family:Tahoma;} + +.boardRead ul.uri { overflow:hidden; margin:0 0 2em .3em; float:right; clear:left;} +.boardRead ul.uri li { font-size:8pt; color:#c5c7c0; } + +.boardRead .userInfo { float:left; white-space:nowrap;} +.boardRead .userInfo .author { padding:0 .3em 0 0; color:#3074a5; margin-right:.3em;} +.boardRead .userInfo .ipaddress { font-size:.9em; font-family:Tahoma; color:#888888; margin-right:.5em; } + +.boardRead .contentBody { width:100%; overflow:hidden; } +.boardRead .readBody { padding:0 .3em; color:#555555; overflow:hidden; margin-bottom:2em; clear:both; } +.boardRead .readBody p { margin:1em 0; line-height:1.5em;} +.boardRead .readBody .alignLeft { float:left; margin:0 1em 1em 0; } +.boardRead .readBody .alignRight { float:right; margin:0 0 1em 1em; } +.boardRead .readBody .valignCenter { vertical-align:middle;} +.boardRead .readBody .clearBoth { display:block; margin:0 0 1em 0;} +.boardRead .readFooter { padding:0 .3em;} +.boardRead .readFooter .tag { margin-bottom:1em;} +.boardRead .readFooter .tag h5 { display:inline; font-size:1em; margin-right:.5em;} +.boardRead .readFooter .tag ul, +.boardRead .readFooter .tag li { display:inline;} +.boardRead .readFooter .tag a { color:#444444;} +.boardRead .readFooter .tag .tagIcon { vertical-align:middle;} +.boardRead .readFooter .fileAttached { _width:99%; border:1px solid #eaeae7; overflow:hidden; background:#fbfbfb;} +.boardRead .readFooter .fileAttached h5 { font-weight:normal; color:#999999; float:left; font-size:1em; margin:.5em .5em 0 .5em; line-height:1.5em;} +.boardRead .readFooter .fileAttached ul { float:left; margin-top:.5em; padding-bottom:1em; } +.boardRead .readFooter .fileAttached li { display:inline; margin-right:.75em; line-height:1.5em;} +.boardRead .readFooter .fileAttached li a { text-decoration:none; color:#777777;} +.boardRead .readFooter .fileAttached li a:visited { color:#777777;} + +.boardRead .replyAndTrackbackBox { position:relative; _width:100%;} +.boardRead .replyAndTrackback li { margin-top:10px; _margin-top:8px; margin-left:1em; padding-left:1.4em; float:left; list-style:none;} + +.boardRead .replyAndTrackback li.reply { background:url(../images/common/iconReply.gif) no-repeat left top;} +.boardRead .replyAndTrackback li.reply a { position:relative; top:-.3em; _top:-.6em;} + +.boardRead .replyAndTrackback li.trackback { background:url(../images/common/iconTrackback.gif) no-repeat left top;} +.boardRead .replyAndTrackback li.trackback a { position:relative; top:-.3em; _top:0em;} + +.boardRead .replyAndTrackback a { color:#333333; white-space:nowrap; text-decoration:none;} +.boardRead .replyAndTrackback a#toggleReply { background:url(../images/common/buttonToggleReply.gif) no-repeat right top;} +.boardRead .replyAndTrackback a#toggleTrackback { background:url(../images/common/buttonToggleReply.gif) no-repeat right -13px;} + +.boardRead .replyAndTrackback .listButton { position:relative; right: 10px; top:-7px; _top:-6px; float:right;} + +#trackbacks { padding:.6em .6em; color:#666666; border:1px solid #e0e1db;;margin-top:.5em;} +#trackbacks li { padding:.6em .8em .6em .6em; line-height:1.25em; border-bottom:1px dotted #EEEEEE; list-style:none;} +#trackbacks p { display:inline; margin-bottom:1em;} +#trackbacks a { color:#666666; text-decoration:none;} +#trackbacks div { clear:both; } +#trackbacks address { display:block; padding:0 .3em 0 0; } +#trackbacks address a { font-size:.9em; color:#3074a5; margin-right:.3em; float:left;} +#trackbacks address .date { font:.8em Tahoma; color:#cccccc; float:right;} + +#reply { padding:.6em .6em; color:#666666; border:1px solid #e0e1db; margin-top:.5em;} +#reply li { padding:.6em .8em .6em .6em; line-height:1.25em; clear:both; border-bottom:1px dotted #EEEEEE; list-style:none;} +#reply p { display:inline; margin-bottom:1em;} +#reply .author { float:left; padding:0 .3em 0 0; font-size:.9em; color:#3074a5; margin:0 .3em .5em 0;} +#reply .author a { font-size:.9em; color:#3074a5; margin-right:.3em;} +#reply .date { float:right; font:.8em Tahoma; color:#cccccc; margin:.3em 0 .5em 0;} + +#reply .replyOption { float:right; white-space:nowrap; margin-left:.2em;} +#reply .replyOption img { vertical-align:middle;} + +#reply .replyContent { clear:left; } +#reply .reply { background-color:#FAFAFA;} +#reply .replyIndent { background:url(../images/common/iconReplyArrow.gif) no-repeat .0em .3em; padding-left:1.3em;} + +#reply li .fileAttached { _width:99%; border:1px solid #eaeae7; overflow:hidden; background:#fbfbfb; margin-top:.3em; list-style:none;} +#reply li .fileAttached ul { float:left; padding:.3em 1em .2em 0; margin-left:.5em; _margin-left:.25em;} +#reply li .fileAttached li a { font-size:.9em; white-space:nowrap; position:relative; color:#444444; } +#reply li .fileAttached li a:visited { color:#777777;} + +/* boardEditor */ +.boardEditor { padding:.5em 0 1em 0; width:100%; overflow:hidden;} +.boardEditor.reply { padding:.5em 1em 1em 1em; width:auto; overflow:hidden;} +.boardEditor legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em;} +.boardEditor fieldset { _width:100%; border:1px solid #eaeae7; border-top:none;} +.boardEditor .userNameAndPw { position:relative; background:#fbfbfb; border-top:1px solid #eaeae7; border-bottom:1px solid #e1e1e1; padding:.5em 1em; white-space:nowrap;} +.boardEditor .userNameAndPw * { vertical-align:middle;} +.boardEditor .userNameAndPw label { margin-right:.2em; color:#666760;} +.boardEditor .userNameAndPw input { color:#aaaaaa;} +.boardEditor .userNameAndPw .userName { width:6em; margin-right:.8em;} +.boardEditor .userNameAndPw .userPw { width:5em;} +.boardEditor .userNameAndPw .emailAddress { width:6em;} +.boardEditor .userNameAndPw .homePage { width:6em;} +.boardEditor .userNameAndPw .checkSecret { position:absolute; right:2em; top:.7em;} +.boardEditor .borderTop { border-top:1px solid #eaeae7; } + +/* boardWrite */ +.boardWrite { width:100%; position:relative;} +.boardWrite .userNameAndPw { margin-bottom:-1px;} +.boardWrite .boardEditor fieldset { width:auto; position:relative;} +.boardWrite div.title { border-bottom:1px solid #eff0ed; border-top:1px solid #eff0ed; padding:.5em 0; white-space:nowrap;} +.boardWrite div.title label.title { display:block; float:left; font-weight:bold; padding:.4em 0 0 1.5em; width:8em; white-space:nowrap;} +.boardWrite div.title input#title { width:60%;} +.boardWrite .option { border-bottom:1px solid #e1e1e1; padding:.5em 0; overflow:hidden; width:100%;} +.boardWrite .option dt { display:block; float:left; font-weight:bold; padding:.3em 0 0 1.5em; width:8em; white-space:nowrap;} +.boardWrite .option dd { float:left; margin-right:1em; padding-top:.2em; _padding-top:.1em;} +.boardWrite .option dd * { vertical-align:middle;} +.boardWrite .inputTypeText { background:#fbfbfb;} +.boardWrite .trackbackURI { clear:both; border-top:1px solid #eff0ed; padding:4px 0 .8em 0;} +.boardWrite .trackbackURI label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .trackbackURI .inputTypeText { width:50%;} +.boardWrite .tag { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;} +.boardWrite .tag label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .tag .inputTypeText { width:50%;} +.boardWrite .tag .help { vertical-align:middle;} +.boardWrite .tag .info { padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;} +.boardWrite .extra_vars { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;} +.boardWrite .extra_vars label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .extra_vars .info { clear:both; padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;} +.boardWrite .extra_vars ul li { float:left; margin-right:1em; } + +.smallBox { border:1px solid #e0e1db; margin:5em auto 1em auto;} +.smallBox.w268 { width:268px;} +.smallBox .header { position:relative; _width:100%; background:#ffffff url(../images/normal/bgH3.gif) no-repeat left bottom; overflow:hidden;} +.smallBox .header h3 { clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border-bottom:3px solid #fe3614; } +.smallBox .complex { padding:1.5em 2em 2em 2em;} +.smallBox .inputPassword { position:relative; border:none; padding:2em 2em 1.5em 2em;} +.smallBox .inputPassword .inputTypeText { float:left; margin-right:.5em; width:8em;} +.smallBox .inputPassword legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} + +*:first-child+html .buttonTypeGo { position:relative; top:3px; } diff --git a/modules/board/skins/xe_list/css/cyan.css b/modules/board/skins/xe_list/css/cyan.css new file mode 100644 index 000000000..d1f8116f8 --- /dev/null +++ b/modules/board/skins/xe_list/css/cyan.css @@ -0,0 +1,32 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; border-top:1px solid #d1d9db; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} +.boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d1d9db; border-bottom:3px solid #2895c0; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.accountNavigation li.join a { display:block; background:url(../images/cyan/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/cyan/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} + +.articleNum { float:left; background:url(../images/cyan/iconArticle.gif) no-repeat left top; padding:0 0 0 1.5em; margin:.5em 0 0 10px;} +#reply li .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/cyan/iconFile.gif) no-repeat left;} +.articleNum strong { font:bold 11px Tahoma; color:#2895c0;} + +.boardList th { color:#3e3f3e; font-weight:normal; border-bottom:1px solid #ffffff; padding:.5em .5em .3em .5em; background:#ffffff url(../images/cyan/lineBoardListTh.gif) no-repeat left bottom;white-space:nowrap; height:33px;} +.boardList td.recommend { font:bold .8em Tahoma; color:#2895c0; text-align:center;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#2895c0; cursor:default; position:relative; top:-.2em;} +.boardList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#2895c0; cursor:default; position:relative; top:.3em;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; _position:relative; _top:3px; background:url(../images/cyan/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} + +.boardRead .replyAndTrackback { overflow:hidden; _width:100%; height:30px; background:url(../images/cyan/bgBoardListTh.gif) repeat-x left 0px; border-top:1px solid #e0e1db; border-bottom:2px solid #666760;} +.boardRead .replyAndTrackback a strong { color:#2895c0;} +.boardRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; background:url(../images/cyan/iconFile.gif) no-repeat left top;} + + + +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 11px Tahoma; color:#2895c0; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + diff --git a/modules/board/skins/xe_list/css/green.css b/modules/board/skins/xe_list/css/green.css new file mode 100644 index 000000000..3e54c636d --- /dev/null +++ b/modules/board/skins/xe_list/css/green.css @@ -0,0 +1,31 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +.articleNum { float:left; background:url(../images/green/iconArticle.gif) no-repeat left top; padding:0 0 0 1.5em; margin:.5em 0 0 10px;} +#reply li .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/green/iconFile.gif) no-repeat left;} +.boardRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; background:url(../images/green/iconFile.gif) no-repeat left top;} +.accountNavigation li.join a { display:block; background:url(../images/green/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/green/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} + +.boardList th { color:#3e3f3e; font-weight:normal; border-bottom:1px solid #ffffff; padding:.5em .5em .3em .5em; background:#ffffff url(../images/green/lineBoardListTh.gif) no-repeat left bottom;white-space:nowrap; height:33px;} + +.boardList td.recommend { font:bold .8em Tahoma; color:#38b549; text-align:center;} + +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 11px Tahoma; color:#38b549; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#38b549; cursor:default; position:relative; top:-.2em;} +.boardList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#ff6600; cursor:default; position:relative; top:.3em;} + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; border-top:1px solid #d1d9db; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} +.boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d0dbd1; border-bottom:3px solid #38b549; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.articleNum strong { font:bold 11px Tahoma; color:#ff6600;} + +.boardRead .replyAndTrackback { overflow:hidden; _width:100%; height:30px; background:url(../images/green/bgBoardListTh.gif) repeat-x left 0px; border-top:1px solid #e0e1db; border-bottom:2px solid #666760;} +.boardRead .replyAndTrackback a strong { color:#38b549;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; _position:relative; _top:3px; background:url(../images/green/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} diff --git a/modules/board/skins/xe_list/css/purple.css b/modules/board/skins/xe_list/css/purple.css new file mode 100644 index 000000000..fb7fe1fd0 --- /dev/null +++ b/modules/board/skins/xe_list/css/purple.css @@ -0,0 +1,31 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +.articleNum { float:left; background:url(../images/purple/iconArticle.gif) no-repeat left top; padding:0 0 0 1.5em; margin:.5em 0 0 10px;} +#reply li .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/purple/iconFile.gif) no-repeat left;} +.boardRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; background:url(../images/purple/iconFile.gif) no-repeat left top;} +.accountNavigation li.join a { display:block; background:url(../images/purple/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/purple/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} + +.boardList th { color:#3e3f3e; font-weight:normal; border-bottom:1px solid #ffffff; padding:.5em .5em .3em .5em; background:#ffffff url(../images/purple/lineBoardListTh.gif) no-repeat left bottom;white-space:nowrap;height:33px;} + +.boardList td.recommend { font:bold .8em Tahoma; color:#b1ae00; text-align:center;} + +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 11px Tahoma; color:#b1ae00; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#b1ae00; cursor:default; position:relative; top:-.2em;} +.boardList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#b1ae00; cursor:default; position:relative; top:.3em;} + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; border-top:1px solid #d1d9db; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} +.boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d1d9db; border-bottom:3px solid #ac19a9; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.articleNum strong { font:bold 11px Tahoma; color:#b1ae00;} + +.boardRead .replyAndTrackback { overflow:hidden; _width:100%; height:30px; background:url(../images/purple/bgBoardListTh.gif) repeat-x left 0px; border-top:1px solid #e0e1db; border-bottom:2px solid #666760;} +.boardRead .replyAndTrackback a strong { color:#b1ae00;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; _position:relative; _top:3px; background:url(../images/purple/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} diff --git a/modules/board/skins/xe_list/css/red.css b/modules/board/skins/xe_list/css/red.css new file mode 100644 index 000000000..859aa0cd8 --- /dev/null +++ b/modules/board/skins/xe_list/css/red.css @@ -0,0 +1,31 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +.articleNum { float:left; background:url(../images/red/iconArticle.gif) no-repeat left top; padding:0 0 0 1.5em; margin:.5em 0 0 10px;} +#reply li .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/red/iconFile.gif) no-repeat left;} +.boardRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; background:url(../images/red/iconFile.gif) no-repeat left top;} +.accountNavigation li.join a { display:block; background:url(../images/red/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/red/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} + +.boardList th { color:#3e3f3e; font-weight:normal; border-bottom:1px solid #ffffff; padding:.5em .5em .3em .5em; background:#ffffff url(../images/red/lineBoardListTh.gif) no-repeat left bottom; white-space:nowrap; height:33px;} + +.boardList td.recommend { font:bold .8em Tahoma; color:#ff6600; text-align:center;} + +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 11px Tahoma; color:#ff6600; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#ff6600; cursor:default; position:relative; top:-.2em;} +.boardList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#ff6600; cursor:default; position:relative; top:.3em;} + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; border-top:1px solid #d1d9db; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} +.boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d1d9db; border-bottom:3px solid #ed135a; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.articleNum strong { font:bold 11px Tahoma; color:#ff6600;} + +.boardRead .replyAndTrackback { overflow:hidden; _width:100%; height:30px; background:url(../images/red/bgBoardListTh.gif) repeat-x left 0px; border-top:1px solid #e0e1db; border-bottom:2px solid #666760;} +.boardRead .replyAndTrackback a strong { color:#ff6600;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; _position:relative; _top:3px; background:url(../images/red/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} diff --git a/modules/board/skins/xe_list/css/white.css b/modules/board/skins/xe_list/css/white.css new file mode 100644 index 000000000..cba778ec9 --- /dev/null +++ b/modules/board/skins/xe_list/css/white.css @@ -0,0 +1,30 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +.articleNum { float:left; background:url(../images/white/iconArticle.gif) no-repeat left top; padding:0 0 0 1.5em; margin:.5em 0 0 10px;} +#reply li .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/white/iconFile.gif) no-repeat left;} +.boardRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; background:url(../images/white/iconFile.gif) no-repeat left top;} +.accountNavigation li.join a { display:block; background:url(../images/white/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/white/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.boardList th { color:#3e3f3e; font-weight:normal; border-bottom:1px solid #ffffff; padding:.5em .5em .3em .5em; background:#ffffff url(../images/white/lineBoardListTh.gif) no-repeat left bottom;white-space:nowrap; height:33px;} + +.boardList td.recommend { font:bold .8em Tahoma; color:#ff6600; text-align:center;} + +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 11px Tahoma; color:#ff6600; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#ff6600; position:relative; top:-.2em;} +.boardList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#ff6600; position:relative; top:.3em;} + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; border:1px solid #e1e1dd; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) repeat-x left bottom; overflow:hidden;} +.boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-bottom:3px solid #fe3614; background:#ffffff url(../images/common/lineH3.gif) no-repeat right bottom;} + +.articleNum strong { font:bold 11px Tahoma; color:#ff6600;} + +.boardRead .replyAndTrackback { overflow:hidden; height:30px; background:url(../images/white/bgBoardListTh.gif) repeat-x left 0px; border-top:1px solid #e0e1db; border-bottom:2px solid #666760;} +.boardRead .replyAndTrackback a strong { color:#ff6600;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; _position:relative; _top:3px; background:url(../images/white/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} diff --git a/modules/board/skins/xe_list/delete_comment_form.html b/modules/board/skins/xe_list/delete_comment_form.html new file mode 100644 index 000000000..984c3ac8e --- /dev/null +++ b/modules/board/skins/xe_list/delete_comment_form.html @@ -0,0 +1,24 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + + +
+
+ + diff --git a/modules/board/skins/xe_list/delete_form.html b/modules/board/skins/xe_list/delete_form.html new file mode 100644 index 000000000..1ca638c93 --- /dev/null +++ b/modules/board/skins/xe_list/delete_form.html @@ -0,0 +1,23 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + +
+
+ + diff --git a/modules/board/skins/xe_list/delete_trackback_form.html b/modules/board/skins/xe_list/delete_trackback_form.html new file mode 100644 index 000000000..f907b6793 --- /dev/null +++ b/modules/board/skins/xe_list/delete_trackback_form.html @@ -0,0 +1,25 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + + +
+
+ + + diff --git a/modules/board/skins/xe_list/extra_var_form.html b/modules/board/skins/xe_list/extra_var_form.html new file mode 100644 index 000000000..564cec9d9 --- /dev/null +++ b/modules/board/skins/xe_list/extra_var_form.html @@ -0,0 +1,65 @@ + + + + + {@ $val->default = explode(',',$val->default) } + + + +{@ $val->column_name = "extra_vars".$key} + + +{@ $val->value = $oDocument->getExtraValue($key)} + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
  • value)&&in_array($v, $val->value))-->checked="checked"/> {$v}
  • + +
+ + + + + + + + + +
{zdate($val->value,"Y-m-d")}
+ {$lang->cmd_open_calendar} + + + +

{$val->desc}

+ diff --git a/modules/board/skins/xe_list/extra_var_value.html b/modules/board/skins/xe_list/extra_var_value.html new file mode 100644 index 000000000..0d5b21657 --- /dev/null +++ b/modules/board/skins/xe_list/extra_var_value.html @@ -0,0 +1,57 @@ + + + +{@ $val->column_name = "extra_vars".$key} + + +{@ $val->value = $oDocument->getExtraValue($key)} + + + + {htmlspecialchars($val->value)} + + + + + {$val->value} + +   + + + + + + {$val->value} + +   + + + + + {htmlspecialchars($val->value[0])} + - + {htmlspecialchars($val->value[1])} + - + {htmlspecialchars($val->value[2])} + + + + {nl2br(htmlspecialchars($val->value))} + + + + + {@ $_tmp_value[] = htmlspecialchars($v)} + + {implode(",",$_tmp_value)} + + + + {htmlspecialchars($val->value)} + + + + {zdate($val->value,"Y-m-d")} + + +  diff --git a/modules/board/skins/xe_list/filter/delete_comment.xml b/modules/board/skins/xe_list/filter/delete_comment.xml new file mode 100644 index 000000000..115ea00d9 --- /dev/null +++ b/modules/board/skins/xe_list/filter/delete_comment.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_list/filter/delete_document.xml b/modules/board/skins/xe_list/filter/delete_document.xml new file mode 100644 index 000000000..7627f5a63 --- /dev/null +++ b/modules/board/skins/xe_list/filter/delete_document.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_list/filter/delete_trackback.xml b/modules/board/skins/xe_list/filter/delete_trackback.xml new file mode 100644 index 000000000..2140675f8 --- /dev/null +++ b/modules/board/skins/xe_list/filter/delete_trackback.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_list/filter/input_password.xml b/modules/board/skins/xe_list/filter/input_password.xml new file mode 100644 index 000000000..55cb6d8e0 --- /dev/null +++ b/modules/board/skins/xe_list/filter/input_password.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_list/filter/insert.xml b/modules/board/skins/xe_list/filter/insert.xml new file mode 100644 index 000000000..85d1ed4ce --- /dev/null +++ b/modules/board/skins/xe_list/filter/insert.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_list/filter/insert_comment.xml b/modules/board/skins/xe_list/filter/insert_comment.xml new file mode 100644 index 000000000..ba2216c8a --- /dev/null +++ b/modules/board/skins/xe_list/filter/insert_comment.xml @@ -0,0 +1,28 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_list/filter/search.xml b/modules/board/skins/xe_list/filter/search.xml new file mode 100644 index 000000000..6c85e1254 --- /dev/null +++ b/modules/board/skins/xe_list/filter/search.xml @@ -0,0 +1,15 @@ + +
+ + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_list/filter/vote.xml b/modules/board/skins/xe_list/filter/vote.xml new file mode 100644 index 000000000..0870a7551 --- /dev/null +++ b/modules/board/skins/xe_list/filter/vote.xml @@ -0,0 +1,13 @@ + +
+ + + + + + + + + + +
diff --git a/modules/board/skins/xe_list/footer.html b/modules/board/skins/xe_list/footer.html new file mode 100644 index 000000000..c6171637a --- /dev/null +++ b/modules/board/skins/xe_list/footer.html @@ -0,0 +1,2 @@ + +{$module_info->footer_text} diff --git a/modules/board/skins/xe_list/header.html b/modules/board/skins/xe_list/header.html new file mode 100644 index 000000000..e1c10336d --- /dev/null +++ b/modules/board/skins/xe_list/header.html @@ -0,0 +1,83 @@ + + + + + + {@$module_info->colorset = "white"} + + + + + + + + + + + + +{$module_info->header_text} + + + +
+

{$module_info->title} - {$module_info->sub_title}

+
+ + + + +
{$module_info->comment}
+ + + +
+ + + + {$lang->document_count} {number_format($total_count)} + + + + +
diff --git a/modules/board/skins/xe_list/images/blank.gif b/modules/board/skins/xe_list/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/modules/board/skins/xe_list/images/blank.gif differ diff --git a/modules/board/skins/xe_list/images/common/bgBoardEditorOption.gif b/modules/board/skins/xe_list/images/common/bgBoardEditorOption.gif new file mode 100644 index 000000000..559588af6 Binary files /dev/null and b/modules/board/skins/xe_list/images/common/bgBoardEditorOption.gif differ diff --git a/modules/board/skins/xe_list/images/common/bgEditorFileList.gif b/modules/board/skins/xe_list/images/common/bgEditorFileList.gif new file mode 100644 index 000000000..e5050341c Binary files /dev/null and b/modules/board/skins/xe_list/images/common/bgEditorFileList.gif differ diff --git a/modules/board/skins/xe_list/images/common/bgH3.gif b/modules/board/skins/xe_list/images/common/bgH3.gif new file mode 100644 index 000000000..0d07bb456 Binary files /dev/null and b/modules/board/skins/xe_list/images/common/bgH3.gif differ diff --git a/modules/board/skins/xe_list/images/common/bottomGotoFirst.gif b/modules/board/skins/xe_list/images/common/bottomGotoFirst.gif new file mode 100644 index 000000000..e0297fecb Binary files /dev/null and b/modules/board/skins/xe_list/images/common/bottomGotoFirst.gif differ diff --git a/modules/board/skins/xe_list/images/common/bottomGotoLast.gif b/modules/board/skins/xe_list/images/common/bottomGotoLast.gif new file mode 100644 index 000000000..0a7141d0d Binary files /dev/null and b/modules/board/skins/xe_list/images/common/bottomGotoLast.gif differ diff --git a/modules/board/skins/xe_list/images/common/bullet_3x3_d8d8d8.gif b/modules/board/skins/xe_list/images/common/bullet_3x3_d8d8d8.gif new file mode 100644 index 000000000..c1f245227 Binary files /dev/null and b/modules/board/skins/xe_list/images/common/bullet_3x3_d8d8d8.gif differ diff --git a/modules/board/skins/xe_list/images/common/buttonAscending.gif b/modules/board/skins/xe_list/images/common/buttonAscending.gif new file mode 100644 index 000000000..b405cc323 Binary files /dev/null and b/modules/board/skins/xe_list/images/common/buttonAscending.gif differ diff --git a/modules/board/skins/xe_list/images/common/buttonClose.gif b/modules/board/skins/xe_list/images/common/buttonClose.gif new file mode 100644 index 000000000..12cd8aaa9 Binary files /dev/null and b/modules/board/skins/xe_list/images/common/buttonClose.gif differ diff --git a/modules/board/skins/xe_list/images/common/buttonDeleteX.gif b/modules/board/skins/xe_list/images/common/buttonDeleteX.gif new file mode 100644 index 000000000..c066e49be Binary files /dev/null and b/modules/board/skins/xe_list/images/common/buttonDeleteX.gif differ diff --git a/modules/board/skins/xe_list/images/common/buttonDescending.gif b/modules/board/skins/xe_list/images/common/buttonDescending.gif new file mode 100644 index 000000000..2dc5575ff Binary files /dev/null and b/modules/board/skins/xe_list/images/common/buttonDescending.gif differ diff --git a/modules/board/skins/xe_list/images/common/buttonHelp.gif b/modules/board/skins/xe_list/images/common/buttonHelp.gif new file mode 100644 index 000000000..ca7a23a9f Binary files /dev/null and b/modules/board/skins/xe_list/images/common/buttonHelp.gif differ diff --git a/modules/board/skins/xe_list/images/common/buttonTextAreaDrag.gif b/modules/board/skins/xe_list/images/common/buttonTextAreaDrag.gif new file mode 100644 index 000000000..148e9ee10 Binary files /dev/null and b/modules/board/skins/xe_list/images/common/buttonTextAreaDrag.gif differ diff --git a/modules/board/skins/xe_list/images/common/buttonToggleReply.gif b/modules/board/skins/xe_list/images/common/buttonToggleReply.gif new file mode 100644 index 000000000..ba3609980 Binary files /dev/null and b/modules/board/skins/xe_list/images/common/buttonToggleReply.gif differ diff --git a/modules/board/skins/xe_list/images/common/buttonTypeInput24.gif b/modules/board/skins/xe_list/images/common/buttonTypeInput24.gif new file mode 100644 index 000000000..0dcfc0e3d Binary files /dev/null and b/modules/board/skins/xe_list/images/common/buttonTypeInput24.gif differ diff --git a/modules/board/skins/xe_list/images/common/iconAdmin.gif b/modules/board/skins/xe_list/images/common/iconAdmin.gif new file mode 100644 index 000000000..4a581a524 Binary files /dev/null and b/modules/board/skins/xe_list/images/common/iconAdmin.gif differ diff --git a/modules/board/skins/xe_list/images/common/iconArrowD8.gif b/modules/board/skins/xe_list/images/common/iconArrowD8.gif new file mode 100644 index 000000000..fe3143edc Binary files /dev/null and b/modules/board/skins/xe_list/images/common/iconArrowD8.gif differ diff --git a/modules/board/skins/xe_list/images/common/iconCheck.gif b/modules/board/skins/xe_list/images/common/iconCheck.gif new file mode 100644 index 000000000..c4fb37ae0 Binary files /dev/null and b/modules/board/skins/xe_list/images/common/iconCheck.gif differ diff --git a/modules/board/skins/xe_list/images/common/iconNotice.gif b/modules/board/skins/xe_list/images/common/iconNotice.gif new file mode 100644 index 000000000..d32027496 Binary files /dev/null and b/modules/board/skins/xe_list/images/common/iconNotice.gif differ diff --git a/modules/board/skins/xe_list/images/common/iconReply.gif b/modules/board/skins/xe_list/images/common/iconReply.gif new file mode 100644 index 000000000..a6d4ea112 Binary files /dev/null and b/modules/board/skins/xe_list/images/common/iconReply.gif differ diff --git a/modules/board/skins/xe_list/images/common/iconReplyArrow.gif b/modules/board/skins/xe_list/images/common/iconReplyArrow.gif new file mode 100644 index 000000000..d1a21a040 Binary files /dev/null and b/modules/board/skins/xe_list/images/common/iconReplyArrow.gif differ diff --git a/modules/board/skins/xe_list/images/common/iconRss.gif b/modules/board/skins/xe_list/images/common/iconRss.gif new file mode 100644 index 000000000..f495b3ebc Binary files /dev/null and b/modules/board/skins/xe_list/images/common/iconRss.gif differ diff --git a/modules/board/skins/xe_list/images/common/iconSetup.gif b/modules/board/skins/xe_list/images/common/iconSetup.gif new file mode 100644 index 000000000..33b41da11 Binary files /dev/null and b/modules/board/skins/xe_list/images/common/iconSetup.gif differ diff --git a/modules/board/skins/xe_list/images/common/iconTag.gif b/modules/board/skins/xe_list/images/common/iconTag.gif new file mode 100644 index 000000000..ecfdb5585 Binary files /dev/null and b/modules/board/skins/xe_list/images/common/iconTag.gif differ diff --git a/modules/board/skins/xe_list/images/common/iconTrackback.gif b/modules/board/skins/xe_list/images/common/iconTrackback.gif new file mode 100644 index 000000000..1c83bcadd Binary files /dev/null and b/modules/board/skins/xe_list/images/common/iconTrackback.gif differ diff --git a/modules/board/skins/xe_list/images/common/lineH3.gif b/modules/board/skins/xe_list/images/common/lineH3.gif new file mode 100644 index 000000000..fe42fe378 Binary files /dev/null and b/modules/board/skins/xe_list/images/common/lineH3.gif differ diff --git a/modules/board/skins/xe_list/images/common/lineTextAreaDrag.gif b/modules/board/skins/xe_list/images/common/lineTextAreaDrag.gif new file mode 100644 index 000000000..3df035047 Binary files /dev/null and b/modules/board/skins/xe_list/images/common/lineTextAreaDrag.gif differ diff --git a/modules/board/skins/xe_list/images/common/line_1x10_e0e0e0.gif b/modules/board/skins/xe_list/images/common/line_1x10_e0e0e0.gif new file mode 100644 index 000000000..6a848dd58 Binary files /dev/null and b/modules/board/skins/xe_list/images/common/line_1x10_e0e0e0.gif differ diff --git a/modules/board/skins/xe_list/images/cyan/bgBoardListTh.gif b/modules/board/skins/xe_list/images/cyan/bgBoardListTh.gif new file mode 100644 index 000000000..aebba7b59 Binary files /dev/null and b/modules/board/skins/xe_list/images/cyan/bgBoardListTh.gif differ diff --git a/modules/board/skins/xe_list/images/cyan/buttonModifyE.gif b/modules/board/skins/xe_list/images/cyan/buttonModifyE.gif new file mode 100644 index 000000000..a1d4340d3 Binary files /dev/null and b/modules/board/skins/xe_list/images/cyan/buttonModifyE.gif differ diff --git a/modules/board/skins/xe_list/images/cyan/buttonReply.gif b/modules/board/skins/xe_list/images/cyan/buttonReply.gif new file mode 100644 index 000000000..1baede5d0 Binary files /dev/null and b/modules/board/skins/xe_list/images/cyan/buttonReply.gif differ diff --git a/modules/board/skins/xe_list/images/cyan/buttonTypeInput24.gif b/modules/board/skins/xe_list/images/cyan/buttonTypeInput24.gif new file mode 100644 index 000000000..7a341a96b Binary files /dev/null and b/modules/board/skins/xe_list/images/cyan/buttonTypeInput24.gif differ diff --git a/modules/board/skins/xe_list/images/cyan/iconArticle.gif b/modules/board/skins/xe_list/images/cyan/iconArticle.gif new file mode 100644 index 000000000..bce58cfe8 Binary files /dev/null and b/modules/board/skins/xe_list/images/cyan/iconArticle.gif differ diff --git a/modules/board/skins/xe_list/images/cyan/iconFile.gif b/modules/board/skins/xe_list/images/cyan/iconFile.gif new file mode 100644 index 000000000..83ad10665 Binary files /dev/null and b/modules/board/skins/xe_list/images/cyan/iconFile.gif differ diff --git a/modules/board/skins/xe_list/images/cyan/iconList.gif b/modules/board/skins/xe_list/images/cyan/iconList.gif new file mode 100644 index 000000000..d41737669 Binary files /dev/null and b/modules/board/skins/xe_list/images/cyan/iconList.gif differ diff --git a/modules/board/skins/xe_list/images/cyan/iconMyInfo.gif b/modules/board/skins/xe_list/images/cyan/iconMyInfo.gif new file mode 100644 index 000000000..1ba5a947e Binary files /dev/null and b/modules/board/skins/xe_list/images/cyan/iconMyInfo.gif differ diff --git a/modules/board/skins/xe_list/images/cyan/iconWrite.gif b/modules/board/skins/xe_list/images/cyan/iconWrite.gif new file mode 100644 index 000000000..9319f7e9b Binary files /dev/null and b/modules/board/skins/xe_list/images/cyan/iconWrite.gif differ diff --git a/modules/board/skins/xe_list/images/cyan/lineBoardListTh.gif b/modules/board/skins/xe_list/images/cyan/lineBoardListTh.gif new file mode 100644 index 000000000..b26bf737c Binary files /dev/null and b/modules/board/skins/xe_list/images/cyan/lineBoardListTh.gif differ diff --git a/modules/board/skins/xe_list/images/green/bgBoardListTh.gif b/modules/board/skins/xe_list/images/green/bgBoardListTh.gif new file mode 100644 index 000000000..ae25c2d82 Binary files /dev/null and b/modules/board/skins/xe_list/images/green/bgBoardListTh.gif differ diff --git a/modules/board/skins/xe_list/images/green/buttonModifyE.gif b/modules/board/skins/xe_list/images/green/buttonModifyE.gif new file mode 100644 index 000000000..6a4ade1a5 Binary files /dev/null and b/modules/board/skins/xe_list/images/green/buttonModifyE.gif differ diff --git a/modules/board/skins/xe_list/images/green/buttonReply.gif b/modules/board/skins/xe_list/images/green/buttonReply.gif new file mode 100644 index 000000000..e142d4263 Binary files /dev/null and b/modules/board/skins/xe_list/images/green/buttonReply.gif differ diff --git a/modules/board/skins/xe_list/images/green/buttonTypeInput24.gif b/modules/board/skins/xe_list/images/green/buttonTypeInput24.gif new file mode 100644 index 000000000..3e01072b9 Binary files /dev/null and b/modules/board/skins/xe_list/images/green/buttonTypeInput24.gif differ diff --git a/modules/board/skins/xe_list/images/green/iconArticle.gif b/modules/board/skins/xe_list/images/green/iconArticle.gif new file mode 100644 index 000000000..a27236ef2 Binary files /dev/null and b/modules/board/skins/xe_list/images/green/iconArticle.gif differ diff --git a/modules/board/skins/xe_list/images/green/iconFile.gif b/modules/board/skins/xe_list/images/green/iconFile.gif new file mode 100644 index 000000000..2040f4fcb Binary files /dev/null and b/modules/board/skins/xe_list/images/green/iconFile.gif differ diff --git a/modules/board/skins/xe_list/images/green/iconList.gif b/modules/board/skins/xe_list/images/green/iconList.gif new file mode 100644 index 000000000..2e67636f5 Binary files /dev/null and b/modules/board/skins/xe_list/images/green/iconList.gif differ diff --git a/modules/board/skins/xe_list/images/green/iconMyInfo.gif b/modules/board/skins/xe_list/images/green/iconMyInfo.gif new file mode 100644 index 000000000..b67f29733 Binary files /dev/null and b/modules/board/skins/xe_list/images/green/iconMyInfo.gif differ diff --git a/modules/board/skins/xe_list/images/green/iconWrite.gif b/modules/board/skins/xe_list/images/green/iconWrite.gif new file mode 100644 index 000000000..2c9832e36 Binary files /dev/null and b/modules/board/skins/xe_list/images/green/iconWrite.gif differ diff --git a/modules/board/skins/xe_list/images/green/lineBoardListTh.gif b/modules/board/skins/xe_list/images/green/lineBoardListTh.gif new file mode 100644 index 000000000..282297cf8 Binary files /dev/null and b/modules/board/skins/xe_list/images/green/lineBoardListTh.gif differ diff --git a/modules/board/skins/xe_list/images/purple/bgBoardListTh.gif b/modules/board/skins/xe_list/images/purple/bgBoardListTh.gif new file mode 100644 index 000000000..ae25c2d82 Binary files /dev/null and b/modules/board/skins/xe_list/images/purple/bgBoardListTh.gif differ diff --git a/modules/board/skins/xe_list/images/purple/buttonModifyE.gif b/modules/board/skins/xe_list/images/purple/buttonModifyE.gif new file mode 100644 index 000000000..a1d4340d3 Binary files /dev/null and b/modules/board/skins/xe_list/images/purple/buttonModifyE.gif differ diff --git a/modules/board/skins/xe_list/images/purple/buttonReply.gif b/modules/board/skins/xe_list/images/purple/buttonReply.gif new file mode 100644 index 000000000..600534865 Binary files /dev/null and b/modules/board/skins/xe_list/images/purple/buttonReply.gif differ diff --git a/modules/board/skins/xe_list/images/purple/buttonTypeInput24.gif b/modules/board/skins/xe_list/images/purple/buttonTypeInput24.gif new file mode 100644 index 000000000..0dcfc0e3d Binary files /dev/null and b/modules/board/skins/xe_list/images/purple/buttonTypeInput24.gif differ diff --git a/modules/board/skins/xe_list/images/purple/iconArticle.gif b/modules/board/skins/xe_list/images/purple/iconArticle.gif new file mode 100644 index 000000000..59c1c8019 Binary files /dev/null and b/modules/board/skins/xe_list/images/purple/iconArticle.gif differ diff --git a/modules/board/skins/xe_list/images/purple/iconFile.gif b/modules/board/skins/xe_list/images/purple/iconFile.gif new file mode 100644 index 000000000..c39a49aa0 Binary files /dev/null and b/modules/board/skins/xe_list/images/purple/iconFile.gif differ diff --git a/modules/board/skins/xe_list/images/purple/iconList.gif b/modules/board/skins/xe_list/images/purple/iconList.gif new file mode 100644 index 000000000..2e67636f5 Binary files /dev/null and b/modules/board/skins/xe_list/images/purple/iconList.gif differ diff --git a/modules/board/skins/xe_list/images/purple/iconMyInfo.gif b/modules/board/skins/xe_list/images/purple/iconMyInfo.gif new file mode 100644 index 000000000..af4545bfa Binary files /dev/null and b/modules/board/skins/xe_list/images/purple/iconMyInfo.gif differ diff --git a/modules/board/skins/xe_list/images/purple/iconWrite.gif b/modules/board/skins/xe_list/images/purple/iconWrite.gif new file mode 100644 index 000000000..f18cb5e9e Binary files /dev/null and b/modules/board/skins/xe_list/images/purple/iconWrite.gif differ diff --git a/modules/board/skins/xe_list/images/purple/lineBoardListTh.gif b/modules/board/skins/xe_list/images/purple/lineBoardListTh.gif new file mode 100644 index 000000000..6c74832c3 Binary files /dev/null and b/modules/board/skins/xe_list/images/purple/lineBoardListTh.gif differ diff --git a/modules/board/skins/xe_list/images/red/bgBoardListTh.gif b/modules/board/skins/xe_list/images/red/bgBoardListTh.gif new file mode 100644 index 000000000..ae25c2d82 Binary files /dev/null and b/modules/board/skins/xe_list/images/red/bgBoardListTh.gif differ diff --git a/modules/board/skins/xe_list/images/red/buttonModifyE.gif b/modules/board/skins/xe_list/images/red/buttonModifyE.gif new file mode 100644 index 000000000..974552d54 Binary files /dev/null and b/modules/board/skins/xe_list/images/red/buttonModifyE.gif differ diff --git a/modules/board/skins/xe_list/images/red/buttonReply.gif b/modules/board/skins/xe_list/images/red/buttonReply.gif new file mode 100644 index 000000000..b9472e1bc Binary files /dev/null and b/modules/board/skins/xe_list/images/red/buttonReply.gif differ diff --git a/modules/board/skins/xe_list/images/red/buttonTypeInput24.gif b/modules/board/skins/xe_list/images/red/buttonTypeInput24.gif new file mode 100644 index 000000000..2ae80ed23 Binary files /dev/null and b/modules/board/skins/xe_list/images/red/buttonTypeInput24.gif differ diff --git a/modules/board/skins/xe_list/images/red/iconArticle.gif b/modules/board/skins/xe_list/images/red/iconArticle.gif new file mode 100644 index 000000000..5cd05be62 Binary files /dev/null and b/modules/board/skins/xe_list/images/red/iconArticle.gif differ diff --git a/modules/board/skins/xe_list/images/red/iconFile.gif b/modules/board/skins/xe_list/images/red/iconFile.gif new file mode 100644 index 000000000..ee0dd83c7 Binary files /dev/null and b/modules/board/skins/xe_list/images/red/iconFile.gif differ diff --git a/modules/board/skins/xe_list/images/red/iconList.gif b/modules/board/skins/xe_list/images/red/iconList.gif new file mode 100644 index 000000000..2e67636f5 Binary files /dev/null and b/modules/board/skins/xe_list/images/red/iconList.gif differ diff --git a/modules/board/skins/xe_list/images/red/iconMyInfo.gif b/modules/board/skins/xe_list/images/red/iconMyInfo.gif new file mode 100644 index 000000000..b48e1fcd2 Binary files /dev/null and b/modules/board/skins/xe_list/images/red/iconMyInfo.gif differ diff --git a/modules/board/skins/xe_list/images/red/iconWrite.gif b/modules/board/skins/xe_list/images/red/iconWrite.gif new file mode 100644 index 000000000..2caff746f Binary files /dev/null and b/modules/board/skins/xe_list/images/red/iconWrite.gif differ diff --git a/modules/board/skins/xe_list/images/red/lineBoardListTh.gif b/modules/board/skins/xe_list/images/red/lineBoardListTh.gif new file mode 100644 index 000000000..ee37cb8df Binary files /dev/null and b/modules/board/skins/xe_list/images/red/lineBoardListTh.gif differ diff --git a/modules/board/skins/xe_list/images/white/bgBoardListTh.gif b/modules/board/skins/xe_list/images/white/bgBoardListTh.gif new file mode 100644 index 000000000..ae25c2d82 Binary files /dev/null and b/modules/board/skins/xe_list/images/white/bgBoardListTh.gif differ diff --git a/modules/board/skins/xe_list/images/white/buttonModifyE.gif b/modules/board/skins/xe_list/images/white/buttonModifyE.gif new file mode 100644 index 000000000..1cde1b60f Binary files /dev/null and b/modules/board/skins/xe_list/images/white/buttonModifyE.gif differ diff --git a/modules/board/skins/xe_list/images/white/buttonReply.gif b/modules/board/skins/xe_list/images/white/buttonReply.gif new file mode 100644 index 000000000..600534865 Binary files /dev/null and b/modules/board/skins/xe_list/images/white/buttonReply.gif differ diff --git a/modules/board/skins/xe_list/images/white/buttonTypeInput24.gif b/modules/board/skins/xe_list/images/white/buttonTypeInput24.gif new file mode 100644 index 000000000..0dcfc0e3d Binary files /dev/null and b/modules/board/skins/xe_list/images/white/buttonTypeInput24.gif differ diff --git a/modules/board/skins/xe_list/images/white/iconArticle.gif b/modules/board/skins/xe_list/images/white/iconArticle.gif new file mode 100644 index 000000000..59c1c8019 Binary files /dev/null and b/modules/board/skins/xe_list/images/white/iconArticle.gif differ diff --git a/modules/board/skins/xe_list/images/white/iconFile.gif b/modules/board/skins/xe_list/images/white/iconFile.gif new file mode 100644 index 000000000..c39a49aa0 Binary files /dev/null and b/modules/board/skins/xe_list/images/white/iconFile.gif differ diff --git a/modules/board/skins/xe_list/images/white/iconList.gif b/modules/board/skins/xe_list/images/white/iconList.gif new file mode 100644 index 000000000..1c83bcadd Binary files /dev/null and b/modules/board/skins/xe_list/images/white/iconList.gif differ diff --git a/modules/board/skins/xe_list/images/white/iconMyInfo.gif b/modules/board/skins/xe_list/images/white/iconMyInfo.gif new file mode 100644 index 000000000..af4545bfa Binary files /dev/null and b/modules/board/skins/xe_list/images/white/iconMyInfo.gif differ diff --git a/modules/board/skins/xe_list/images/white/iconWrite.gif b/modules/board/skins/xe_list/images/white/iconWrite.gif new file mode 100644 index 000000000..f18cb5e9e Binary files /dev/null and b/modules/board/skins/xe_list/images/white/iconWrite.gif differ diff --git a/modules/board/skins/xe_list/images/white/lineBoardListTh.gif b/modules/board/skins/xe_list/images/white/lineBoardListTh.gif new file mode 100644 index 000000000..6d891d82c Binary files /dev/null and b/modules/board/skins/xe_list/images/white/lineBoardListTh.gif differ diff --git a/modules/board/skins/xe_list/input_password_form.html b/modules/board/skins/xe_list/input_password_form.html new file mode 100644 index 000000000..985f1ffd5 --- /dev/null +++ b/modules/board/skins/xe_list/input_password_form.html @@ -0,0 +1,27 @@ + + + +
+ +
+

{$lang->msg_input_password}

+
+ +
+ + + + + + + +
+ +
+ + + diff --git a/modules/board/skins/xe_list/js/board.js b/modules/board/skins/xe_list/js/board.js new file mode 100644 index 000000000..7611a063d --- /dev/null +++ b/modules/board/skins/xe_list/js/board.js @@ -0,0 +1,137 @@ +/** + * @file modules/board/js/board.js + * @author zero (zero@nzeo.com) + * @brief board 모듈의 javascript + **/ + +/* 관리자가 카트 선택시 세션에 넣음 */ +function doAddCart(mid, obj) { + var srl = obj.value; + var check_flag = obj.checked?'add':'remove'; + + var params = new Array(); + params["mid"] = mid; + params["srl"] = srl; + params["check_flag"] = check_flag; + + exec_xml("board","procBoardAdminAddCart", params, null); +} + +/* 글쓰기 작성후 */ +function completeDocumentInserted(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var category_srl = ret_obj['category_srl']; + + alert(message); + + var url = current_url.setQuery('mid',mid).setQuery('document_srl',document_srl).setQuery('act',''); + if(category_srl) url = url.setQuery('category',category_srl); + location.href = url; +} + +/* 글 삭제 */ +function completeDeleteDocument(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var page = ret_obj['page']; + + var url = "./?mid="+mid; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 검색 실행 */ +function completeSearch(fo_obj, params) { + fo_obj.submit(); +} + +/* 추천, 추천은 별도의 폼입력이 필요 없어 직접 필터 사용 */ +function doVote() { + var fo_obj = document.getElementById('fo_document_info'); + procFilter(fo_obj, vote); +} + +function completeVote(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + alert(message); + location.href = location.href; +} + +// 현재 페이지 reload +function completeReload(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + location.href = location.href; +} + +/* 댓글 글쓰기 작성후 */ +function completeInsertComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var comment_srl = ret_obj['comment_srl']; + + var url = "./?mid="+mid+"&document_srl="+document_srl; + if(comment_srl) url += "#comment_"+comment_srl; + + alert(message); + + location.href = url; +} + +/* 댓글 삭제 */ +function completeDeleteComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 트랙백 삭제 */ +function completeDeleteTrackback(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 카테고리 이동 */ +function doChangeCategory() { + var sel_obj = xGetElementById("board_category"); + var sel_idx = sel_obj.selectedIndex; + var category_srl = sel_obj.options[sel_idx].value; + location.href = current_url.setQuery('category',category_srl); +} + +/* 스크랩 */ +function doScrap(document_srl) { + var params = new Array(); + params["document_srl"] = document_srl; + exec_xml("member","procMemberScrapDocument", params, null); +} diff --git a/modules/board/skins/xe_list/list.html b/modules/board/skins/xe_list/list.html new file mode 100644 index 000000000..c012e4e3b --- /dev/null +++ b/modules/board/skins/xe_list/list.html @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + {@ $order_icon = "buttonDescending.gif" } + {@ $order_type = "asc"; } + + {@ $order_icon = "buttonAscending.gif" } + {@ $order_type = "desc"; } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->no} + + +
+ + +
+ + {$lang->title} + +
{$lang->writer}{$lang->readed_count}{$lang->voted_count}{$lang->date}{$lang->last_update}
+ {$lang->no_documents} +
{$lang->notice}
{$no} + + document_srl])-->checked="checked" /> + + + + {$category_list[$document->get('category_srl')]->title} + + + + + + + + + {$document->getTitleText($module_info->subject_cut_size)} + + {$document->getTitleText($module_info->subject_cut_size)} + + + {$document->getTitleText($module_info->subject_cut_size)} + + + + {$document->getCommentCount()} + + + + {$document->getTrackbackCount()} + +
{$document->getNickName()}
{$document->get('readed_count')>0?$document->get('readed_count'):' '}{$document->get('voted_count')>0?$document->get('voted_count'):' '}{$document->getRegdate('Y-m-d')}{zdate($document->get('last_update'),'Y-m-d H:i')}
+ + +
+ + + + + + + + + + + + + + +
+ +
+
+ + + diff --git a/modules/board/skins/xe_list/message.html b/modules/board/skins/xe_list/message.html new file mode 100644 index 000000000..00bf01814 --- /dev/null +++ b/modules/board/skins/xe_list/message.html @@ -0,0 +1,11 @@ + + +
+ {$message} +
+ + + {$lang->cmd_login} + + + diff --git a/modules/board/skins/xe_list/screenshot/cyan.gif b/modules/board/skins/xe_list/screenshot/cyan.gif new file mode 100644 index 000000000..f779c57f0 Binary files /dev/null and b/modules/board/skins/xe_list/screenshot/cyan.gif differ diff --git a/modules/board/skins/xe_list/screenshot/green.gif b/modules/board/skins/xe_list/screenshot/green.gif new file mode 100644 index 000000000..0170d2700 Binary files /dev/null and b/modules/board/skins/xe_list/screenshot/green.gif differ diff --git a/modules/board/skins/xe_list/screenshot/purple.gif b/modules/board/skins/xe_list/screenshot/purple.gif new file mode 100644 index 000000000..5c623035e Binary files /dev/null and b/modules/board/skins/xe_list/screenshot/purple.gif differ diff --git a/modules/board/skins/xe_list/screenshot/red.gif b/modules/board/skins/xe_list/screenshot/red.gif new file mode 100644 index 000000000..03c63f3e7 Binary files /dev/null and b/modules/board/skins/xe_list/screenshot/red.gif differ diff --git a/modules/board/skins/xe_list/screenshot/white.gif b/modules/board/skins/xe_list/screenshot/white.gif new file mode 100644 index 000000000..1c18a7f46 Binary files /dev/null and b/modules/board/skins/xe_list/screenshot/white.gif differ diff --git a/modules/board/skins/xe_list/skin.xml b/modules/board/skins/xe_list/skin.xml new file mode 100644 index 000000000..284b6947e --- /dev/null +++ b/modules/board/skins/xe_list/skin.xml @@ -0,0 +1,186 @@ + + + 제로보드XE 게시판 기본 스킨(목록형) + ゼロボードXE掲示板のデフォルトスキン(リストスタイル) + Zeroboard XE Board 基本皮肤(目录型) + ZeroboardXE Basic Board Skin (List Style) + + (주)NHN + (株)NHN + (株)NHN + NHN Corp + + 제로보드XE 게시판의 목록형 기본 스킨입니다. + 디자인 : 서기정 (http://blog.naver.com/addcozy) + HTML/CSS : 정찬명 (http://naradesign.net) + + + ゼロボードXE掲示板のリストスタイルのデフォルトスキンです。 + デザイン:ソギジョン (http://blog.naver.com/addcozy) + HTML/CSS:ジョンチャンミョン (http://naradesign.net) + + + zeroboard XE Board 目录型基本皮肤。 + 设计 : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Chan-Myung Jeong (http://naradesign.net) + + + This is the basic list style board skin of Zeroboard XE. + Design : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Chan-Myung Jeong (http://naradesign.net) + + + + + 하얀색(기본) + 白(デフォルト) + 白色(基本) + White (default) + + + 청록색 + 青緑 + 青绿色 + Cyan + + + 초록색 + + 绿色 + Green + + + 빨간색 + + 红色 + Red + + + 보라색 + + 紫色 + Purple + + + + + 정렬 대상 + ソート対象 + 排序对象 + Align Target + select + 등록된 순서 또는 변경된 순서로 정렬을 할 수 있습니다. + 登録された順、変更された順でソートできます。 + 可对主题按发表顺或最后更新顺进行排序。 + It can align articles as registered order or modified order. + newest + updated + + + 게시판 제목 + 掲示板タイトル + 版面标题 + Title of Board + 게시판의 제목을 적어주세요. + 掲示板タイトルを入力してください。 + 请输入版面标题。(留空为不显示) + Plase input the title of board. + + + 게시판 부제목 + 掲示板サブタイトル + 版面副标题 + Subtitle of Board + 게시판 제목 옆에 나타날 부제목을 적어주세요. + 掲示板タイトルの横表示されるサブタイトルを入力してください。 + 请输入显示在版面标题旁的副标题。(留空为不显示) + Please input the subtitle of board which will be displayed beside of board title. + + + 게시판 상세 설명 + 掲示板の説明 + 版面详细说明 + Description of Board + 게시판 제목 아래 표시될 설명을 입력하실 수 있습니다. + 掲示板タイトルの下に表示される説明文入力してください。 + 请输入显示在版面标题下的说明。(留空为不显示) + You may input description which will be displayed under the board title. + + + 제목 글자수 + タイトルの文字数 + 标题字数 + Length of Subject + 제목 글자수를 지정할 수 있습니다. (0또는 비워주시면 자르지 않습니다) + タイトルの文字数が指定できます(「0」または空欄の場合は、文字数を制限しません)。 + 可以指定标题字数。(0或留空为不限) + You may set length of title. (0 or blank value will not restrict the length) + + + 썸네일 표시 + サムネール表示 + 显示缩略图 + Show Thumbnail + 게시물에 이미지가 포함되어 있으면 목록에서 썸네일을 표시합니다. + 書き込みにイメージが添付されている場合、リストでサムネールを表示します。 + 文章包含图片时在目录列表显示缩略图。 + If article has images, it will show thumbnail on the list. + N + Y + + + 번호 표시 + 番号表示 + 显示编号 + Dispay Number + Y + N + + + + 글쓴이 표시 + 投稿者表示 + 显示昵称 + Display Author + Y + N + + + + 작성일 표시 + 作成日表示 + 显示发表日期 + Display Registered Date + Y + N + + + + 조회수 표시 + 照合数表示 + 显示查看数 + Display Hit + Y + N + + + + 추천수 표시 + 推薦数表示 + 显示推荐数 + Display Votes + Y + N + + + + 최근 변경시간 표시 + 最近の変更時間表示 + 显示最后更新时间 + Display Latest Update + N + Y + + + + diff --git a/modules/board/skins/xe_list/trackback.html b/modules/board/skins/xe_list/trackback.html new file mode 100644 index 000000000..5a565f328 --- /dev/null +++ b/modules/board/skins/xe_list/trackback.html @@ -0,0 +1,24 @@ + + + + + diff --git a/modules/board/skins/xe_list/view_document.html b/modules/board/skins/xe_list/view_document.html new file mode 100644 index 000000000..fc9ec9291 --- /dev/null +++ b/modules/board/skins/xe_list/view_document.html @@ -0,0 +1,134 @@ + + + +
+ + +
+ + +
+
+
+
+

{$oDocument->getTitleText()}

+ + |{$category_list[$oDocument->get('category_srl')]->title} + +
+ +
+ {$lang->readed_count}: + {$oDocument->get('readed_count')}, + + + {$lang->voted_count}: + {$oDocument->get('voted_count')}, + + + {$oDocument->getRegdate('Y.m.d')} {$oDocument->getRegdate('H:i:s')} + + + {$lang->cmd_modify} + {$lang->cmd_delete} + +
+
+
+ +
    +
  • {$lang->document_url} : {$oDocument->getPermanentUrl()}
  • + +
  • {$lang->trackback_url} : {$oDocument->getTrackbackUrl()}
  • + +
+ +
+
{$oDocument->getNickName()}
+ +
{$oDocument->get('ipaddress')}
+ +
+ + + + + + + + + + + + + +
{$val->name} + + +
+ + +
{$oDocument->getContent()}
+ +
+ {@ $tag_list = $oDocument->get('tag_list') } + +
+
{$lang->tag}
+ +
+ + + +
+
{$lang->uploaded_file} :
+ +
+
+ +
+
+ + +
+ + + + + + + + + + + + diff --git a/modules/board/skins/xe_list/write_form.html b/modules/board/skins/xe_list/write_form.html new file mode 100644 index 000000000..1cf0ea8c5 --- /dev/null +++ b/modules/board/skins/xe_list/write_form.html @@ -0,0 +1,115 @@ + + + +
+
fileupload)-->enctype="multipart/form-data" class="boardEditor" id="fo_write"> +
+ + + + + +
+ + + + + + + + + + + +
+ + +
+ + + + + + + +
+ +
+
{$lang->cmd_option}
+ +
+ isNotice())-->checked="checked" id="is_notice" /> + +
+
+ isLocked())-->checked="checked" id="lock_comment" /> + +
+ +
+ isSecret())-->checked="checked" id="is_secret" /> + +
+
+ allowComment())-->checked="checked" id="allow_comment" /> + +
+
+ allowTrackback())-->checked="checked" id="allow_trackback" /> + +
+ +
+ useNotify())-->checked="checked" id="notify_message" /> + +
+ +
+ +
{$editor}
+ +
+ + + +
+ +
+ + +

{$lang->about_tag}

+
+ + + +
+ + + +
+ + + +
+ + +
+
+ diff --git a/modules/board/skins/xe_webzine/comment.html b/modules/board/skins/xe_webzine/comment.html new file mode 100644 index 000000000..eba62e23d --- /dev/null +++ b/modules/board/skins/xe_webzine/comment.html @@ -0,0 +1,56 @@ + + + + + + + + diff --git a/modules/board/skins/xe_webzine/comment_form.html b/modules/board/skins/xe_webzine/comment_form.html new file mode 100644 index 000000000..f03e13bf3 --- /dev/null +++ b/modules/board/skins/xe_webzine/comment_form.html @@ -0,0 +1,72 @@ + + + + + + + + + +
    +
  • +
    {htmlspecialchars($source_comment->nick_name)}
    +
    + {zdate($source_comment->regdate, "Y.m.d H:i")} + + ({$source_comment->ipaddress}) + +
    + +
    + {$source_comment->content} +
    +
  • +
+ + + +
+ +
fileupload)-->enctype="multipart/form-data" class="boardEditor" id="fo_comment_write" > +
+ + + + + + + +
+ + + + + + + + + + + +
+ + +
class="borderTop">{$comment_editor}
+ +
+ +
+ + + + + +
+ + +
+
+ + + + diff --git a/modules/board/skins/xe_webzine/css/common.css b/modules/board/skins/xe_webzine/css/common.css new file mode 100644 index 000000000..c21f59c63 --- /dev/null +++ b/modules/board/skins/xe_webzine/css/common.css @@ -0,0 +1,266 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ +.gap1 { margin-top:.8em; } +.commentButton { margin:.8em 0 .8em 0; } + +/* pathNavigation */ +.pathNavigation { background:url(../images/common/bullet_3x3_d8d8d8.gif) no-repeat left .4em; padding:0 0 0 .5em; color:#999999; margin:0 0 1.5em 0;} +.pathNavigation * { font-size:.9em;} +.pathNavigation a { color:#999999;} +.pathNavigation strong { color:#666666;} + +/* boardComment */ +.boardComment { color:#AEAEAE; position:relative; border:1px solid #DDDDDD; overflow:hidden;padding:.8em; margin-top:.4em;} +.boardComment a { color:#f38d2a; text-decoration:none; border-bottom:1px dotted #f38d2a;} + +/* boardInformation */ +.boardInformation { width:100%; clear:both; margin:1em 0 .5em 0; overflow:hidden; color:#666666;} + +.accountNavigation { float:right; overflow:hidden;} +.accountNavigation li { float:left; padding:0 .5em 0 .6em; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left .4em; list-style:none;} +.accountNavigation li a { font-size:11px; white-space:nowrap; color:#666666; text-decoration:none;} +.accountNavigation li.rss { background:none; padding-top:.4em;} +.accountNavigation li.skin_info { padding-top:3px;} +.accountNavigation li.join { background:none; padding-top:.4em;} +.accountNavigation li.myInfo { padding-top:.4em; background:none;} +.accountNavigation li.admin { padding-top:.4em;} +.accountNavigation li.admin a { display:block; background:url(../images/common/iconAdmin.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.setup { padding-top:.4em;} +.accountNavigation li.setup a { display:block; background:url(../images/common/iconSetup.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.loginAndLogout { background:none; padding-left:0;} + +/* boardList */ +.boardList { width:100%; position:relative; border:1px solid #e0e1db; table-layout:fixed;} +.boardList tr.notice { background:#f8f8f8;} +.boardList tr.notice .num { font-size:.9em; font-weight:bold;} +.boardList tr.bg1 { background:#ffffff} +.boardList tr.bg2 { background:#fbfbfb;} +.boardList th a { color:#3e3f3e; text-decoration:none; } +.boardList th.num, +.boardList th.title, +.boardList th.category_title, +.boardList th.reading, +.boardList th.recommend, +.boardList th.author, +.boardList th.date { border-bottom:1px solid #e0e1db; padding:.5em;} + +.boardList th.num { background-position:-3px bottom; border-left:1px solid #ffffff; } +.boardList th.title { text-align:center; } +.boardList th.category_title { text-align:left; padding-left:10px;} +.boardList th.category_title select { vertical-align:middle; width:200px; } +.boardList th.reading { white-space:nowrap;} +.boardList th.recommend { white-space:nowrap;} +.boardList th.date { border-right:1px solid #ffffff;} +.boardList th .sort { padding:0 .2em; vertical-align:middle;} +.boardList td { border-bottom:1px solid #eff0ed; padding:.5em;} +.boardList td.num { font:.8em tahoma; color:#999999; padding:.5em 1em; text-align:center;} +.boardList tr.notice td.num { padding:.5em; white-space:nowrap;} +.boardList tr.notice td.notice { font-size:.9em; color:#999999; font-weight:bold; text-align:center;} +.boardList td.thumb { padding:8px; width:145px; table-layout:fixed; white-space:nowrap;} +.boardList td.thumb * { vertical-align:middle;} +.boardList td.title {padding-left:1em; } +.boardList td.title strong.category { font-size:1em; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat right 3px; padding-right:.5em; margin-right:.5em;} +.boardList td.title.bold { font-size:1.2em; font-weight:bold;} +.boardList td.title.bold a { position:relative; top:.3em;} +.boardList td.title * { vertical-align:middle;} +.boardList td.title, +.boardList td.title a { color:#444444; text-decoration:none;} +.boardList td.title a:visited { color:#777777;} +.boardList td.author { color:#333333; font-size:.95em; padding-left:1em;} +.boardList td.author a { font-size:1em; color:#333333;} +.boardList td.reading { font:.8em Tahoma; color:#999999; text-align:center;} +.boardList td.date { font:.8em Tahoma; color:#999999; text-align:center; white-space:nowrap;} +.boardList td.summary { border-top:none; vertical-align:top; color:#666666; line-height:1.25em; padding-left:20px;} +.boardList td.summary a { color:#666666; text-decoration:none; line-height:inherit;} +.boardList td.summary a:visited { color:#999999;} +.boardList td input { _margin:-3px;} +.boardList td .replyAndTrackback img.trackback { margin-bottom:-.1em;} +.boardList td .replyAndTrackback strong { font:bold 1em Tahoma;} + +.boardList td .thumbnailSmall { margin:0 .3em 0 .3em;} +.boardList td .thumbnailSmall img { border:1px solid #bcbdb6;} +.boardList td .thumbnailMedium img { border:1px solid #e0e1db; } + +.boardList.thumbnail { margin-top:-1px; border-bottom:none;} +.boardList.thumbnail td { border-top:none; border-bottom:1px solid #eff0ed; padding:1.5em 0 0 1.5em; overflow:hidden;} +.boardList.thumbnail div.cell { float:left; width:130px; margin:0 1.5em 0 0; padding-bottom:1.5em;} +.boardList.thumbnail div.cell img.thumb { padding:2px; border:1px solid #e0e1db; display:block; margin-bottom:1em;} +.boardList.thumbnail div.title { color:#444444; margin-bottom:.2em; padding-left:3px;} +.boardList.thumbnail div.title a { color:#444444;} +.boardList.thumbnail div.nameAndDate { font-size:.9em; color:#999999; margin-bottom:.2em; padding-left:3px;} +.boardList.thumbnail div.nameAndDate a { color:#999999;} +.boardList.thumbnail div.nameAndDate .date { font:.8em Tahoma; color:#999999;} +.boardList.thumbnail div.readAndRecommend { font-size:.9em; color:#666666; padding-left:3px;} +.boardList.thumbnail div.readAndRecommend .num { font:.8em Tahoma;} +.boardList.thumbnail div.readAndRecommend .vr { color:#dddddd;} +.boardList.thumbnail div.readAndRecommend strong.num { font:bold .8em Tahoma; color:#ff6600;} + +/* pageNavigation */ +.pageNavigation { display:block; padding:1.5em 0 2em 0; text-align:center; font:bold 11px Tahoma; } +.pageNavigation a { position:relative; margin-left:-4px; font:bold 1em Tahoma; color:#666666; display:inline-block; padding:1px 7px 2px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } +.pageNavigation a:hover { background:#F7F7F7; text-decoration:none; } +.pageNavigation a:visited { color:#999999;} +.pageNavigation a.goToFirst, +.pageNavigation a.goToLast { border:none; border-right:1px solid #ffffff; border-left:1px solid #ffffff; z-index:99; vertical-align:top; padding:0px 7px 4px 6px;} +.pageNavigation a.goToFirst img, +.pageNavigation a.goToLast img { display:inline-block; padding:2px 0; position:relative; top:2px; _top:1px;} + +/* extraVars list */ +.extraVarsList { width:100%; border:1px solid #e0e1db; clear:both; margin-bottom:1em;} +.extraVarsList tr.notice { background:#f8f8f8;} +.extraVarsList tr.notice .num { font-size:.9em; font-weight:bold;} +.extraVarsList tr.bg1 { background:#ffffff} +.extraVarsList tr.bg2 { background:#fbfbfb;} +.extraVarsList th { color:#3e3f3e; font-weight:bold; padding:.8em .5em .5em .5em; border-bottom:1px solid #eff0ed; border-right:1px solid #eff0ed;} +.extraVarsList td { border-bottom:1px solid #eff0ed; padding:.5em .5em .5em 1em;} + +/* boardSearch */ +.boardSearch { text-align:center; clear:both; width:100%;} +.boardSearch fieldset { border:none; display:inline; overflow:visible; position:relative; white-space:nowrap;} +.boardSearch fieldset legend { overflow:hidden; width:1px; height:1px; font-size:.001em;} +.boardSearch * { vertical-align:middle;} +.boardSearch select { float:left;_margin-top:3px; height:20px;} +.boardSearch input { float:left; margin:0 .3em; _margin-top:3px;background:#fbfbfb;} +*:first-child+html .boardSearch select { margin-top:3px; height:21px;} +*:first-child+html .boardSearch input { margin-top:3px; } +.searchButton ul { overflow:hidden;} +.searchButton li { float:left; margin-right:.3em; list-style:none;} + +/* boardRead */ +.boardRead { padding:0; margin:0; border:1px solid #e0e1db;} +.boardRead .originalContent { padding:2em 1.2em 2em 1.2em;} +.boardRead .readHeader { padding:0 0 .5em 0; margin-bottom:1em; border-bottom:1px solid #eff0ed; overflow:hidden;} + +.boardRead .titleAndCategory { float:left;} +.boardRead .titleAndCategory h4 { font-size:1.4em; display:inline; padding-left:.2em;} +.boardRead .titleAndCategory .vr { font-size:.9em; margin:0 .3em; color:#c5c7c0;} +.boardRead .titleAndCategory .cotegory { font-size:.9em; color:#999999; white-space:nowrap;} + +.boardRead .dateAndModify { float:right; white-space:nowrap; font-size:.8em; color:#999999; position:relative;} +.boardRead .dateAndModify strong { font-size:1em; font-family:Tahoma;} + +.boardRead ul.uri { overflow:hidden; margin:0 0 2em .3em; float:right; clear:left;} +.boardRead ul.uri li { font-size:8pt; color:#c5c7c0; } + +.boardRead .userInfo { float:left; white-space:nowrap;} +.boardRead .userInfo .author { padding:0 .3em 0 0; color:#3074a5; margin-right:.3em;} +.boardRead .userInfo .ipaddress { font-size:.9em; font-family:Tahoma; color:#888888; margin-right:.5em; } + +.boardRead .contentBody { width:100%; overflow:hidden; } +.boardRead .readBody { padding:0 .3em; color:#555555; overflow:hidden; margin-bottom:2em; clear:both; } +.boardRead .readBody p { margin:1em 0; line-height:1.5em;} +.boardRead .readBody .alignLeft { float:left; margin:0 1em 1em 0; } +.boardRead .readBody .alignRight { float:right; margin:0 0 1em 1em; } +.boardRead .readBody .valignCenter { vertical-align:middle;} +.boardRead .readBody .clearBoth { display:block; margin:0 0 1em 0;} +.boardRead .readFooter { padding:0 .3em;} +.boardRead .readFooter .tag { margin-bottom:1em;} +.boardRead .readFooter .tag h5 { display:inline; font-size:1em; margin-right:.5em;} +.boardRead .readFooter .tag ul, +.boardRead .readFooter .tag li { display:inline;} +.boardRead .readFooter .tag a { color:#444444;} +.boardRead .readFooter .tag .tagIcon { vertical-align:middle;} +.boardRead .readFooter .fileAttached { _width:99%; border:1px solid #eaeae7; overflow:hidden; background:#fbfbfb;} +.boardRead .readFooter .fileAttached h5 { font-weight:normal; color:#999999; float:left; font-size:1em; margin:.5em .5em 0 .5em; line-height:1.5em;} +.boardRead .readFooter .fileAttached ul { float:left; margin-top:.5em; padding-bottom:1em; } +.boardRead .readFooter .fileAttached li { display:inline; margin-right:.75em; line-height:1.5em;} +.boardRead .readFooter .fileAttached li a { text-decoration:none; color:#777777;} +.boardRead .readFooter .fileAttached li a:visited { color:#777777;} + +.boardRead .replyAndTrackbackBox { position:relative; _width:100%;} +.boardRead .replyAndTrackback li { margin-top:10px; _margin-top:8px; margin-left:1em; padding-left:1.4em; float:left; list-style:none;} + +.boardRead .replyAndTrackback li.reply { background:url(../images/common/iconReply.gif) no-repeat left top;} +.boardRead .replyAndTrackback li.reply a { position:relative; top:-.3em; _top:-.6em;} + +.boardRead .replyAndTrackback li.trackback { background:url(../images/common/iconTrackback.gif) no-repeat left top;} +.boardRead .replyAndTrackback li.trackback a { position:relative; top:-.3em; _top:0em;} + +.boardRead .replyAndTrackback a { color:#333333; white-space:nowrap; text-decoration:none;} +.boardRead .replyAndTrackback a#toggleReply { background:url(../images/common/buttonToggleReply.gif) no-repeat right top;} +.boardRead .replyAndTrackback a#toggleTrackback { background:url(../images/common/buttonToggleReply.gif) no-repeat right -13px;} + +.boardRead .replyAndTrackback .listButton { position:relative; right: 10px; top:-7px; _top:-6px; float:right;} + +#trackbacks { padding:.6em .6em; color:#666666; border:1px solid #e0e1db;;margin-top:.5em;} +#trackbacks li { padding:.6em .8em .6em .6em; line-height:1.25em; border-bottom:1px dotted #EEEEEE; list-style:none;} +#trackbacks p { display:inline; margin-bottom:1em;} +#trackbacks a { color:#666666; text-decoration:none;} +#trackbacks div { clear:both; } +#trackbacks address { display:block; padding:0 .3em 0 0; } +#trackbacks address a { font-size:.9em; color:#3074a5; margin-right:.3em; float:left;} +#trackbacks address .date { font:.8em Tahoma; color:#cccccc; float:right;} + +#reply { padding:.6em .6em; color:#666666; border:1px solid #e0e1db; margin-top:.5em;} +#reply li { padding:.6em .8em .6em .6em; line-height:1.25em; clear:both; border-bottom:1px dotted #EEEEEE; list-style:none;} +#reply p { display:inline; margin-bottom:1em;} +#reply .author { float:left; padding:0 .3em 0 0; font-size:.9em; color:#3074a5; margin:0 .3em .5em 0;} +#reply .author a { font-size:.9em; color:#3074a5; margin-right:.3em;} +#reply .date { float:right; font:.8em Tahoma; color:#cccccc; margin:.3em 0 .5em 0;} + +#reply .replyOption { float:right; white-space:nowrap; margin-left:.2em;} +#reply .replyOption img { vertical-align:middle;} + +#reply .replyContent { clear:left; } +#reply .reply { background-color:#FAFAFA;} +#reply .replyIndent { background:url(../images/common/iconReplyArrow.gif) no-repeat .0em .3em; padding-left:1.3em;} + +#reply li .fileAttached { _width:99%; border:1px solid #eaeae7; overflow:hidden; background:#fbfbfb; margin-top:.3em; list-style:none;} +#reply li .fileAttached ul { float:left; padding:.3em 1em .2em 0; margin-left:.5em; _margin-left:.25em;} +#reply li .fileAttached li a { font-size:.9em; white-space:nowrap; position:relative; color:#444444; } +#reply li .fileAttached li a:visited { color:#777777;} + +/* boardEditor */ +.boardEditor { padding:.5em 0 1em 0; width:100%; overflow:hidden;} +.boardEditor.reply { padding:.5em 1em 1em 1em; width:auto; overflow:hidden;} +.boardEditor legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em;} +.boardEditor fieldset { _width:100%; border:1px solid #eaeae7; border-top:none;} +.boardEditor .userNameAndPw { position:relative; background:#fbfbfb; border-top:1px solid #eaeae7; border-bottom:1px solid #e1e1e1; padding:.5em 1em; white-space:nowrap;} +.boardEditor .userNameAndPw * { vertical-align:middle;} +.boardEditor .userNameAndPw label { margin-right:.2em; color:#666760;} +.boardEditor .userNameAndPw input { color:#aaaaaa;} +.boardEditor .userNameAndPw .userName { width:6em; margin-right:.8em;} +.boardEditor .userNameAndPw .userPw { width:5em;} +.boardEditor .userNameAndPw .emailAddress { width:6em;} +.boardEditor .userNameAndPw .homePage { width:6em;} +.boardEditor .userNameAndPw .checkSecret { position:absolute; right:2em; top:.7em;} +.boardEditor .borderTop { border-top:1px solid #eaeae7; } + +/* boardWrite */ +.boardWrite { width:100%; position:relative;} +.boardWrite .userNameAndPw { margin-bottom:-1px;} +.boardWrite .boardEditor fieldset { width:auto; position:relative;} +.boardWrite div.title { border-bottom:1px solid #eff0ed; border-top:1px solid #eff0ed; padding:.5em 0; white-space:nowrap;} +.boardWrite div.title label.title { display:block; float:left; font-weight:bold; padding:.4em 0 0 1.5em; width:8em; white-space:nowrap;} +.boardWrite div.title input#title { width:60%;} +.boardWrite .option { border-bottom:1px solid #e1e1e1; padding:.5em 0; overflow:hidden; width:100%;} +.boardWrite .option dt { display:block; float:left; font-weight:bold; padding:.3em 0 0 1.5em; width:8em; white-space:nowrap;} +.boardWrite .option dd { float:left; margin-right:1em; padding-top:.2em; _padding-top:.1em;} +.boardWrite .option dd * { vertical-align:middle;} +.boardWrite .inputTypeText { background:#fbfbfb;} +.boardWrite .trackbackURI { clear:both; border-top:1px solid #eff0ed; padding:4px 0 .8em 0;} +.boardWrite .trackbackURI label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .trackbackURI .inputTypeText { width:50%;} +.boardWrite .tag { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;} +.boardWrite .tag label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .tag .inputTypeText { width:50%;} +.boardWrite .tag .help { vertical-align:middle;} +.boardWrite .tag .info { padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;} +.boardWrite .extra_vars { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;} +.boardWrite .extra_vars label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .extra_vars .info { clear:both; padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;} +.boardWrite .extra_vars ul li { float:left; margin-right:1em; } + +.smallBox { border:1px solid #e0e1db; margin:5em auto 1em auto;} +.smallBox.w268 { width:268px;} +.smallBox .header { position:relative; _width:100%; background:#ffffff url(../images/normal/bgH3.gif) no-repeat left bottom; overflow:hidden;} +.smallBox .header h3 { clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border-bottom:3px solid #fe3614; } +.smallBox .complex { padding:1.5em 2em 2em 2em;} +.smallBox .inputPassword { position:relative; border:none; padding:2em 2em 1.5em 2em;} +.smallBox .inputPassword .inputTypeText { float:left; margin-right:.5em; width:8em;} +.smallBox .inputPassword legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} + +*:first-child+html .buttonTypeGo { position:relative; top:3px; } diff --git a/modules/board/skins/xe_webzine/css/cyan.css b/modules/board/skins/xe_webzine/css/cyan.css new file mode 100644 index 000000000..d1f8116f8 --- /dev/null +++ b/modules/board/skins/xe_webzine/css/cyan.css @@ -0,0 +1,32 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; border-top:1px solid #d1d9db; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} +.boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d1d9db; border-bottom:3px solid #2895c0; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.accountNavigation li.join a { display:block; background:url(../images/cyan/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/cyan/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} + +.articleNum { float:left; background:url(../images/cyan/iconArticle.gif) no-repeat left top; padding:0 0 0 1.5em; margin:.5em 0 0 10px;} +#reply li .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/cyan/iconFile.gif) no-repeat left;} +.articleNum strong { font:bold 11px Tahoma; color:#2895c0;} + +.boardList th { color:#3e3f3e; font-weight:normal; border-bottom:1px solid #ffffff; padding:.5em .5em .3em .5em; background:#ffffff url(../images/cyan/lineBoardListTh.gif) no-repeat left bottom;white-space:nowrap; height:33px;} +.boardList td.recommend { font:bold .8em Tahoma; color:#2895c0; text-align:center;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#2895c0; cursor:default; position:relative; top:-.2em;} +.boardList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#2895c0; cursor:default; position:relative; top:.3em;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; _position:relative; _top:3px; background:url(../images/cyan/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} + +.boardRead .replyAndTrackback { overflow:hidden; _width:100%; height:30px; background:url(../images/cyan/bgBoardListTh.gif) repeat-x left 0px; border-top:1px solid #e0e1db; border-bottom:2px solid #666760;} +.boardRead .replyAndTrackback a strong { color:#2895c0;} +.boardRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; background:url(../images/cyan/iconFile.gif) no-repeat left top;} + + + +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 11px Tahoma; color:#2895c0; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + diff --git a/modules/board/skins/xe_webzine/css/green.css b/modules/board/skins/xe_webzine/css/green.css new file mode 100644 index 000000000..3e54c636d --- /dev/null +++ b/modules/board/skins/xe_webzine/css/green.css @@ -0,0 +1,31 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +.articleNum { float:left; background:url(../images/green/iconArticle.gif) no-repeat left top; padding:0 0 0 1.5em; margin:.5em 0 0 10px;} +#reply li .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/green/iconFile.gif) no-repeat left;} +.boardRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; background:url(../images/green/iconFile.gif) no-repeat left top;} +.accountNavigation li.join a { display:block; background:url(../images/green/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/green/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} + +.boardList th { color:#3e3f3e; font-weight:normal; border-bottom:1px solid #ffffff; padding:.5em .5em .3em .5em; background:#ffffff url(../images/green/lineBoardListTh.gif) no-repeat left bottom;white-space:nowrap; height:33px;} + +.boardList td.recommend { font:bold .8em Tahoma; color:#38b549; text-align:center;} + +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 11px Tahoma; color:#38b549; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#38b549; cursor:default; position:relative; top:-.2em;} +.boardList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#ff6600; cursor:default; position:relative; top:.3em;} + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; border-top:1px solid #d1d9db; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} +.boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d0dbd1; border-bottom:3px solid #38b549; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.articleNum strong { font:bold 11px Tahoma; color:#ff6600;} + +.boardRead .replyAndTrackback { overflow:hidden; _width:100%; height:30px; background:url(../images/green/bgBoardListTh.gif) repeat-x left 0px; border-top:1px solid #e0e1db; border-bottom:2px solid #666760;} +.boardRead .replyAndTrackback a strong { color:#38b549;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; _position:relative; _top:3px; background:url(../images/green/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} diff --git a/modules/board/skins/xe_webzine/css/purple.css b/modules/board/skins/xe_webzine/css/purple.css new file mode 100644 index 000000000..fb7fe1fd0 --- /dev/null +++ b/modules/board/skins/xe_webzine/css/purple.css @@ -0,0 +1,31 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +.articleNum { float:left; background:url(../images/purple/iconArticle.gif) no-repeat left top; padding:0 0 0 1.5em; margin:.5em 0 0 10px;} +#reply li .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/purple/iconFile.gif) no-repeat left;} +.boardRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; background:url(../images/purple/iconFile.gif) no-repeat left top;} +.accountNavigation li.join a { display:block; background:url(../images/purple/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/purple/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} + +.boardList th { color:#3e3f3e; font-weight:normal; border-bottom:1px solid #ffffff; padding:.5em .5em .3em .5em; background:#ffffff url(../images/purple/lineBoardListTh.gif) no-repeat left bottom;white-space:nowrap;height:33px;} + +.boardList td.recommend { font:bold .8em Tahoma; color:#b1ae00; text-align:center;} + +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 11px Tahoma; color:#b1ae00; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#b1ae00; cursor:default; position:relative; top:-.2em;} +.boardList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#b1ae00; cursor:default; position:relative; top:.3em;} + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; border-top:1px solid #d1d9db; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} +.boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d1d9db; border-bottom:3px solid #ac19a9; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.articleNum strong { font:bold 11px Tahoma; color:#b1ae00;} + +.boardRead .replyAndTrackback { overflow:hidden; _width:100%; height:30px; background:url(../images/purple/bgBoardListTh.gif) repeat-x left 0px; border-top:1px solid #e0e1db; border-bottom:2px solid #666760;} +.boardRead .replyAndTrackback a strong { color:#b1ae00;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; _position:relative; _top:3px; background:url(../images/purple/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} diff --git a/modules/board/skins/xe_webzine/css/red.css b/modules/board/skins/xe_webzine/css/red.css new file mode 100644 index 000000000..859aa0cd8 --- /dev/null +++ b/modules/board/skins/xe_webzine/css/red.css @@ -0,0 +1,31 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +.articleNum { float:left; background:url(../images/red/iconArticle.gif) no-repeat left top; padding:0 0 0 1.5em; margin:.5em 0 0 10px;} +#reply li .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/red/iconFile.gif) no-repeat left;} +.boardRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; background:url(../images/red/iconFile.gif) no-repeat left top;} +.accountNavigation li.join a { display:block; background:url(../images/red/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/red/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} + +.boardList th { color:#3e3f3e; font-weight:normal; border-bottom:1px solid #ffffff; padding:.5em .5em .3em .5em; background:#ffffff url(../images/red/lineBoardListTh.gif) no-repeat left bottom; white-space:nowrap; height:33px;} + +.boardList td.recommend { font:bold .8em Tahoma; color:#ff6600; text-align:center;} + +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 11px Tahoma; color:#ff6600; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#ff6600; cursor:default; position:relative; top:-.2em;} +.boardList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#ff6600; cursor:default; position:relative; top:.3em;} + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; border-top:1px solid #d1d9db; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} +.boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d1d9db; border-bottom:3px solid #ed135a; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.articleNum strong { font:bold 11px Tahoma; color:#ff6600;} + +.boardRead .replyAndTrackback { overflow:hidden; _width:100%; height:30px; background:url(../images/red/bgBoardListTh.gif) repeat-x left 0px; border-top:1px solid #e0e1db; border-bottom:2px solid #666760;} +.boardRead .replyAndTrackback a strong { color:#ff6600;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; _position:relative; _top:3px; background:url(../images/red/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} diff --git a/modules/board/skins/xe_webzine/css/white.css b/modules/board/skins/xe_webzine/css/white.css new file mode 100644 index 000000000..cba778ec9 --- /dev/null +++ b/modules/board/skins/xe_webzine/css/white.css @@ -0,0 +1,30 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +.articleNum { float:left; background:url(../images/white/iconArticle.gif) no-repeat left top; padding:0 0 0 1.5em; margin:.5em 0 0 10px;} +#reply li .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/white/iconFile.gif) no-repeat left;} +.boardRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; background:url(../images/white/iconFile.gif) no-repeat left top;} +.accountNavigation li.join a { display:block; background:url(../images/white/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.accountNavigation li.myInfo a { display:block; background:url(../images/white/iconMyInfo.gif) no-repeat left .1em; padding:0 0 0 1.2em;} +.boardList th { color:#3e3f3e; font-weight:normal; border-bottom:1px solid #ffffff; padding:.5em .5em .3em .5em; background:#ffffff url(../images/white/lineBoardListTh.gif) no-repeat left bottom;white-space:nowrap; height:33px;} + +.boardList td.recommend { font:bold .8em Tahoma; color:#ff6600; text-align:center;} + +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 11px Tahoma; color:#ff6600; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#ff6600; position:relative; top:-.2em;} +.boardList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#ff6600; position:relative; top:.3em;} + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; border:1px solid #e1e1dd; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) repeat-x left bottom; overflow:hidden;} +.boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-bottom:3px solid #fe3614; background:#ffffff url(../images/common/lineH3.gif) no-repeat right bottom;} + +.articleNum strong { font:bold 11px Tahoma; color:#ff6600;} + +.boardRead .replyAndTrackback { overflow:hidden; height:30px; background:url(../images/white/bgBoardListTh.gif) repeat-x left 0px; border-top:1px solid #e0e1db; border-bottom:2px solid #666760;} +.boardRead .replyAndTrackback a strong { color:#ff6600;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; _position:relative; _top:3px; background:url(../images/white/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} diff --git a/modules/board/skins/xe_webzine/delete_comment_form.html b/modules/board/skins/xe_webzine/delete_comment_form.html new file mode 100644 index 000000000..984c3ac8e --- /dev/null +++ b/modules/board/skins/xe_webzine/delete_comment_form.html @@ -0,0 +1,24 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + + +
+
+ + diff --git a/modules/board/skins/xe_webzine/delete_form.html b/modules/board/skins/xe_webzine/delete_form.html new file mode 100644 index 000000000..1ca638c93 --- /dev/null +++ b/modules/board/skins/xe_webzine/delete_form.html @@ -0,0 +1,23 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + +
+
+ + diff --git a/modules/board/skins/xe_webzine/delete_trackback_form.html b/modules/board/skins/xe_webzine/delete_trackback_form.html new file mode 100644 index 000000000..f907b6793 --- /dev/null +++ b/modules/board/skins/xe_webzine/delete_trackback_form.html @@ -0,0 +1,25 @@ + + + +
+ +
+

{$lang->confirm_delete}

+
+ +
+ + + + + + + +
+
+ + + diff --git a/modules/board/skins/xe_webzine/extra_var_form.html b/modules/board/skins/xe_webzine/extra_var_form.html new file mode 100644 index 000000000..564cec9d9 --- /dev/null +++ b/modules/board/skins/xe_webzine/extra_var_form.html @@ -0,0 +1,65 @@ + + + + + {@ $val->default = explode(',',$val->default) } + + + +{@ $val->column_name = "extra_vars".$key} + + +{@ $val->value = $oDocument->getExtraValue($key)} + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
  • value)&&in_array($v, $val->value))-->checked="checked"/> {$v}
  • + +
+ + + + + + + + + +
{zdate($val->value,"Y-m-d")}
+ {$lang->cmd_open_calendar} + + + +

{$val->desc}

+ diff --git a/modules/board/skins/xe_webzine/extra_var_value.html b/modules/board/skins/xe_webzine/extra_var_value.html new file mode 100644 index 000000000..0d5b21657 --- /dev/null +++ b/modules/board/skins/xe_webzine/extra_var_value.html @@ -0,0 +1,57 @@ + + + +{@ $val->column_name = "extra_vars".$key} + + +{@ $val->value = $oDocument->getExtraValue($key)} + + + + {htmlspecialchars($val->value)} + + + + + {$val->value} + +   + + + + + + {$val->value} + +   + + + + + {htmlspecialchars($val->value[0])} + - + {htmlspecialchars($val->value[1])} + - + {htmlspecialchars($val->value[2])} + + + + {nl2br(htmlspecialchars($val->value))} + + + + + {@ $_tmp_value[] = htmlspecialchars($v)} + + {implode(",",$_tmp_value)} + + + + {htmlspecialchars($val->value)} + + + + {zdate($val->value,"Y-m-d")} + + +  diff --git a/modules/board/skins/xe_webzine/filter/delete_comment.xml b/modules/board/skins/xe_webzine/filter/delete_comment.xml new file mode 100644 index 000000000..115ea00d9 --- /dev/null +++ b/modules/board/skins/xe_webzine/filter/delete_comment.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_webzine/filter/delete_document.xml b/modules/board/skins/xe_webzine/filter/delete_document.xml new file mode 100644 index 000000000..7627f5a63 --- /dev/null +++ b/modules/board/skins/xe_webzine/filter/delete_document.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_webzine/filter/delete_trackback.xml b/modules/board/skins/xe_webzine/filter/delete_trackback.xml new file mode 100644 index 000000000..2140675f8 --- /dev/null +++ b/modules/board/skins/xe_webzine/filter/delete_trackback.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_webzine/filter/input_password.xml b/modules/board/skins/xe_webzine/filter/input_password.xml new file mode 100644 index 000000000..55cb6d8e0 --- /dev/null +++ b/modules/board/skins/xe_webzine/filter/input_password.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_webzine/filter/insert.xml b/modules/board/skins/xe_webzine/filter/insert.xml new file mode 100644 index 000000000..85d1ed4ce --- /dev/null +++ b/modules/board/skins/xe_webzine/filter/insert.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_webzine/filter/insert_comment.xml b/modules/board/skins/xe_webzine/filter/insert_comment.xml new file mode 100644 index 000000000..ba2216c8a --- /dev/null +++ b/modules/board/skins/xe_webzine/filter/insert_comment.xml @@ -0,0 +1,28 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_webzine/filter/search.xml b/modules/board/skins/xe_webzine/filter/search.xml new file mode 100644 index 000000000..6c85e1254 --- /dev/null +++ b/modules/board/skins/xe_webzine/filter/search.xml @@ -0,0 +1,15 @@ + +
+ + + + + + + + + + + + +
diff --git a/modules/board/skins/xe_webzine/filter/vote.xml b/modules/board/skins/xe_webzine/filter/vote.xml new file mode 100644 index 000000000..0870a7551 --- /dev/null +++ b/modules/board/skins/xe_webzine/filter/vote.xml @@ -0,0 +1,13 @@ + +
+ + + + + + + + + + +
diff --git a/modules/board/skins/xe_webzine/footer.html b/modules/board/skins/xe_webzine/footer.html new file mode 100644 index 000000000..c6171637a --- /dev/null +++ b/modules/board/skins/xe_webzine/footer.html @@ -0,0 +1,2 @@ + +{$module_info->footer_text} diff --git a/modules/board/skins/xe_webzine/header.html b/modules/board/skins/xe_webzine/header.html new file mode 100644 index 000000000..04af033e4 --- /dev/null +++ b/modules/board/skins/xe_webzine/header.html @@ -0,0 +1,82 @@ + + + + + + {@$module_info->colorset = "white"} + + + + + + + + + + + + +{$module_info->header_text} + + + +
+

{$module_info->title} - {$module_info->sub_title}

+
+ + + + +
{$module_info->comment}
+ + + +
+ + + + {$lang->document_count} {number_format($total_count)} + + + + +
diff --git a/modules/board/skins/xe_webzine/images/blank.gif b/modules/board/skins/xe_webzine/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/blank.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/bgBoardEditorOption.gif b/modules/board/skins/xe_webzine/images/common/bgBoardEditorOption.gif new file mode 100644 index 000000000..559588af6 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/bgBoardEditorOption.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/bgEditorFileList.gif b/modules/board/skins/xe_webzine/images/common/bgEditorFileList.gif new file mode 100644 index 000000000..e5050341c Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/bgEditorFileList.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/bgH3.gif b/modules/board/skins/xe_webzine/images/common/bgH3.gif new file mode 100644 index 000000000..0d07bb456 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/bgH3.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/bottomGotoFirst.gif b/modules/board/skins/xe_webzine/images/common/bottomGotoFirst.gif new file mode 100644 index 000000000..e0297fecb Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/bottomGotoFirst.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/bottomGotoLast.gif b/modules/board/skins/xe_webzine/images/common/bottomGotoLast.gif new file mode 100644 index 000000000..0a7141d0d Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/bottomGotoLast.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/bullet_3x3_d8d8d8.gif b/modules/board/skins/xe_webzine/images/common/bullet_3x3_d8d8d8.gif new file mode 100644 index 000000000..c1f245227 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/bullet_3x3_d8d8d8.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/buttonAscending.gif b/modules/board/skins/xe_webzine/images/common/buttonAscending.gif new file mode 100644 index 000000000..b405cc323 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/buttonAscending.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/buttonClose.gif b/modules/board/skins/xe_webzine/images/common/buttonClose.gif new file mode 100644 index 000000000..12cd8aaa9 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/buttonClose.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/buttonDeleteX.gif b/modules/board/skins/xe_webzine/images/common/buttonDeleteX.gif new file mode 100644 index 000000000..c066e49be Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/buttonDeleteX.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/buttonDescending.gif b/modules/board/skins/xe_webzine/images/common/buttonDescending.gif new file mode 100644 index 000000000..2dc5575ff Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/buttonDescending.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/buttonHelp.gif b/modules/board/skins/xe_webzine/images/common/buttonHelp.gif new file mode 100644 index 000000000..ca7a23a9f Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/buttonHelp.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/buttonTextAreaDrag.gif b/modules/board/skins/xe_webzine/images/common/buttonTextAreaDrag.gif new file mode 100644 index 000000000..148e9ee10 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/buttonTextAreaDrag.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/buttonToggleReply.gif b/modules/board/skins/xe_webzine/images/common/buttonToggleReply.gif new file mode 100644 index 000000000..ba3609980 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/buttonToggleReply.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/buttonTypeInput24.gif b/modules/board/skins/xe_webzine/images/common/buttonTypeInput24.gif new file mode 100644 index 000000000..0dcfc0e3d Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/buttonTypeInput24.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/iconAdmin.gif b/modules/board/skins/xe_webzine/images/common/iconAdmin.gif new file mode 100644 index 000000000..4a581a524 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/iconAdmin.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/iconArrowD8.gif b/modules/board/skins/xe_webzine/images/common/iconArrowD8.gif new file mode 100644 index 000000000..fe3143edc Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/iconArrowD8.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/iconCheck.gif b/modules/board/skins/xe_webzine/images/common/iconCheck.gif new file mode 100644 index 000000000..c4fb37ae0 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/iconCheck.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/iconNotice.gif b/modules/board/skins/xe_webzine/images/common/iconNotice.gif new file mode 100644 index 000000000..d32027496 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/iconNotice.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/iconReply.gif b/modules/board/skins/xe_webzine/images/common/iconReply.gif new file mode 100644 index 000000000..a6d4ea112 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/iconReply.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/iconReplyArrow.gif b/modules/board/skins/xe_webzine/images/common/iconReplyArrow.gif new file mode 100644 index 000000000..d1a21a040 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/iconReplyArrow.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/iconRss.gif b/modules/board/skins/xe_webzine/images/common/iconRss.gif new file mode 100644 index 000000000..f495b3ebc Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/iconRss.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/iconSetup.gif b/modules/board/skins/xe_webzine/images/common/iconSetup.gif new file mode 100644 index 000000000..33b41da11 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/iconSetup.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/iconTag.gif b/modules/board/skins/xe_webzine/images/common/iconTag.gif new file mode 100644 index 000000000..ecfdb5585 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/iconTag.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/iconTrackback.gif b/modules/board/skins/xe_webzine/images/common/iconTrackback.gif new file mode 100644 index 000000000..1c83bcadd Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/iconTrackback.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/lineH3.gif b/modules/board/skins/xe_webzine/images/common/lineH3.gif new file mode 100644 index 000000000..fe42fe378 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/lineH3.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/lineTextAreaDrag.gif b/modules/board/skins/xe_webzine/images/common/lineTextAreaDrag.gif new file mode 100644 index 000000000..3df035047 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/lineTextAreaDrag.gif differ diff --git a/modules/board/skins/xe_webzine/images/common/line_1x10_e0e0e0.gif b/modules/board/skins/xe_webzine/images/common/line_1x10_e0e0e0.gif new file mode 100644 index 000000000..6a848dd58 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/common/line_1x10_e0e0e0.gif differ diff --git a/modules/board/skins/xe_webzine/images/cyan/bgBoardListTh.gif b/modules/board/skins/xe_webzine/images/cyan/bgBoardListTh.gif new file mode 100644 index 000000000..aebba7b59 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/cyan/bgBoardListTh.gif differ diff --git a/modules/board/skins/xe_webzine/images/cyan/buttonModifyE.gif b/modules/board/skins/xe_webzine/images/cyan/buttonModifyE.gif new file mode 100644 index 000000000..a1d4340d3 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/cyan/buttonModifyE.gif differ diff --git a/modules/board/skins/xe_webzine/images/cyan/buttonReply.gif b/modules/board/skins/xe_webzine/images/cyan/buttonReply.gif new file mode 100644 index 000000000..1baede5d0 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/cyan/buttonReply.gif differ diff --git a/modules/board/skins/xe_webzine/images/cyan/buttonTypeInput24.gif b/modules/board/skins/xe_webzine/images/cyan/buttonTypeInput24.gif new file mode 100644 index 000000000..7a341a96b Binary files /dev/null and b/modules/board/skins/xe_webzine/images/cyan/buttonTypeInput24.gif differ diff --git a/modules/board/skins/xe_webzine/images/cyan/iconArticle.gif b/modules/board/skins/xe_webzine/images/cyan/iconArticle.gif new file mode 100644 index 000000000..bce58cfe8 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/cyan/iconArticle.gif differ diff --git a/modules/board/skins/xe_webzine/images/cyan/iconFile.gif b/modules/board/skins/xe_webzine/images/cyan/iconFile.gif new file mode 100644 index 000000000..83ad10665 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/cyan/iconFile.gif differ diff --git a/modules/board/skins/xe_webzine/images/cyan/iconList.gif b/modules/board/skins/xe_webzine/images/cyan/iconList.gif new file mode 100644 index 000000000..d41737669 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/cyan/iconList.gif differ diff --git a/modules/board/skins/xe_webzine/images/cyan/iconMyInfo.gif b/modules/board/skins/xe_webzine/images/cyan/iconMyInfo.gif new file mode 100644 index 000000000..1ba5a947e Binary files /dev/null and b/modules/board/skins/xe_webzine/images/cyan/iconMyInfo.gif differ diff --git a/modules/board/skins/xe_webzine/images/cyan/iconWrite.gif b/modules/board/skins/xe_webzine/images/cyan/iconWrite.gif new file mode 100644 index 000000000..9319f7e9b Binary files /dev/null and b/modules/board/skins/xe_webzine/images/cyan/iconWrite.gif differ diff --git a/modules/board/skins/xe_webzine/images/cyan/lineBoardListTh.gif b/modules/board/skins/xe_webzine/images/cyan/lineBoardListTh.gif new file mode 100644 index 000000000..b26bf737c Binary files /dev/null and b/modules/board/skins/xe_webzine/images/cyan/lineBoardListTh.gif differ diff --git a/modules/board/skins/xe_webzine/images/green/bgBoardListTh.gif b/modules/board/skins/xe_webzine/images/green/bgBoardListTh.gif new file mode 100644 index 000000000..ae25c2d82 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/green/bgBoardListTh.gif differ diff --git a/modules/board/skins/xe_webzine/images/green/buttonModifyE.gif b/modules/board/skins/xe_webzine/images/green/buttonModifyE.gif new file mode 100644 index 000000000..6a4ade1a5 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/green/buttonModifyE.gif differ diff --git a/modules/board/skins/xe_webzine/images/green/buttonReply.gif b/modules/board/skins/xe_webzine/images/green/buttonReply.gif new file mode 100644 index 000000000..e142d4263 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/green/buttonReply.gif differ diff --git a/modules/board/skins/xe_webzine/images/green/buttonTypeInput24.gif b/modules/board/skins/xe_webzine/images/green/buttonTypeInput24.gif new file mode 100644 index 000000000..3e01072b9 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/green/buttonTypeInput24.gif differ diff --git a/modules/board/skins/xe_webzine/images/green/iconArticle.gif b/modules/board/skins/xe_webzine/images/green/iconArticle.gif new file mode 100644 index 000000000..a27236ef2 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/green/iconArticle.gif differ diff --git a/modules/board/skins/xe_webzine/images/green/iconFile.gif b/modules/board/skins/xe_webzine/images/green/iconFile.gif new file mode 100644 index 000000000..2040f4fcb Binary files /dev/null and b/modules/board/skins/xe_webzine/images/green/iconFile.gif differ diff --git a/modules/board/skins/xe_webzine/images/green/iconList.gif b/modules/board/skins/xe_webzine/images/green/iconList.gif new file mode 100644 index 000000000..2e67636f5 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/green/iconList.gif differ diff --git a/modules/board/skins/xe_webzine/images/green/iconMyInfo.gif b/modules/board/skins/xe_webzine/images/green/iconMyInfo.gif new file mode 100644 index 000000000..b67f29733 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/green/iconMyInfo.gif differ diff --git a/modules/board/skins/xe_webzine/images/green/iconWrite.gif b/modules/board/skins/xe_webzine/images/green/iconWrite.gif new file mode 100644 index 000000000..2c9832e36 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/green/iconWrite.gif differ diff --git a/modules/board/skins/xe_webzine/images/green/lineBoardListTh.gif b/modules/board/skins/xe_webzine/images/green/lineBoardListTh.gif new file mode 100644 index 000000000..282297cf8 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/green/lineBoardListTh.gif differ diff --git a/modules/board/skins/xe_webzine/images/purple/bgBoardListTh.gif b/modules/board/skins/xe_webzine/images/purple/bgBoardListTh.gif new file mode 100644 index 000000000..ae25c2d82 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/purple/bgBoardListTh.gif differ diff --git a/modules/board/skins/xe_webzine/images/purple/buttonModifyE.gif b/modules/board/skins/xe_webzine/images/purple/buttonModifyE.gif new file mode 100644 index 000000000..a1d4340d3 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/purple/buttonModifyE.gif differ diff --git a/modules/board/skins/xe_webzine/images/purple/buttonReply.gif b/modules/board/skins/xe_webzine/images/purple/buttonReply.gif new file mode 100644 index 000000000..600534865 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/purple/buttonReply.gif differ diff --git a/modules/board/skins/xe_webzine/images/purple/buttonTypeInput24.gif b/modules/board/skins/xe_webzine/images/purple/buttonTypeInput24.gif new file mode 100644 index 000000000..0dcfc0e3d Binary files /dev/null and b/modules/board/skins/xe_webzine/images/purple/buttonTypeInput24.gif differ diff --git a/modules/board/skins/xe_webzine/images/purple/iconArticle.gif b/modules/board/skins/xe_webzine/images/purple/iconArticle.gif new file mode 100644 index 000000000..59c1c8019 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/purple/iconArticle.gif differ diff --git a/modules/board/skins/xe_webzine/images/purple/iconFile.gif b/modules/board/skins/xe_webzine/images/purple/iconFile.gif new file mode 100644 index 000000000..c39a49aa0 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/purple/iconFile.gif differ diff --git a/modules/board/skins/xe_webzine/images/purple/iconList.gif b/modules/board/skins/xe_webzine/images/purple/iconList.gif new file mode 100644 index 000000000..2e67636f5 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/purple/iconList.gif differ diff --git a/modules/board/skins/xe_webzine/images/purple/iconMyInfo.gif b/modules/board/skins/xe_webzine/images/purple/iconMyInfo.gif new file mode 100644 index 000000000..af4545bfa Binary files /dev/null and b/modules/board/skins/xe_webzine/images/purple/iconMyInfo.gif differ diff --git a/modules/board/skins/xe_webzine/images/purple/iconWrite.gif b/modules/board/skins/xe_webzine/images/purple/iconWrite.gif new file mode 100644 index 000000000..f18cb5e9e Binary files /dev/null and b/modules/board/skins/xe_webzine/images/purple/iconWrite.gif differ diff --git a/modules/board/skins/xe_webzine/images/purple/lineBoardListTh.gif b/modules/board/skins/xe_webzine/images/purple/lineBoardListTh.gif new file mode 100644 index 000000000..6c74832c3 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/purple/lineBoardListTh.gif differ diff --git a/modules/board/skins/xe_webzine/images/red/bgBoardListTh.gif b/modules/board/skins/xe_webzine/images/red/bgBoardListTh.gif new file mode 100644 index 000000000..ae25c2d82 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/red/bgBoardListTh.gif differ diff --git a/modules/board/skins/xe_webzine/images/red/buttonModifyE.gif b/modules/board/skins/xe_webzine/images/red/buttonModifyE.gif new file mode 100644 index 000000000..974552d54 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/red/buttonModifyE.gif differ diff --git a/modules/board/skins/xe_webzine/images/red/buttonReply.gif b/modules/board/skins/xe_webzine/images/red/buttonReply.gif new file mode 100644 index 000000000..b9472e1bc Binary files /dev/null and b/modules/board/skins/xe_webzine/images/red/buttonReply.gif differ diff --git a/modules/board/skins/xe_webzine/images/red/buttonTypeInput24.gif b/modules/board/skins/xe_webzine/images/red/buttonTypeInput24.gif new file mode 100644 index 000000000..2ae80ed23 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/red/buttonTypeInput24.gif differ diff --git a/modules/board/skins/xe_webzine/images/red/iconArticle.gif b/modules/board/skins/xe_webzine/images/red/iconArticle.gif new file mode 100644 index 000000000..5cd05be62 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/red/iconArticle.gif differ diff --git a/modules/board/skins/xe_webzine/images/red/iconFile.gif b/modules/board/skins/xe_webzine/images/red/iconFile.gif new file mode 100644 index 000000000..ee0dd83c7 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/red/iconFile.gif differ diff --git a/modules/board/skins/xe_webzine/images/red/iconList.gif b/modules/board/skins/xe_webzine/images/red/iconList.gif new file mode 100644 index 000000000..2e67636f5 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/red/iconList.gif differ diff --git a/modules/board/skins/xe_webzine/images/red/iconMyInfo.gif b/modules/board/skins/xe_webzine/images/red/iconMyInfo.gif new file mode 100644 index 000000000..b48e1fcd2 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/red/iconMyInfo.gif differ diff --git a/modules/board/skins/xe_webzine/images/red/iconWrite.gif b/modules/board/skins/xe_webzine/images/red/iconWrite.gif new file mode 100644 index 000000000..2caff746f Binary files /dev/null and b/modules/board/skins/xe_webzine/images/red/iconWrite.gif differ diff --git a/modules/board/skins/xe_webzine/images/red/lineBoardListTh.gif b/modules/board/skins/xe_webzine/images/red/lineBoardListTh.gif new file mode 100644 index 000000000..ee37cb8df Binary files /dev/null and b/modules/board/skins/xe_webzine/images/red/lineBoardListTh.gif differ diff --git a/modules/board/skins/xe_webzine/images/white/bgBoardListTh.gif b/modules/board/skins/xe_webzine/images/white/bgBoardListTh.gif new file mode 100644 index 000000000..ae25c2d82 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/white/bgBoardListTh.gif differ diff --git a/modules/board/skins/xe_webzine/images/white/buttonModifyE.gif b/modules/board/skins/xe_webzine/images/white/buttonModifyE.gif new file mode 100644 index 000000000..1cde1b60f Binary files /dev/null and b/modules/board/skins/xe_webzine/images/white/buttonModifyE.gif differ diff --git a/modules/board/skins/xe_webzine/images/white/buttonReply.gif b/modules/board/skins/xe_webzine/images/white/buttonReply.gif new file mode 100644 index 000000000..600534865 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/white/buttonReply.gif differ diff --git a/modules/board/skins/xe_webzine/images/white/buttonTypeInput24.gif b/modules/board/skins/xe_webzine/images/white/buttonTypeInput24.gif new file mode 100644 index 000000000..0dcfc0e3d Binary files /dev/null and b/modules/board/skins/xe_webzine/images/white/buttonTypeInput24.gif differ diff --git a/modules/board/skins/xe_webzine/images/white/iconArticle.gif b/modules/board/skins/xe_webzine/images/white/iconArticle.gif new file mode 100644 index 000000000..59c1c8019 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/white/iconArticle.gif differ diff --git a/modules/board/skins/xe_webzine/images/white/iconFile.gif b/modules/board/skins/xe_webzine/images/white/iconFile.gif new file mode 100644 index 000000000..c39a49aa0 Binary files /dev/null and b/modules/board/skins/xe_webzine/images/white/iconFile.gif differ diff --git a/modules/board/skins/xe_webzine/images/white/iconList.gif b/modules/board/skins/xe_webzine/images/white/iconList.gif new file mode 100644 index 000000000..1c83bcadd Binary files /dev/null and b/modules/board/skins/xe_webzine/images/white/iconList.gif differ diff --git a/modules/board/skins/xe_webzine/images/white/iconMyInfo.gif b/modules/board/skins/xe_webzine/images/white/iconMyInfo.gif new file mode 100644 index 000000000..af4545bfa Binary files /dev/null and b/modules/board/skins/xe_webzine/images/white/iconMyInfo.gif differ diff --git a/modules/board/skins/xe_webzine/images/white/iconWrite.gif b/modules/board/skins/xe_webzine/images/white/iconWrite.gif new file mode 100644 index 000000000..f18cb5e9e Binary files /dev/null and b/modules/board/skins/xe_webzine/images/white/iconWrite.gif differ diff --git a/modules/board/skins/xe_webzine/images/white/lineBoardListTh.gif b/modules/board/skins/xe_webzine/images/white/lineBoardListTh.gif new file mode 100644 index 000000000..6d891d82c Binary files /dev/null and b/modules/board/skins/xe_webzine/images/white/lineBoardListTh.gif differ diff --git a/modules/board/skins/xe_webzine/input_password_form.html b/modules/board/skins/xe_webzine/input_password_form.html new file mode 100644 index 000000000..985f1ffd5 --- /dev/null +++ b/modules/board/skins/xe_webzine/input_password_form.html @@ -0,0 +1,27 @@ + + + +
+ +
+

{$lang->msg_input_password}

+
+ +
+ + + + + + + +
+ +
+ + + diff --git a/modules/board/skins/xe_webzine/js/board.js b/modules/board/skins/xe_webzine/js/board.js new file mode 100644 index 000000000..7611a063d --- /dev/null +++ b/modules/board/skins/xe_webzine/js/board.js @@ -0,0 +1,137 @@ +/** + * @file modules/board/js/board.js + * @author zero (zero@nzeo.com) + * @brief board 모듈의 javascript + **/ + +/* 관리자가 카트 선택시 세션에 넣음 */ +function doAddCart(mid, obj) { + var srl = obj.value; + var check_flag = obj.checked?'add':'remove'; + + var params = new Array(); + params["mid"] = mid; + params["srl"] = srl; + params["check_flag"] = check_flag; + + exec_xml("board","procBoardAdminAddCart", params, null); +} + +/* 글쓰기 작성후 */ +function completeDocumentInserted(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var category_srl = ret_obj['category_srl']; + + alert(message); + + var url = current_url.setQuery('mid',mid).setQuery('document_srl',document_srl).setQuery('act',''); + if(category_srl) url = url.setQuery('category',category_srl); + location.href = url; +} + +/* 글 삭제 */ +function completeDeleteDocument(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var page = ret_obj['page']; + + var url = "./?mid="+mid; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 검색 실행 */ +function completeSearch(fo_obj, params) { + fo_obj.submit(); +} + +/* 추천, 추천은 별도의 폼입력이 필요 없어 직접 필터 사용 */ +function doVote() { + var fo_obj = document.getElementById('fo_document_info'); + procFilter(fo_obj, vote); +} + +function completeVote(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + alert(message); + location.href = location.href; +} + +// 현재 페이지 reload +function completeReload(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + location.href = location.href; +} + +/* 댓글 글쓰기 작성후 */ +function completeInsertComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var comment_srl = ret_obj['comment_srl']; + + var url = "./?mid="+mid+"&document_srl="+document_srl; + if(comment_srl) url += "#comment_"+comment_srl; + + alert(message); + + location.href = url; +} + +/* 댓글 삭제 */ +function completeDeleteComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 트랙백 삭제 */ +function completeDeleteTrackback(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +/* 카테고리 이동 */ +function doChangeCategory() { + var sel_obj = xGetElementById("board_category"); + var sel_idx = sel_obj.selectedIndex; + var category_srl = sel_obj.options[sel_idx].value; + location.href = current_url.setQuery('category',category_srl); +} + +/* 스크랩 */ +function doScrap(document_srl) { + var params = new Array(); + params["document_srl"] = document_srl; + exec_xml("member","procMemberScrapDocument", params, null); +} diff --git a/modules/board/skins/xe_webzine/list.html b/modules/board/skins/xe_webzine/list.html new file mode 100644 index 000000000..78d9e3518 --- /dev/null +++ b/modules/board/skins/xe_webzine/list.html @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + {@ $order_icon = "buttonDescending.gif" } + {@ $order_type = "asc"; } + + {@ $order_icon = "buttonAscending.gif" } + {@ $order_type = "desc"; } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {@ $_col_count = 5} + + {@ $_col_count = 6} + + + + + + + +
{$lang->no} + +
+ + +
+ + {$lang->title} + +
{$lang->writer}{$lang->readed_count}{$lang->voted_count}{$lang->date}
+ {$lang->no_documents} +
{$lang->notice} + + document_srl])-->checked="checked" /> + + + {$category_list[$document->get('category_srl')]->title} + + + + {$document->getTitleText($module_info->subject_cut_size)} + + {$document->getTitleText($module_info->subject_cut_size)} + + + {$document->getTitleText($module_info->subject_cut_size)} + + + + {$document->getCommentCount()} + + + + {$document->getTrackbackCount()} + +
{$document->getNickName()}
{$document->get('readed_count')}{$document->get('voted_count')}{$document->getRegdate('Y-m-d')}
{$no} + + + + + + document_srl])-->checked="checked" /> + + + {$category_list[$document->get('category_srl')]->title} + + + + {$document->getTitleText($module_info->subject_cut_size)} + + {$document->getTitleText($module_info->subject_cut_size)} + + + {$document->getTitleText($module_info->subject_cut_size)} + + + + {$document->getCommentCount()} + + + + {$document->getTrackbackCount()} + +
{$document->getNickName()}
{$document->get('readed_count')}{$document->get('voted_count')}{$document->getRegdate('Y-m-d')}
{$document->getSummary(120)}
+ + + +
+ + + + + + + + + + + + + +
+ +
+
+ + + diff --git a/modules/board/skins/xe_webzine/message.html b/modules/board/skins/xe_webzine/message.html new file mode 100644 index 000000000..00bf01814 --- /dev/null +++ b/modules/board/skins/xe_webzine/message.html @@ -0,0 +1,11 @@ + + +
+ {$message} +
+ + + {$lang->cmd_login} + + + diff --git a/modules/board/skins/xe_webzine/screenshot/cyan.gif b/modules/board/skins/xe_webzine/screenshot/cyan.gif new file mode 100644 index 000000000..e6b99102c Binary files /dev/null and b/modules/board/skins/xe_webzine/screenshot/cyan.gif differ diff --git a/modules/board/skins/xe_webzine/screenshot/green.gif b/modules/board/skins/xe_webzine/screenshot/green.gif new file mode 100644 index 000000000..0b8b8bad2 Binary files /dev/null and b/modules/board/skins/xe_webzine/screenshot/green.gif differ diff --git a/modules/board/skins/xe_webzine/screenshot/purple.gif b/modules/board/skins/xe_webzine/screenshot/purple.gif new file mode 100644 index 000000000..3d9247e03 Binary files /dev/null and b/modules/board/skins/xe_webzine/screenshot/purple.gif differ diff --git a/modules/board/skins/xe_webzine/screenshot/red.gif b/modules/board/skins/xe_webzine/screenshot/red.gif new file mode 100644 index 000000000..2ea07641d Binary files /dev/null and b/modules/board/skins/xe_webzine/screenshot/red.gif differ diff --git a/modules/board/skins/xe_webzine/screenshot/white.gif b/modules/board/skins/xe_webzine/screenshot/white.gif new file mode 100644 index 000000000..08741954f Binary files /dev/null and b/modules/board/skins/xe_webzine/screenshot/white.gif differ diff --git a/modules/board/skins/xe_webzine/skin.xml b/modules/board/skins/xe_webzine/skin.xml new file mode 100644 index 000000000..d853c5aaa --- /dev/null +++ b/modules/board/skins/xe_webzine/skin.xml @@ -0,0 +1,120 @@ + + + 제로보드XE 게시판 기본 스킨(웹진형) + ゼロボードXE掲示板のデフォルトスキン(ウェブジンスタイル) + Zeroboard XE Board 基本皮肤(网络杂志型) + ZeroboardXE Basic Board Skin (Webzine Style) + + (주)NHN + (株)NHN + (株)NHN + NHN Corp + + 제로보드XE 게시판의 웹진형태 기본 스킨입니다. + 디자인 : 서기정 (http://blog.naver.com/addcozy) + HTML/CSS : 정찬명 (http://naradesign.net) + + + ゼロボードXE掲示板のウェブジンスタイルのデフォルトスキンです。 + デザイン:ソギジョン (http://blog.naver.com/addcozy) + HTML/CSS:ジョンチャンミョン (http://naradesign.net) + + + zeroboard XE Board 网络杂志型基本皮肤。 + 设计 : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Chan-Myung Jeong (http://naradesign.net) + + + This is the basic webzine style board skin of Zeroboard XE. + Design : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Chan-Myung Jeong (http://naradesign.net) + + + + + 하얀색(기본) + 白(デフォルト) + 白色(基本) + White (default) + + + 청록색 + 青緑 + 青绿色 + Cyan + + + 초록색 + + 绿色 + Green + + + 빨간색 + + 红色 + Red + + + 보라색 + + 紫色 + Purple + + + + + 정렬 대상 + ソート対象 + 排序对象 + Align Target + select + 등록된 순서 또는 변경된 순서로 정렬을 할 수 있습니다. + 登録された順、変更された順でソートできます。 + 可对主题按发表顺或最后更新顺进行排序。 + It can align articles as registered order or modified order. + newest + updated + + + 게시판 제목 + 掲示板タイトル + 版面标题 + Title of Board + 게시판의 제목을 적어주세요. + 掲示板タイトルを入力してください。 + 请输入版面标题。(留空为不显示) + Please input the title of board. + + + 게시판 부제목 + 掲示板サブタイトル + 版面副标题 + Subtitle of Board + 게시판 제목 옆에 나타날 부제목을 적어주세요. + 掲示板タイトルの横表示されるサブタイトルを入力してください。 + 请输入显示在版面标题旁的副标题。(留空为不显示) + Please input the subtitle of board which will be displayed beside of board title. + + + 게시판 상세 설명 + 掲示板の説明 + 版面详细说明 + Description of Board + 게시판 제목 아래 표시될 설명을 입력하실 수 있습니다. + 掲示板タイトルの下に表示される説明文入力してください。 + 请输入显示在版面标题下的说明。(留空为不显示) + You may input description which will be displayed under the board title. + + + 제목 글자수 + タイトルの文字数 + 标题字数 + Length of Subject + 제목 글자수를 지정할 수 있습니다. (0또는 비워주시면 자르지 않습니다) + タイトルの文字数が指定できます(「0」または空欄の場合は、文字数を制限しません)。 + 可以指定标题字数。(0或留空为不限) + You may set length of title. (0 or blank value will not restrict the length) + + + diff --git a/modules/board/skins/xe_webzine/trackback.html b/modules/board/skins/xe_webzine/trackback.html new file mode 100644 index 000000000..5a565f328 --- /dev/null +++ b/modules/board/skins/xe_webzine/trackback.html @@ -0,0 +1,24 @@ + + + + + diff --git a/modules/board/skins/xe_webzine/view_document.html b/modules/board/skins/xe_webzine/view_document.html new file mode 100644 index 000000000..fc9ec9291 --- /dev/null +++ b/modules/board/skins/xe_webzine/view_document.html @@ -0,0 +1,134 @@ + + + +
+ + +
+ + +
+
+
+
+

{$oDocument->getTitleText()}

+ + |{$category_list[$oDocument->get('category_srl')]->title} + +
+ +
+ {$lang->readed_count}: + {$oDocument->get('readed_count')}, + + + {$lang->voted_count}: + {$oDocument->get('voted_count')}, + + + {$oDocument->getRegdate('Y.m.d')} {$oDocument->getRegdate('H:i:s')} + + + {$lang->cmd_modify} + {$lang->cmd_delete} + +
+
+
+ +
    +
  • {$lang->document_url} : {$oDocument->getPermanentUrl()}
  • + +
  • {$lang->trackback_url} : {$oDocument->getTrackbackUrl()}
  • + +
+ +
+
{$oDocument->getNickName()}
+ +
{$oDocument->get('ipaddress')}
+ +
+ + + + + + + + + + + + + +
{$val->name} + + +
+ + +
{$oDocument->getContent()}
+ +
+ {@ $tag_list = $oDocument->get('tag_list') } + +
+
{$lang->tag}
+ +
+ + + +
+
{$lang->uploaded_file} :
+ +
+
+ +
+
+ + +
+ + + + + + + + + + + + diff --git a/modules/board/skins/xe_webzine/write_form.html b/modules/board/skins/xe_webzine/write_form.html new file mode 100644 index 000000000..1cf0ea8c5 --- /dev/null +++ b/modules/board/skins/xe_webzine/write_form.html @@ -0,0 +1,115 @@ + + + +
+
fileupload)-->enctype="multipart/form-data" class="boardEditor" id="fo_write"> +
+ + + + + +
+ + + + + + + + + + + +
+ + +
+ + + + + + + +
+ +
+
{$lang->cmd_option}
+ +
+ isNotice())-->checked="checked" id="is_notice" /> + +
+
+ isLocked())-->checked="checked" id="lock_comment" /> + +
+ +
+ isSecret())-->checked="checked" id="is_secret" /> + +
+
+ allowComment())-->checked="checked" id="allow_comment" /> + +
+
+ allowTrackback())-->checked="checked" id="allow_trackback" /> + +
+ +
+ useNotify())-->checked="checked" id="notify_message" /> + +
+ +
+ +
{$editor}
+ +
+ + + +
+ +
+ + +

{$lang->about_tag}

+
+ + + +
+ + + +
+ + + +
+ + +
+
+ diff --git a/modules/board/tpl/board_delete.html b/modules/board/tpl/board_delete.html new file mode 100644 index 000000000..191aca010 --- /dev/null +++ b/modules/board/tpl/board_delete.html @@ -0,0 +1,34 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
{$lang->confirm_delete}
{$lang->module_name}{$module_info->mid}
{$lang->module}{$module_info->module}
{$lang->document_count}{$module_info->document_count}
+ + + +
diff --git a/modules/board/tpl/board_info.html b/modules/board/tpl/board_info.html new file mode 100644 index 000000000..f5639c5e6 --- /dev/null +++ b/modules/board/tpl/board_info.html @@ -0,0 +1,118 @@ + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->module_category} + + {$lang->not_exists} + + {$module_category[$module_info->module_category_srl]->title} + +
{$lang->layout} + + {$module_info->layout_title} ({$module_info->layout}) + + {$lang->not_exists} + +
{$lang->skin}{$module_info->skin_title} ({$module_info->skin})
{$lang->browser_title}{htmlspecialchars($module_info->browser_title)}
{$lang->use_category}{$lang->use}{$lang->notuse}
{$lang->open_rss}{$lang->open_rss_types[$module_info->open_rss]}
{$lang->list_count}{$module_info->list_count?$module_info->list_count:20}
{$lang->page_count}{$module_info->page_count?$module_info->page_count:10}
{$lang->description}{nl2br(htmlspecialchars($module_info->description))}
{$lang->header_text}{htmlspecialchars($module_info->header_text)}
{$lang->footer_text}{htmlspecialchars($module_info->footer_text)}
{$lang->admin_id}{implode(",",$module_info->admin_id)}
+ + + + +++ + + + + + + +
{$lang->extra_vars}
{$lang->extra_vars} {$i} + + {@ $extra_vars_name = $module_info->extra_vars[$i]->name} + {@ $extra_vars_type = $module_info->extra_vars[$i]->type} + {@ $extra_vars_is_required = $module_info->extra_vars[$i]->is_required=='Y'?'Y':'N'} + {@ $extra_vars_default_value = $module_info->extra_vars[$i]->default?$module_info->extra_vars[$i]->default:' '} + {@ $extra_vars_desc = $module_info->extra_vars[$i]->desc?$module_info->extra_vars[$i]->desc:' '} + {@ $extra_vars_search = $module_info->extra_vars[$i]->search=='Y'?'Y':'N'} + +
    +
  • {$lang->column_name}
  • +
  • {$extra_vars_name}
  • +
  • {$lang->column_type}
  • +
  • {$extra_vars_type}
  • +
  • {$lang->is_required}
  • +
  • {$extra_vars_is_required}
  • +
  • {$lang->default_value}
  • +
  • {$extra_vars_default_value}
  • +
  • {$lang->description}
  • +
  • {$extra_vars_desc}
  • +
  • {$lang->cmd_search}
  • +
  • {$extra_vars_search}
  • +
+ + {$lang->not_exists} + +
+ + diff --git a/modules/board/tpl/board_insert.html b/modules/board/tpl/board_insert.html new file mode 100644 index 000000000..9955e470c --- /dev/null +++ b/modules/board/tpl/board_insert.html @@ -0,0 +1,202 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->mid} + +

{$lang->about_mid}

+
{$lang->is_default} + is_default=='Y')-->checked="checked" id="fld_for_default" class="checkbox" /> + +
{$lang->module_category} + +

{$lang->about_module_category}

+
{$lang->browser_title} + +

{$lang->about_browser_title}

+
{$lang->layout} + +

{$lang->about_layout}

+
{$lang->skin} + +

{$lang->about_skin}

+
{$lang->use_category} + use_category=='Y')-->checked="checked" class="checkbox" /> + {$lang->about_use_category} +
{$lang->open_rss} + +

{$lang->about_open_rss}

+
{$lang->list_count} + +

{$lang->about_list_count}

+
{$lang->page_count} + +

{$lang->about_page_count}

+
{$lang->description} + +

{$lang->about_description}

+
{$lang->header_text} + +

{$lang->about_header_text}

+
{$lang->footer_text} + +

{$lang->about_footer_text}

+
{$lang->admin_id} + +

{$lang->about_admin_id}

+
+ +
+ +
+ + + + + + + + + + + +
{$lang->extra_vars}
{$lang->extra_vars} {$i} + {@ $extra_vars_name = ''} + {@ $extra_vars_type = ''} + {@ $extra_vars_is_required = ''} + {@ $extra_vars_default_value = ''} + {@ $extra_vars_desc = ''} + {@ $extra_vars_search = ''} + + {@ $extra_vars_name = $module_info->extra_vars[$i]->name} + {@ $extra_vars_type = $module_info->extra_vars[$i]->type} + {@ $extra_vars_is_required = $module_info->extra_vars[$i]->is_required} + {@ $extra_vars_default_value = $module_info->extra_vars[$i]->default} + {@ $extra_vars_desc = $module_info->extra_vars[$i]->desc} + {@ $extra_vars_search = $module_info->extra_vars[$i]->search} + + +
    +
  • {$lang->column_name}
  • +
  • +
  • {$lang->column_type}
  • +
  • + +
  • +
  • {$lang->is_required}
  • +
  • checked="checked" /> +
  • {$lang->default_value}
  • +
  • + +

    {$lang->about_extra_vars_default_value}

    +
  • + +
  • {$lang->description}
  • +
  • + +
  • +
  • {$lang->cmd_search}
  • +
  • checked="checked" /> +
+
+ +
+ +
+ +
diff --git a/modules/board/tpl/category_list.html b/modules/board/tpl/category_list.html new file mode 100644 index 000000000..935744953 --- /dev/null +++ b/modules/board/tpl/category_list.html @@ -0,0 +1,67 @@ + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->category_title}{$lang->last_update}{$lang->cmd_modify}{$lang->cmd_move}{$lang->cmd_delete}
{$lang->msg_category_is_null}
{htmlspecialchars($category_info->title)}{zdate($category_info->last_update,"Y-m-d H:i:s")}{$lang->cmd_modify} + {$lang->cmd_move_up} + {$lang->cmd_move_down} + {$lang->cmd_delete}
+ + + +
+ + + + + + + + + + + +
{$lang->category_title} + +
+ +
+ +
+ +
diff --git a/modules/board/tpl/category_update_form.html b/modules/board/tpl/category_update_form.html new file mode 100644 index 000000000..250e8af2f --- /dev/null +++ b/modules/board/tpl/category_update_form.html @@ -0,0 +1,30 @@ + + + + + + + +
+ + + + + + + + + + + +
{$lang->category_title} + +
+ +
+ +
+ + +
+ diff --git a/modules/board/tpl/checked_list.html b/modules/board/tpl/checked_list.html new file mode 100644 index 000000000..69b89fc3d --- /dev/null +++ b/modules/board/tpl/checked_list.html @@ -0,0 +1,53 @@ + + + +
+

{$lang->cmd_manage_document}

+
+ +
+ + + +
+ + + + + + + + + + + + + + + + + +
{count($document_list)}
{$lang->move_target_module} + +
{$lang->cmd_send_message} + +
+
+ + + +
diff --git a/modules/board/tpl/filter/delete_board.xml b/modules/board/tpl/filter/delete_board.xml new file mode 100644 index 000000000..cba763914 --- /dev/null +++ b/modules/board/tpl/filter/delete_board.xml @@ -0,0 +1,10 @@ + +
+ + + + + + + +
diff --git a/modules/board/tpl/filter/insert_board.xml b/modules/board/tpl/filter/insert_board.xml new file mode 100644 index 000000000..f103aa627 --- /dev/null +++ b/modules/board/tpl/filter/insert_board.xml @@ -0,0 +1,153 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/board/tpl/filter/insert_category.xml b/modules/board/tpl/filter/insert_category.xml new file mode 100644 index 000000000..9aed519d1 --- /dev/null +++ b/modules/board/tpl/filter/insert_category.xml @@ -0,0 +1,12 @@ + +
+ + + + + + + + + +
diff --git a/modules/board/tpl/filter/insert_grant.xml b/modules/board/tpl/filter/insert_grant.xml new file mode 100644 index 000000000..8ac809f0b --- /dev/null +++ b/modules/board/tpl/filter/insert_grant.xml @@ -0,0 +1,11 @@ + +
+ + + + + + + + +
diff --git a/modules/board/tpl/filter/manage_checked_document.xml b/modules/board/tpl/filter/manage_checked_document.xml new file mode 100644 index 000000000..f2bd9641c --- /dev/null +++ b/modules/board/tpl/filter/manage_checked_document.xml @@ -0,0 +1,7 @@ + +
+ + + + + diff --git a/modules/board/tpl/filter/update_category.xml b/modules/board/tpl/filter/update_category.xml new file mode 100644 index 000000000..ff7e59f62 --- /dev/null +++ b/modules/board/tpl/filter/update_category.xml @@ -0,0 +1,11 @@ + + + + + + + + + + +
diff --git a/modules/board/tpl/grant_list.html b/modules/board/tpl/grant_list.html new file mode 100644 index 000000000..f96aa9cfa --- /dev/null +++ b/modules/board/tpl/grant_list.html @@ -0,0 +1,42 @@ + + + +
{nl2br($lang->about_grant)}
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->grant}{$lang->target}
{$val->title} + + grants[$key])&&in_array($v->group_srl,$module_info->grants[$key]))-->checked="checked"/> + + + {$lang->cmd_select_all}{$lang->cmd_unselect_all}
+ +
+ +
+
diff --git a/modules/board/tpl/header.html b/modules/board/tpl/header.html new file mode 100644 index 000000000..3f8938c6d --- /dev/null +++ b/modules/board/tpl/header.html @@ -0,0 +1,24 @@ + + +

{$lang->board} {$lang->cmd_management}

+ + +
+ +

{$module_info->mid} ({$lang->is_default}) | View

+ + + +
+ + diff --git a/modules/board/tpl/index.html b/modules/board/tpl/index.html new file mode 100644 index 000000000..609927602 --- /dev/null +++ b/modules/board/tpl/index.html @@ -0,0 +1,80 @@ + + +
{nl2br($lang->about_board)}
+ + +
+ Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->no} +
+ + + + +
+
{$lang->mid}{$lang->browser_title}{$lang->is_default}{$lang->skin}{$lang->admin_id}{$lang->regdate}{$lang->cmd_view}{$lang->cmd_delete}
{$no} + + {$lang->not_exists} + + {$module_category[$val->module_category_srl]->title} + +
{htmlspecialchars($val->browser_title)}
{$val->is_default}{$val->skin}{$val->admin_id}{zdate($val->regdate,"Y-m-d")}{$lang->cmd_view}{$lang->cmd_delete}
+ + + + + + diff --git a/modules/board/tpl/js/board_admin.js b/modules/board/tpl/js/board_admin.js new file mode 100644 index 000000000..48c4c43a1 --- /dev/null +++ b/modules/board/tpl/js/board_admin.js @@ -0,0 +1,116 @@ +/** + * @file modules/board/js/board_admin.js + * @author zero (zero@nzeo.com) + * @brief board 모듈의 관리자용 javascript + **/ + +/* 모듈 생성 후 */ +function completeInsertBoard(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + var page = ret_obj['page']; + var module_srl = ret_obj['module_srl']; + + alert(message); + + var url = current_url.setQuery('act','dispBoardAdminBoardInfo'); + if(module_srl) url = url.setQuery('module_srl',module_srl); + if(page) url.setQuery('page',page); + location.href = url; +} + +/* 모듈 삭제 후 */ +function completeDeleteBoard(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var page = ret_obj['page']; + alert(message); + + var url = current_url.setQuery('act','dispBoardAdminContent').setQuery('module_srl',''); + if(page) url = url.setQuery('page',page); + location.href = url; +} + +/* 카테고리 관련 작업들 */ +function doUpdateCategory(category_srl, mode, message) { + if(typeof(message)!='undefined'&&!confirm(message)) return; + + var fo_obj = xGetElementById('fo_category_info'); + fo_obj.category_srl.value = category_srl; + fo_obj.mode.value = mode; + + procFilter(fo_obj, update_category); +} + +/* 카테고리 정보 수정 후 */ +function completeUpdateCategory(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var module_srl = ret_obj['module_srl']; + var page = ret_obj['page']; + alert(message); + + location.href = current_url.setQuery('category_srl',''); +} + +/* 권한 관련 */ +function doSelectAll(obj, key) { + var fo_obj = obj.parentNode; + while(fo_obj.nodeName != 'FORM') { + fo_obj = fo_obj.parentNode; + } + + for(var i=0;i + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->skin_default_info}
{$lang->skin}{$skin_info->title}
{$lang->skin_maker}{$skin_info->maker->name} ({$skin_info->maker->email_address})
{$lang->skin_maker_homepage}{$skin_info->maker->homepage}
{$lang->date}{$skin_info->maker->date}
{$lang->description}{nl2br($skin_info->maker->description)}
+ + + + + + + + + + + + + + + + + + +
{$lang->extra_vars}
{$lang->colorset} + + + {@ $_img_info = getImageSize($val->screenshot); $_height = $_img_info[1]+40; $_width = $_img_info[0]+20; $_talign = "center"; } + + {@ $_width = 200; $_height = 20; $_talign = "left"; } + +
+ colorset==$val->name)-->checked="checked"/> + + +
+ {$val->title} + +
+
+ +
{$val->title} + + + + + + + + + + + + + value))-->checked="checked" class="checkbox" /> + + + + + + + + value)-->checked="checked"/> + + + + + + + +
+
+ + +
+ + + + + + +

{nl2br($val->description)}

+ +
+ +
+ +
+
+ + diff --git a/modules/board/tpl/top_refresh.html b/modules/board/tpl/top_refresh.html new file mode 100644 index 000000000..2f4983d1d --- /dev/null +++ b/modules/board/tpl/top_refresh.html @@ -0,0 +1,3 @@ + diff --git a/modules/comment/comment.admin.controller.php b/modules/comment/comment.admin.controller.php new file mode 100644 index 000000000..a1b227f4f --- /dev/null +++ b/modules/comment/comment.admin.controller.php @@ -0,0 +1,52 @@ +stop('msg_cart_is_null'); + $comment_srl_list= explode('|@|', $cart); + $comment_count = count($comment_srl_list); + if(!$comment_count) return $this->stop('msg_cart_is_null'); + + $oCommentController = &getController('comment'); + + // 글삭제 + for($i=0;$i<$comment_count;$i++) { + $comment_srl = trim($comment_srl_list[$i]); + if(!$comment_srl) continue; + + $output = $oCommentController->deleteComment($comment_srl, true); + if(!$output->toBool()) return $output; + } + + $this->setMessage( sprintf(Context::getLang('msg_checked_comment_is_deleted'), $comment_count) ); + } + + /** + * @brief 특정 모듈의 모든 댓글 삭제 + **/ + function deleteModuleComments($module_srl) { + $args->module_srl = $module_srl; + $output = executeQuery('comment.deleteModuleComments', $args); + return $output; + } + + } +?> diff --git a/modules/comment/comment.admin.view.php b/modules/comment/comment.admin.view.php new file mode 100644 index 000000000..8be1af26e --- /dev/null +++ b/modules/comment/comment.admin.view.php @@ -0,0 +1,71 @@ +page = Context::get('page'); ///< 페이지 + $args->list_count = 50; ///< 한페이지에 보여줄 글 수 + $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 + + $args->sort_index = 'list_order'; ///< 소팅 값 + + $args->module_srl = Context::get('module_srl'); + + // mid목록을 구함 + $oModuleModel = &getModel('module'); + $mid_list = $oModuleModel->getMidList(); + Context::set('mid_list', $mid_list); + + // 목록 구함, comment->getCommentList 에서 걍 알아서 다 해버리는 구조이다... (아.. 이거 나쁜 버릇인데.. ㅡ.ㅜ 어쩔수 없다) + $oCommentModel = &getModel('comment'); + $output = $oCommentModel->getTotalCommentList($args); + + // 목록의 loop를 돌면서 mid를 구하기 위한 module_srl값을 구함 + $comment_count = count($output->data); + if($comment_count) { + $module_srl_list = array(); + foreach($output->data as $key => $val) { + $module_srl = $val->module_srl; + if(!in_array($module_srl, $module_srl_list)) $module_srl_list[] = $module_srl; + } + if(count($module_srl_list)) { + $args->module_srls = implode(',',$module_srl_list); + $mid_output = executeQuery('module.getModuleInfoByModuleSrl', $args); + if($mid_output->data && !is_array($mid_output->data)) $mid_output->data = array($mid_output->data); + for($i=0;$idata);$i++) { + $mid_info = $mid_output->data[$i]; + $module_list[$mid_info->module_srl] = $mid_info; + } + } + } + + // 템플릿에 쓰기 위해서 comment_model::getTotalCommentList() 의 return object에 있는 값들을 세팅 + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('comment_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + Context::set('module_list', $module_list); + + // 템플릿 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('comment_list'); + } + + } +?> diff --git a/modules/comment/comment.class.php b/modules/comment/comment.class.php new file mode 100644 index 000000000..7662f06f9 --- /dev/null +++ b/modules/comment/comment.class.php @@ -0,0 +1,36 @@ +insertActionForward('comment', 'view', 'dispCommentAdminList'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + + } +?> diff --git a/modules/comment/comment.controller.php b/modules/comment/comment.controller.php new file mode 100644 index 000000000..91f3b3225 --- /dev/null +++ b/modules/comment/comment.controller.php @@ -0,0 +1,244 @@ +content = removeHackTag($obj->content); + + // document_srl에 해당하는 글이 있는지 확인 + $document_srl = $obj->document_srl; + if(!$document_srl) return new Object(-1,'msg_invalid_document'); + + // document model 객체 생성 + $oDocumentModel = &getModel('document'); + + + // 원본글을 가져옴 + if(!$manual_inserted) { + $oDocument = $oDocumentModel->getDocument($document_srl); + + if($document_srl != $oDocument->document_srl) return new Object(-1,'msg_invalid_document'); + if($oDocument->isLocked()) return new Object(-1,'msg_invalid_request'); + + if($obj->password) $obj->password = md5($obj->password); + if($obj->homepage && !eregi('^http:\/\/',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; + + // 로그인 된 회원일 경우 회원의 정보를 입력 + if(Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + $obj->member_srl = $logged_info->member_srl; + $obj->user_id = $logged_info->user_id; + $obj->user_name = $logged_info->user_name; + $obj->nick_name = $logged_info->nick_name; + $obj->email_address = $logged_info->email_address; + $obj->homepage = $logged_info->homepage; + } + } + $obj->list_order = $obj->comment_srl * -1; + + // begin transaction + $oDB = &DB::getInstance(); + $oDB->begin(); + + // file의 Model객체 생성 + $oFileModel = &getModel('file'); + + // 첨부 파일의 갯수를 구함 + $obj->uploaded_count = $oFileModel->getFilesCount($obj->comment_srl); + + // 댓글을 입력 + $output = executeQuery('comment.insertComment', $obj); + + // 입력에 이상이 없으면 해당 글의 댓글 수를 올림 + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + if(!$manual_inserted) { + // comment model객체 생성 + $oCommentModel = &getModel('comment'); + + // 해당 글의 전체 댓글 수를 구해옴 + $comment_count = $oCommentModel->getCommentCount($document_srl); + + // document의 controller 객체 생성 + $oDocumentController = &getController('document'); + + // 해당글의 댓글 수를 업데이트 + $output = $oDocumentController->updateCommentCount($document_srl, $comment_count, true); + + // 댓글의 권한을 부여 + $this->addGrant($obj->comment_srl); + } + + // commit + $oDB->commit(); + + // 원본글에 알림(notify_message)가 설정되어 있으면 메세지 보냄 + if(!$manual_inserted) $oDocument->notify(Context::getLang('comment'), $obj->content); + + $output->add('comment_srl', $obj->comment_srl); + return $output; + } + + /** + * @brief 댓글 수정 + **/ + function updateComment($obj, $is_admin = false) { + $obj->content = removeHackTag($obj->content); + + // comment model 객체 생성 + $oCommentModel = &getModel('comment'); + + // 원본 데이터를 가져옴 + $source_obj = $oCommentModel->getComment($obj->comment_srl); + + // 권한이 있는지 확인 + if(!$is_admin && !$source_obj->is_granted) return new Object(-1, 'msg_not_permitted'); + + if($obj->password) $obj->password = md5($obj->password); + if($obj->homepage && !eregi('^http:\/\/',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; + + // 로그인 되어 있고 작성자와 수정자가 동일하면 수정자의 정보를 세팅 + if(Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + if($source_obj->member_srl == $logged_info->member_srl) { + $obj->member_srl = $logged_info->member_srl; + $obj->user_name = $logged_info->user_name; + $obj->nick_name = $logged_info->nick_name; + $obj->email_address = $logged_info->email_address; + $obj->homepage = $logged_info->homepage; + } + } + + // 로그인한 유저가 작성한 글인데 nick_name이 없을 경우 + if($source_obj->member_srl && !$obj->nick_name) { + $obj->member_srl = $source_obj->member_srl; + $obj->user_name = $source_obj->user_name; + $obj->nick_name = $source_obj->nick_name; + $obj->email_address = $source_obj->email_address; + $obj->homepage = $source_obj->homepage; + } + + // file의 Model객체 생성 + $oFileModel = &getModel('file'); + + // 첨부 파일의 갯수를 구함 + $obj->uploaded_count = $oFileModel->getFilesCount($obj->document_srl); + + // begin transaction + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 업데이트 + $output = executeQuery('comment.updateComment', $obj); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // commit + $oDB->commit(); + + $output->add('comment_srl', $obj->comment_srl); + return $output; + } + + /** + * @brief 댓글 삭제 + **/ + function deleteComment($comment_srl, $is_admin = false) { + // comment model 객체 생성 + $oCommentModel = &getModel('comment'); + + // 기존 댓글이 있는지 확인 + $comment = $oCommentModel->getComment($comment_srl); + if($comment->comment_srl != $comment_srl) return new Object(-1, 'msg_invalid_request'); + $document_srl = $comment->document_srl; + + // 해당 댓글에 child가 있는지 확인 + $child_count = $oCommentModel->getChildCommentCount($comment_srl); + if($child_count>0) return new Object(-1, 'fail_to_delete_have_children'); + + // 권한이 있는지 확인 + if(!$is_admin && !$comment->is_granted) return new Object(-1, 'msg_not_permitted'); + + // begin transaction + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 삭제 + $args->comment_srl = $comment_srl; + $output = executeQuery('comment.deleteComment', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 첨부 파일 삭제 + if($comment->uploaded_count) { + $oFileController = &getController('file'); + $oFileController->deleteFiles($comment->module_srl, $comment_srl); + } + + // 댓글 수를 구해서 업데이트 + $comment_count = $oCommentModel->getCommentCount($document_srl); + + // document의 controller 객체 생성 + $oDocumentController = &getController('document'); + + // 해당글의 댓글 수를 업데이트 + $output = $oDocumentController->updateCommentCount($document_srl, $comment_count); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // commit + $oDB->commit(); + + $output->add('document_srl', $document_srl); + return $output; + } + + /** + * @brief 특정 글의 모든 댓글 삭제 + **/ + function deleteComments($document_srl) { + // document model객체 생성 + $oDocumentModel = &getModel('document'); + + // 권한이 있는지 확인 + if(!$oDocumentModel->isGranted($document_srl)) return new Object(-1, 'msg_not_permitted'); + + // 삭제 + $args->document_srl = $document_srl; + $output = executeQuery('comment.deleteComments', $args); + return $output; + } + + } +?> diff --git a/modules/comment/comment.model.php b/modules/comment/comment.model.php new file mode 100644 index 000000000..5ac4f23f4 --- /dev/null +++ b/modules/comment/comment.model.php @@ -0,0 +1,233 @@ +comment_srl = $comment_srl; + $output = executeQuery('comment.getChildCommentCount', $args); + return (int)$output->data->count; + } + + /** + * @brief 댓글 가져오기 + **/ + function getComment($comment_srl, $is_admin = false) { + $args->comment_srl = $comment_srl; + $output = executeQuery('comment.getComment', $args); + $comment = $output->data; + + // 첨부파일 가져오기 + if($comment->uploaded_count) { + $oFileModel = &getModel('file'); + $file_list = $oFileModel->getFiles($comment_srl, $is_admin); + $comment->uploaded_list = $file_list; + } + + // 로그인 사용자의 경우 로그인 정보를 일단 구해 놓음 + $logged_info = Context::get('logged_info'); + + if($is_admin || $this->isGranted($comment_srl) || $comment->member_srl == $logged_info->member_srl) $comment->is_granted = true; + return $comment; + } + + /** + * @brief 여러개의 댓글들을 가져옴 (페이징 아님) + **/ + function getComments($comment_srl_list) { + if(is_array($comment_srl_list)) $comment_srls = implode(',',$comment_srl_list); + + $args->comment_srls = $comment_srls; + $output = executeQuery('comment.getComments', $args); + return $output->data; + } + + /** + * @brief document_srl 에 해당하는 댓글의 전체 갯수를 가져옴 + **/ + function getCommentCount($document_srl) { + $args->document_srl = $document_srl; + $output = executeQuery('comment.getCommentCount', $args); + $total_count = $output->data->count; + return (int)$total_count; + } + + /** + * @brief mid 에 해당하는 댓글을 가져옴 + **/ + function getNewestCommentList($obj) { + if($obj->mid) { + $oModuleModel = &getModel('module'); + $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); + unset($obj->mid); + } + + // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 + 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; + + $output = executeQuery('comment.getNewestCommentList', $args); + if(!$output->toBool()) return $output; + + return $output; + } + + /** + * @brief document_srl에 해당하는 문서의 댓글 목록을 가져옴 + **/ + function getCommentList($document_srl, $is_admin = false) { + $args->document_srl = $document_srl; + $args->list_order = 'list_order'; + $output = executeQuery('comment.getCommentList', $args); + if(!$output->toBool()) return $output; + + $source_list= $output->data; + if(!is_array($source_list)) $source_list = array($source_list); + + // 댓글를 계층형 구조로 정렬 + $comment_count = count($source_list); + + $root = NULL; + $list = NULL; + + // 로그인 사용자의 경우 로그인 정보를 일단 구해 놓음 + $logged_info = Context::get('logged_info'); + + // 첨부파일이 있을 경우를 대비한 File 모듈의 model객체 미리 생성 + $oFileModel = &getModel('file'); + + // loop를 돌면서 코멘트의 계층 구조 만듬 + for($i=$comment_count-1;$i>=0;$i--) { + $comment_srl = $source_list[$i]->comment_srl; + $parent_srl = $source_list[$i]->parent_srl; + $member_srl = $source_list[$i]->member_srl; + if(!$comment_srl) continue; + + if($is_admin || $this->isGranted($comment_srl) || $member_srl == $logged_info->member_srl) $source_list[$i]->is_granted = true; + + // 첨부파일 가져오기 + if($source_list[$i]->uploaded_count) { + $file_list = $oFileModel->getFiles($comment_srl, $is_admin); + $source_list[$i]->uploaded_list = $file_list; + } + + // 목록을 만듬 + $list[$comment_srl] = $source_list[$i]; + + if($parent_srl) { + $list[$parent_srl]->child[] = &$list[$comment_srl]; + } else { + $root->child[] = &$list[$comment_srl]; + } + } + $this->_arrangeComment($comment_list, $root->child, 0); + return $comment_list; + } + + /** + * @brief 댓글을 계층형으로 재배치 + **/ + function _arrangeComment(&$comment_list, $list, $depth) { + if(!count($list)) return; + foreach($list as $key => $val) { + if($val->child) { + $tmp = $val; + $tmp->depth = $depth; + $comment_list[$tmp->comment_srl] = $tmp; + $this->_arrangeComment($comment_list,$val->child,$depth+1); + } else { + $val->depth = $depth; + $comment_list[$val->comment_srl] = $val; + } + } + } + + /** + * @brief 모든 댓글를 시간 역순으로 가져옴 (관리자용) + **/ + function getTotalCommentList($obj) { + $query_id = 'comment.getTotalCommentList'; + + // 변수 설정 + $args->sort_index = 'list_order'; + $args->page = $obj->page?$obj->page:1; + $args->list_count = $obj->list_count?$obj->list_count:20; + $args->page_count = $obj->page_count?$obj->page_count:10; + $args->s_module_srl = $obj->module_srl; + + // 검색 옵션 정리 + $search_target = trim(Context::get('search_target')); + $search_keyword = trim(Context::get('search_keyword')); + if($search_target && $search_keyword) { + switch($search_target) { + case 'content' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_content = $search_keyword; + break; + case 'user_id' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_user_id = $search_keyword; + $query_id = 'comment.getTotalCommentListWithinMember'; + $args->sort_index = 'comments.list_order'; + break; + case 'user_name' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_user_name = $search_keyword; + break; + case 'nick_name' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_nick_name = $search_keyword; + break; + case 'email_address' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_email_address = $search_keyword; + break; + case 'homepage' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_homepage = $search_keyword; + break; + case 'regdate' : + $args->s_regdate = $search_keyword; + break; + case 'last_update' : + $args->s_last_upate = $search_keyword; + break; + case 'ipaddress' : + $args->s_ipaddress= $search_keyword; + break; + } + } + + // comment.getTotalCommentList 쿼리 실행 + $output = executeQuery($query_id, $args); + + // 결과가 없거나 오류 발생시 그냥 return + if(!$output->toBool()||!count($output->data)) return $output; + + return $output; + } + } +?> diff --git a/modules/comment/conf/info.xml b/modules/comment/conf/info.xml new file mode 100644 index 000000000..22e5ab205 --- /dev/null +++ b/modules/comment/conf/info.xml @@ -0,0 +1,20 @@ + + + 댓글 + コメント + 评论 + Comment + Commentarios + + 제로 + Zero + zero + zero + zero + 게시판이나 블로그등의 댓글을 관리하는 모듈입니다. + 掲示板やブログなどのコメントを管理するモジュールです。 + 管理版面或博客评论的模块。 + Module for managing board/blog's comments + Es el módulo para manejar commentarios en blog o boletínes. + + diff --git a/modules/comment/conf/module.xml b/modules/comment/conf/module.xml new file mode 100644 index 000000000..ca3eca318 --- /dev/null +++ b/modules/comment/conf/module.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/comment/lang/en.lang.php b/modules/comment/lang/en.lang.php new file mode 100644 index 000000000..50c7c4922 --- /dev/null +++ b/modules/comment/lang/en.lang.php @@ -0,0 +1,23 @@ + + * @brief comment module's basic language pack + **/ + $lang->cmd_delete_checked_comment = 'Delete selected item'; + + $lang->msg_cart_is_null = 'Please select an article to delete'; + $lang->msg_checked_comment_is_deleted = '%d comments were deleted successfully'; + + $lang->search_target_list = array( + 'content' => 'Content', + 'user_id' => 'ID', + 'user_name' => 'Name', + 'nick_name' => 'Nickname', + 'email_address' => 'Email', + 'homepage' => 'Homepage', + 'regdate' => 'Date', + 'last_update' => 'Last update', + 'ipaddress' => 'IP Address', + ); +?> diff --git a/modules/comment/lang/es.lang.php b/modules/comment/lang/es.lang.php new file mode 100644 index 000000000..cf3d28933 --- /dev/null +++ b/modules/comment/lang/es.lang.php @@ -0,0 +1,23 @@ + + * @brief Paquete lingual de módulo commentario. + **/ + $lang->cmd_delete_checked_comment = 'Eliminar la selección'; + + $lang->msg_cart_is_null = 'Seleccióna el commentario desea eliminar'; + $lang->msg_checked_comment_is_deleted = '%d commentarios ha eliminado.'; + + $lang->search_target_list = array( + 'content' => 'Contenido', + 'user_id' => 'ID', + 'user_name' => 'Nombre', + 'nick_name' => 'Apodo', + 'email_address' => 'Correo Electrónico', + 'homepage' => 'Pagina de web', + 'regdate' => 'Fecha de registro', + 'last_update' => 'Ultima actualización', + 'ipaddress' => 'Dirección IP', + ); +?> diff --git a/modules/comment/lang/jp.lang.php b/modules/comment/lang/jp.lang.php new file mode 100644 index 000000000..ce7cfe65b --- /dev/null +++ b/modules/comment/lang/jp.lang.php @@ -0,0 +1,23 @@ + 翻訳:RisaPapa + * @brief コメント(comment) モジュールの基本言語パッケージ + **/ + $lang->cmd_delete_checked_comment = '選択項目削除'; + + $lang->msg_cart_is_null = '削除するコメントを選択してください'; + $lang->msg_checked_comment_is_deleted = '%d個のコメントを削除しました'; + + $lang->search_target_list = array( + 'content' => '内容', + 'user_id' => 'ユーザID', + 'user_name' => '名前', + 'nick_name' => 'ニックネーム', + 'email_address' => 'メールアドレス', + 'homepage' => 'ホームページ', + 'regdate' => '登録日', + 'last_update' => '最終更新日 ', + 'ipaddress' => 'IPアドレス', + ); +?> diff --git a/modules/comment/lang/ko.lang.php b/modules/comment/lang/ko.lang.php new file mode 100644 index 000000000..26b750520 --- /dev/null +++ b/modules/comment/lang/ko.lang.php @@ -0,0 +1,23 @@ + + * @brief 댓글(comment) 모듈의 기본 언어팩 + **/ + $lang->cmd_delete_checked_comment = '선택항목 삭제'; + + $lang->msg_cart_is_null = '삭제할 글을 선택해주세요'; + $lang->msg_checked_comment_is_deleted = '%d개의 댓글이 삭제되었습니다'; + + $lang->search_target_list = array( + 'content' => '내용', + 'user_id' => '아이디', + 'user_name' => '이름', + 'nick_name' => '닉네임', + 'email_address' => '이메일주소', + 'homepage' => '홈페이지', + 'regdate' => '등록일', + 'last_update' => '최근수정일 ', + 'ipaddress' => 'IP 주소', + ); +?> diff --git a/modules/comment/lang/zh-CN.lang.php b/modules/comment/lang/zh-CN.lang.php new file mode 100644 index 000000000..58da146c3 --- /dev/null +++ b/modules/comment/lang/zh-CN.lang.php @@ -0,0 +1,23 @@ + + * @brief 评论(comment)模块语言包 + **/ + $lang->cmd_delete_checked_comment = '删除所选项目'; + + $lang->msg_cart_is_null = '请选择要删除的评论。'; + $lang->msg_checked_comment_is_deleted = '已删除%d个评论。'; + + $lang->search_target_list = array( + 'content' => '内容', + 'user_id' => 'I D', + 'user_name' => '姓名', + 'nick_name' => '昵称', + 'email_address' => '电子信箱', + 'homepage' => '主页', + 'regdate' => '日期', + 'last_update' => '最后更新 ', + 'ipaddress' => 'IP 地址', + ); +?> diff --git a/modules/comment/queries/deleteComment.xml b/modules/comment/queries/deleteComment.xml new file mode 100644 index 000000000..73631c7d6 --- /dev/null +++ b/modules/comment/queries/deleteComment.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/comment/queries/deleteComments.xml b/modules/comment/queries/deleteComments.xml new file mode 100644 index 000000000..1ea7d0c53 --- /dev/null +++ b/modules/comment/queries/deleteComments.xml @@ -0,0 +1,8 @@ + + +
+ + + + + diff --git a/modules/comment/queries/deleteModuleComments.xml b/modules/comment/queries/deleteModuleComments.xml new file mode 100644 index 000000000..809ec9294 --- /dev/null +++ b/modules/comment/queries/deleteModuleComments.xml @@ -0,0 +1,8 @@ + + +
+ + + + + diff --git a/modules/comment/queries/getChildCommentCount.xml b/modules/comment/queries/getChildCommentCount.xml new file mode 100644 index 000000000..7ea9ce02e --- /dev/null +++ b/modules/comment/queries/getChildCommentCount.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/comment/queries/getComment.xml b/modules/comment/queries/getComment.xml new file mode 100644 index 000000000..bca549fe5 --- /dev/null +++ b/modules/comment/queries/getComment.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/comment/queries/getCommentCount.xml b/modules/comment/queries/getCommentCount.xml new file mode 100644 index 000000000..f255af770 --- /dev/null +++ b/modules/comment/queries/getCommentCount.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/comment/queries/getCommentList.xml b/modules/comment/queries/getCommentList.xml new file mode 100644 index 000000000..a7461f7f8 --- /dev/null +++ b/modules/comment/queries/getCommentList.xml @@ -0,0 +1,14 @@ + + +
+ + + + + + + + + + + diff --git a/modules/comment/queries/getComments.xml b/modules/comment/queries/getComments.xml new file mode 100644 index 000000000..b7adc8ece --- /dev/null +++ b/modules/comment/queries/getComments.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/comment/queries/getNewestCommentList.xml b/modules/comment/queries/getNewestCommentList.xml new file mode 100644 index 000000000..4d1acb679 --- /dev/null +++ b/modules/comment/queries/getNewestCommentList.xml @@ -0,0 +1,15 @@ + + +
+ + + + + + + + + + + + diff --git a/modules/comment/queries/getTotalCommentList.xml b/modules/comment/queries/getTotalCommentList.xml new file mode 100644 index 000000000..f3daff1a5 --- /dev/null +++ b/modules/comment/queries/getTotalCommentList.xml @@ -0,0 +1,27 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/comment/queries/getTotalCommentListWithinMember.xml b/modules/comment/queries/getTotalCommentListWithinMember.xml new file mode 100644 index 000000000..517833f6f --- /dev/null +++ b/modules/comment/queries/getTotalCommentListWithinMember.xml @@ -0,0 +1,29 @@ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/comment/queries/insertComment.xml b/modules/comment/queries/insertComment.xml new file mode 100644 index 000000000..75618f34f --- /dev/null +++ b/modules/comment/queries/insertComment.xml @@ -0,0 +1,23 @@ + + +
+ + + + + + + + + + + + + + + + + + + + diff --git a/modules/comment/queries/updateComment.xml b/modules/comment/queries/updateComment.xml new file mode 100644 index 000000000..1eb1bbf40 --- /dev/null +++ b/modules/comment/queries/updateComment.xml @@ -0,0 +1,21 @@ + + +
+ + + + + + + + + + + + + + + + + + diff --git a/modules/comment/queries/updateCommentModule.xml b/modules/comment/queries/updateCommentModule.xml new file mode 100644 index 000000000..8c1aa7872 --- /dev/null +++ b/modules/comment/queries/updateCommentModule.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/comment/schemas/comments.xml b/modules/comment/schemas/comments.xml new file mode 100644 index 000000000..b2071e9b8 --- /dev/null +++ b/modules/comment/schemas/comments.xml @@ -0,0 +1,20 @@ +
+ + + + + + + + + + + + + + + + + + +
diff --git a/modules/comment/tpl/comment_list.html b/modules/comment/tpl/comment_list.html new file mode 100644 index 000000000..33bb15810 --- /dev/null +++ b/modules/comment/tpl/comment_list.html @@ -0,0 +1,96 @@ + + + +

{$lang->comment} {$lang->cmd_management}

+ + +
+ Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)} +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ GO +
+
{$lang->user_name}{$lang->date}{$lang->last_update}{$lang->ipaddress}{$lang->cmd_move}
+ {$no} + {htmlspecialchars($module_list[$val->module_srl]->browser_title)}
{htmlspecialchars($val->nick_name)}
{zdate($val->regdate,"Y-m-d")}{zdate($val->last_upgdate,"Y-m-d")} {$val->ipaddress}{$lang->cmd_move}
+ + {cut_str(htmlspecialchars(strip_tags($val->content)),100,'...')} +
+ + +
+ +
+ +
+ + + + + +
+ + + + +
+ + + + {$lang->cmd_cancel} +
+
diff --git a/modules/comment/tpl/filter/delete_checked.xml b/modules/comment/tpl/filter/delete_checked.xml new file mode 100644 index 000000000..b54965ed0 --- /dev/null +++ b/modules/comment/tpl/filter/delete_checked.xml @@ -0,0 +1,12 @@ + +
+ + + + + + + + + +
diff --git a/modules/comment/tpl/js/comment_admin.js b/modules/comment/tpl/js/comment_admin.js new file mode 100644 index 000000000..92eff1785 --- /dev/null +++ b/modules/comment/tpl/js/comment_admin.js @@ -0,0 +1,6 @@ +function doCheckAll() { + var fo_obj = xGetElementById('fo_list'); + for(var i=0;i + + 기본 카운터 + 访问统计 + Basic Counter + Taquilla Basico + 接続カウンター + + 제로 + zero + Zero + zero + Zero + 기본 접속 통계 프로그램입니다. + 默认访问统计程序。 + Basic connection statistics program. + Es la programa basica para conecciónes estaticos. + 接続統計のプログラムです。 + + diff --git a/modules/counter/conf/module.xml b/modules/counter/conf/module.xml new file mode 100644 index 000000000..8b9f46eca --- /dev/null +++ b/modules/counter/conf/module.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/counter/counter.admin.view.php b/modules/counter/counter.admin.view.php new file mode 100644 index 000000000..821804984 --- /dev/null +++ b/modules/counter/counter.admin.view.php @@ -0,0 +1,46 @@ +setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 관리자 페이지 초기화면 + **/ + function dispCounterAdminIndex() { + // 정해진 일자가 없으면 오늘자로 설정 + $selected_date = Context::get('selected_date'); + if(!$selected_date) $selected_date = date("Ymd"); + Context::set('selected_date', $selected_date); + + // counter model 객체 생성 + $oCounterModel = &getModel('counter'); + + // 전체 카운터 및 지정된 일자의 현황 가져오기 + $status = $oCounterModel->getStatus(array(0,$selected_date)); + Context::set('total_counter', $status[0]); + Context::set('selected_day_counter', $status[$selected_date]); + + // 시간, 일, 월, 년도별로 데이터 가져오기 + $type = Context::get('type'); + if(!$type) $type = 'hour'; + $detail_status = $oCounterModel->getHourlyStatus($type, $selected_date); + Context::set('detail_status', $detail_status); + + // 표시 + $this->setTemplateFile('index'); + } + + } +?> diff --git a/modules/counter/counter.class.php b/modules/counter/counter.class.php new file mode 100644 index 000000000..1785162fe --- /dev/null +++ b/modules/counter/counter.class.php @@ -0,0 +1,44 @@ +insertActionForward('counter', 'view', 'dispCounterAdminIndex'); + + $oCounterController = &getController('counter'); + + // 0 일자로 기록될 전체 방문 기록 row 추가 + $oCounterController->insertTotalStatus(); + + // 오늘자 row입력 + $oCounterController->insertTodayStatus(); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + + } +?> diff --git a/modules/counter/counter.controller.php b/modules/counter/counter.controller.php new file mode 100644 index 000000000..5ef99c9cf --- /dev/null +++ b/modules/counter/counter.controller.php @@ -0,0 +1,100 @@ +begin(); + + // 로그를 검사 + $oCounterModel = &getModel('counter'); + + // 오늘자 row가 있는지 체크하여 없으면 등록 + if(!$oCounterModel->isInsertedTodayStatus()) { + $this->insertTodayStatus(); + + // 기존 row가 있으면 사용자 체크 + } else { + + // 등록되어 있지 않은 아이피일 경우 + if(!$oCounterModel->isLogged()) { + // 로그 등록 + $this->insertLog(); + + // unique 및 pageview 등록 + $this->insertUniqueVisitor(); + } else { + // pageview 등록 + $this->insertPageView(); + } + } + + $oDB->commit(); + } + + /** + * @brief 로그 등록 + **/ + function insertLog() { + $args->regdate = date("YmdHis"); + $args->user_agent = $_SERVER['HTTP_USER_AGENT']; + return executeQuery('counter.insertCounterLog', $args); + } + + /** + * @brief unique visitor 등록 + **/ + function insertUniqueVisitor() { + $args->regdate = date("Ymd"); + executeQuery('counter.updateCounterUnique', $args); + executeQuery('counter.updateTotalCounterUnique'); + } + + /** + * @brief pageview 등록 + **/ + function insertPageView() { + $args->regdate = date("Ymd"); + executeQuery('counter.updateCounterPageview', $args); + executeQuery('counter.updateTotalCounterPageview'); + } + + /** + * @brief 전체 카운터 status 추가 + **/ + function insertTotalStatus() { + $args->regdate = 0; + executeQuery('counter.insertTodayStatus', $args); + } + + /** + * @brief 오늘자 카운터 status 추가 + **/ + function insertTodayStatus($regdate = 0) { + if($regdate) $args->regdate = $regdate; + else $args->regdate = date("Ymd"); + executeQuery('counter.insertTodayStatus', $args); + + // 로그 등록 + $this->insertLog(); + + // unique 및 pageview 등록 + $this->insertUniqueVisitor(); + } + } +?> diff --git a/modules/counter/counter.model.php b/modules/counter/counter.model.php new file mode 100644 index 000000000..4647b2815 --- /dev/null +++ b/modules/counter/counter.model.php @@ -0,0 +1,132 @@ +regdate = date("Ymd"); + $args->ipaddress = $_SERVER['REMOTE_ADDR']; + $output = executeQuery('counter.getCounterLog', $args); + return $output->data->count?true:false; + } + + /** + * @brief 오늘자 카운터 현황 row 있는지 체크 + **/ + function isInsertedTodayStatus() { + $args->regdate = date("Ymd"); + $output = executeQuery('counter.getTodayStatus', $args); + return $output->data->count?true:false; + } + + /** + * @brief 특정 일의 접속 통계를 가져옴 + **/ + function getStatus($selected_date) { + // 여러개의 날짜 로그를 가져올 경우 + if(is_array($selected_date)) { + $date_count = count($selected_date); + $args->regdate = implode(',',$selected_date); + + // 단일 날짜의 로그를 가져올 경우 + } else { + if(strlen($selected_date)==8) $selected_date = $selected_date; + $args->regdate = $selected_date; + } + + $output = executeQuery('counter.getCounterStatus', $args); + $status = $output->data; + + if(!is_array($selected_date)) return $status; + + if(!is_array($status)) $status = array($status); + unset($output); + + foreach($status as $key => $val) { + $output[substr($val->regdate,0,8)] = $val; + } + return $output; + } + + /** + * @brief 지정된 일자의 시간대별 로그 가져오기 + **/ + function getHourlyStatus($type='hour', $selected_date) { + $max = 0; + $sum = 0; + switch($type) { + case 'year' : + // 카운터 시작일 구함 + $output = executeQuery('counter.getStartLogDate'); + $start_year = substr($output->data->regdate,0,4); + if(!$start_year) $start_year = date("Y"); + for($i=$start_year;$i<=date("Y");$i++) { + unset($args); + $args->regdate = sprintf('%04d', $i); + $output = executeQuery('counter.getCounterLog', $args); + $count = (int)$output->data->count; + $status->list[$i] = $count; + if($count>$max) $max = $count; + $sum += $count; + } + break; + break; + case 'month' : + $year = substr($selected_date, 0, 4); + for($i=1;$i<=12;$i++) { + unset($args); + $args->regdate = sprintf('%04d%02d', $year, $i); + $output = executeQuery('counter.getCounterLog', $args); + $count = (int)$output->data->count; + $status->list[$i] = $count; + if($count>$max) $max = $count; + $sum += $count; + } + break; + case 'day' : + $year = substr($selected_date, 0, 4); + $month = substr($selected_date, 4, 2); + $end_day = date('t', mktime(0,0,0,$month,1,$year)); + for($i=1;$i<=$end_day;$i++) { + unset($args); + $args->regdate = sprintf('%04d%02d%02d', $year, $month, $i); + $output = executeQuery('counter.getCounterLog', $args); + $count = (int)$output->data->count; + $status->list[$i] = $count; + if($count>$max) $max = $count; + $sum += $count; + } + break; + default : + for($i=0;$i<24;$i++) { + unset($args); + $args->regdate = sprintf('%08d%02d', $selected_date, $i); + $output = executeQuery('counter.getCounterLog', $args); + $count = (int)$output->data->count; + $status->list[$i] = $count; + if($count>$max) $max = $count; + $sum += $count; + } + break; + } + + $status->max = $max; + $status->sum = $sum; + return $status; + } + + } +?> diff --git a/modules/counter/lang/en.lang.php b/modules/counter/lang/en.lang.php new file mode 100644 index 000000000..cb38483fa --- /dev/null +++ b/modules/counter/lang/en.lang.php @@ -0,0 +1,22 @@ + + * @brief English Language Pack (Only basic contents are listed) + **/ + + $lang->counter = "Counter"; + $lang->cmd_select_date = 'Select date'; + $lang->cmd_select_counter_type = array( + 'hour' => 'By hour', + 'day' => 'By day', + 'month' => 'By month', + 'year' => 'By year', + ); + + $lang->total_counter = 'Total status'; + $lang->selected_day_counter = 'Selected day status'; + + $lang->unique_visitor = 'Visitor'; + $lang->pageview = 'Pageview'; +?> diff --git a/modules/counter/lang/es.lang.php b/modules/counter/lang/es.lang.php new file mode 100644 index 000000000..6631260fc --- /dev/null +++ b/modules/counter/lang/es.lang.php @@ -0,0 +1,22 @@ + + * @brief Paquete lingual de taquilla + **/ + + $lang->counter = "Taquilla"; + $lang->cmd_select_date = 'Seleccióna Fecha'; + $lang->cmd_select_counter_type = array( + 'hour' => 'horas', + 'day' => 'dias', + 'month' => 'mes', + 'year' => 'año', + ); + + $lang->total_counter = 'Visitantes en total'; + $lang->selected_day_counter = 'Visitantes en diario'; + + $lang->unique_visitor = 'Visitas unicos'; + $lang->pageview = 'Páginas/visita'; +?> diff --git a/modules/counter/lang/jp.lang.php b/modules/counter/lang/jp.lang.php new file mode 100644 index 000000000..a67623130 --- /dev/null +++ b/modules/counter/lang/jp.lang.php @@ -0,0 +1,22 @@ + 翻訳:RisaPapa + * @brief 日本語言語パッケージ(基本的な内容のみ) + **/ + + $lang->counter = "カウンター"; + $lang->cmd_select_date = '年月日選択'; + $lang->cmd_select_counter_type = array( + 'hour' => '時間帯別', + 'day' => '日別', + 'month' => '月別', + 'year' => '年度別', + ); + + $lang->total_counter = 'トータル'; + $lang->selected_day_counter = '選択日の情報'; + + $lang->unique_visitor = '訪問者'; + $lang->pageview = 'ページビュー'; +?> diff --git a/modules/counter/lang/ko.lang.php b/modules/counter/lang/ko.lang.php new file mode 100644 index 000000000..b55e4c71f --- /dev/null +++ b/modules/counter/lang/ko.lang.php @@ -0,0 +1,22 @@ + + * @brief 한국어 언어팩 (기본적인 내용만 수록) + **/ + + $lang->counter = "카운터"; + $lang->cmd_select_date = '날짜 선택'; + $lang->cmd_select_counter_type = array( + 'hour' => '시간대별', + 'day' => '일별', + 'month' => '월별', + 'year' => '년도별', + ); + + $lang->total_counter = '전체현황'; + $lang->selected_day_counter = '선택일 현황'; + + $lang->unique_visitor = '방문자'; + $lang->pageview = '페이지뷰'; +?> diff --git a/modules/counter/lang/zh-CN.lang.php b/modules/counter/lang/zh-CN.lang.php new file mode 100644 index 000000000..64e219cc5 --- /dev/null +++ b/modules/counter/lang/zh-CN.lang.php @@ -0,0 +1,22 @@ + + * @brief 简体中文语言包 + **/ + + $lang->counter = "访问统计"; + $lang->cmd_select_date = '选择日期'; + $lang->cmd_select_counter_type = array( + 'hour' => '按时', + 'day' => '按天', + 'month' => '按月', + 'year' => '按年度', + ); + + $lang->total_counter = '总揽'; + $lang->selected_day_counter = '指定日概况'; + + $lang->unique_visitor = '访问者'; + $lang->pageview = '页面浏览'; +?> diff --git a/modules/counter/queries/getCounterLog.xml b/modules/counter/queries/getCounterLog.xml new file mode 100644 index 000000000..c71d3907a --- /dev/null +++ b/modules/counter/queries/getCounterLog.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/modules/counter/queries/getCounterStatus.xml b/modules/counter/queries/getCounterStatus.xml new file mode 100644 index 000000000..475629fdc --- /dev/null +++ b/modules/counter/queries/getCounterStatus.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/counter/queries/getStartLogDate.xml b/modules/counter/queries/getStartLogDate.xml new file mode 100644 index 000000000..675d2aac8 --- /dev/null +++ b/modules/counter/queries/getStartLogDate.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/counter/queries/getTodayStatus.xml b/modules/counter/queries/getTodayStatus.xml new file mode 100644 index 000000000..dc1988c04 --- /dev/null +++ b/modules/counter/queries/getTodayStatus.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/counter/queries/insertCounterLog.xml b/modules/counter/queries/insertCounterLog.xml new file mode 100644 index 000000000..d46a6739d --- /dev/null +++ b/modules/counter/queries/insertCounterLog.xml @@ -0,0 +1,10 @@ + + +
+ + + + + + + diff --git a/modules/counter/queries/insertTodayStatus.xml b/modules/counter/queries/insertTodayStatus.xml new file mode 100644 index 000000000..e1d1bdbb2 --- /dev/null +++ b/modules/counter/queries/insertTodayStatus.xml @@ -0,0 +1,10 @@ + + +
+ + + + + + + diff --git a/modules/counter/queries/updateCounterPageview.xml b/modules/counter/queries/updateCounterPageview.xml new file mode 100644 index 000000000..d4ec933b4 --- /dev/null +++ b/modules/counter/queries/updateCounterPageview.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/counter/queries/updateCounterUnique.xml b/modules/counter/queries/updateCounterUnique.xml new file mode 100644 index 000000000..2cdfe6048 --- /dev/null +++ b/modules/counter/queries/updateCounterUnique.xml @@ -0,0 +1,12 @@ + + +
+ + + + + + + + + diff --git a/modules/counter/queries/updateTotalCounterPageview.xml b/modules/counter/queries/updateTotalCounterPageview.xml new file mode 100644 index 000000000..ed4732972 --- /dev/null +++ b/modules/counter/queries/updateTotalCounterPageview.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/counter/queries/updateTotalCounterUnique.xml b/modules/counter/queries/updateTotalCounterUnique.xml new file mode 100644 index 000000000..5c4e99d7d --- /dev/null +++ b/modules/counter/queries/updateTotalCounterUnique.xml @@ -0,0 +1,12 @@ + + +
+ + + + + + + + + diff --git a/modules/counter/schemas/counter_log.xml b/modules/counter/schemas/counter_log.xml new file mode 100644 index 000000000..305d6c704 --- /dev/null +++ b/modules/counter/schemas/counter_log.xml @@ -0,0 +1,5 @@ +
+ + + +
diff --git a/modules/counter/schemas/counter_status.xml b/modules/counter/schemas/counter_status.xml new file mode 100644 index 000000000..a9cf7dbb7 --- /dev/null +++ b/modules/counter/schemas/counter_status.xml @@ -0,0 +1,5 @@ + + + + +
diff --git a/modules/counter/tpl/images/blank.gif b/modules/counter/tpl/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/modules/counter/tpl/images/blank.gif differ diff --git a/modules/counter/tpl/images/buttonCalendar.gif b/modules/counter/tpl/images/buttonCalendar.gif new file mode 100644 index 000000000..43dc19718 Binary files /dev/null and b/modules/counter/tpl/images/buttonCalendar.gif differ diff --git a/modules/counter/tpl/images/buttonLeft.gif b/modules/counter/tpl/images/buttonLeft.gif new file mode 100644 index 000000000..ffcc2e499 Binary files /dev/null and b/modules/counter/tpl/images/buttonLeft.gif differ diff --git a/modules/counter/tpl/images/buttonRight.gif b/modules/counter/tpl/images/buttonRight.gif new file mode 100644 index 000000000..dc5373c14 Binary files /dev/null and b/modules/counter/tpl/images/buttonRight.gif differ diff --git a/modules/counter/tpl/images/iconBar.gif b/modules/counter/tpl/images/iconBar.gif new file mode 100644 index 000000000..4d944ff48 Binary files /dev/null and b/modules/counter/tpl/images/iconBar.gif differ diff --git a/modules/counter/tpl/index.html b/modules/counter/tpl/index.html new file mode 100644 index 000000000..16abf5f8c --- /dev/null +++ b/modules/counter/tpl/index.html @@ -0,0 +1,71 @@ + + +

{$lang->counter} {$lang->cmd_management}

+ +
+ + + + + + + + + + + + +
{$lang->total_counter}Visitor {number_format($total_counter->unique_visitor)}  /  Pageview : {number_format($total_counter->pageview)}{zdate($selected_date, "Y-m-d")} | calendarVisitor : {number_format($selected_day_counter->unique_visitor)}  /  Pageview : {number_format($selected_day_counter->pageview)}
+ + +
+ + + +
+ + + +
+ + + + +++ + + {@$percent = sprintf("%0.2f", $val / $detail_status->sum * 100 )} + {@$img_width = sprintf("%0.0f", $val / $detail_status->max * 100 )} + + {@$percent = 0} + {@$img_width = 1} + + + + + + +
+ + + {$key} {$lang->unit_year} + + {$key} {$lang->unit_month} + + {$key} {$lang->unit_day} + + {$key} {$lang->unit_hour} + + +
+ +
+ {number_format($val)} ({$percent}%) +
+
+
diff --git a/modules/counter/tpl/js/counter.js b/modules/counter/tpl/js/counter.js new file mode 100644 index 000000000..b6a4ec9bf --- /dev/null +++ b/modules/counter/tpl/js/counter.js @@ -0,0 +1,14 @@ +/** + * @brief 카운터 정보 수집 javascript + * window.onload 이벤트 후에 counter 모듈을 호출한다. + **/ + +// 이벤트 등록 +xAddEventListener(window,'load',doCallCounter); + +// counter 모듈을 호출하는 함수 +function doCallCounter() { + show_waiting_message = false; + exec_xml('counter','procCounterExecute'); + show_waiting_message = true; +} diff --git a/modules/counter/tpl/js/counter_admin.js b/modules/counter/tpl/js/counter_admin.js new file mode 100644 index 000000000..5ae0adfd1 --- /dev/null +++ b/modules/counter/tpl/js/counter_admin.js @@ -0,0 +1,6 @@ +// 관리자 페이지에서 날짜 이동 +function changeSelectedDate(selected_date) { + var fo_obj = xGetElementById('fo_counter'); + fo_obj.selected_date.value = selected_date; + fo_obj.submit(); +} diff --git a/modules/document/conf/info.xml b/modules/document/conf/info.xml new file mode 100644 index 000000000..b9159dafa --- /dev/null +++ b/modules/document/conf/info.xml @@ -0,0 +1,20 @@ + + + 문서 + Document + Documento + 主题 + コンテンツ + + 제로 + Zero + zero + zero + Zero + 게시판, 블로그등의 모듈에서 사용되는 문서를 관리하는 모듈입니다. + Module for managing documents used in board, blog, etc. + Es el módulo para manejar documentos en blog y boletínes. + 管理版面,博客等处主题的模块。 + 掲示板、ブログなどのモジュルで使用されるドキュメント(書き込み)を管理するモジュルです。 + + diff --git a/modules/document/conf/module.xml b/modules/document/conf/module.xml new file mode 100644 index 000000000..e86b2095e --- /dev/null +++ b/modules/document/conf/module.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/modules/document/document.admin.controller.php b/modules/document/document.admin.controller.php new file mode 100644 index 000000000..fab08ee6c --- /dev/null +++ b/modules/document/document.admin.controller.php @@ -0,0 +1,255 @@ +stop('msg_cart_is_null'); + $document_srl_list= explode('|@|', $cart); + $document_count = count($document_srl_list); + if(!$document_count) return $this->stop('msg_cart_is_null'); + + // 글삭제 + $oDocumentController = &getController('document'); + for($i=0;$i<$document_count;$i++) { + $document_srl = trim($document_srl_list[$i]); + if(!$document_srl) continue; + + $oDocumentController->deleteDocument($document_srl, true); + } + + $this->setMessage( sprintf(Context::getLang('msg_checked_document_is_deleted'), $document_count) ); + } + + /** + * @brief 특정 게시물들의 소속 모듈 변경 (게시글 이동시에 사용) + **/ + function moveDocumentModule($document_srl_list, $module_srl, $source_module_srl) { + $args->document_srls = implode(',',$document_srl_list); + $args->module_srl = $module_srl; + + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 게시물의 이동 + $output = executeQuery('document.updateDocumentModule', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 댓글의 이동 + $output = executeQuery('comment.updateCommentModule', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 엮인글의 이동 + $output = executeQuery('trackback.updateTrackbackModule', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 태그 + $output = executeQuery('tag.updateTagModule', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 첨부파일의 이동 (다운로드나 본문 첨부의 문제로 인하여 첨부파일은 이동하지 않기로 결정. 차후에 다시 고민) + /* + $image_dir = sprintf('./files/attach/images/%s/%s/', $source_module_srl, $document_srl); + $binary_dir = sprintf('./files/attach/binaries/%s/%s/', $source_module_srl, $document_srl); + + $target_image_dir = sprintf('./files/attach/images/%s/%s/', $module_srl, $document_srl); + $target_binary_dir = sprintf('./files/attach/binaries/%s/%s/', $module_srl, $document_srl); + + if(is_dir($image_dir)) { + FileHandler::moveDir($image_dir, $target_image_dir); + if(!is_dir($target_image_dir)) { + $oDB->rollback(); + return new Object(-1,'fail'); + } + } + + if(is_dir($binary_dir)) { + FileHandler::moveDir($binary_dir, $target_binary_dir); + if(!is_dir($target_binary_dir)) { + $oDB->rollback(); + return new Object(-1,'fail'); + } + } + */ + + $oDB->commit(); + return new Object(); + } + + /** + * @brief 특정 모듈의 전체 문서 삭제 + **/ + function deleteModuleDocument($module_srl) { + $args->module_srl = $module_srl; + $output = executeQuery('document.deleteModuleDocument', $args); + return $output; + } + + /** + * @brief 카테고리 추가 + **/ + function insertCategory($module_srl, $title, $category_srl = 0) { + if(!$category_srl) $args->list_order = $args->category_srl = getNextSequence(); + else $args->list_order = $args->category_srl = $category_srl; + + $args->module_srl = $module_srl; + $args->title = $title; + $args->document_count = 0; + + $output = executeQuery('document.insertCategory', $args); + if($output->toBool()) $output->add('category_srl', $args->category_srl); + + return $output; + } + + /** + * @brief 카테고리 정보 수정 + **/ + function updateCategory($args) { + return executeQuery('document.updateCategory', $args); + } + + /** + * @brief 카테고리 삭제 + **/ + function deleteCategory($category_srl) { + $args->category_srl = $category_srl; + + // 카테고리 정보를 삭제 + $output = executeQuery('document.deleteCategory', $args); + if(!$output->toBool()) return $output; + + // 현 카테고리 값을 가지는 문서들의 category_srl을 0 으로 세팅 + unset($args); + + $args->target_category_srl = 0; + $args->source_category_srl = $category_srl; + $output = executeQuery('document.updateDocumentCategory', $args); + return $output; + } + + /** + * @brief 특정 모듈의 카테고리를 모두 삭제 + **/ + function deleteModuleCategory($module_srl) { + $args->module_srl = $module_srl; + $output = executeQuery('document.deleteModuleCategory', $args); + return $output; + } + + /** + * @brief 카테고리를 상단으로 이동 + **/ + function moveCategoryUp($category_srl) { + $oDocumentModel = &getModel('document'); + + // 선택된 카테고리의 정보를 구한다 + $args->category_srl = $category_srl; + $output = executeQuery('document.getCategory', $args); + + $category = $output->data; + $list_order = $category->list_order; + $module_srl = $category->module_srl; + + // 전체 카테고리 목록을 구한다 + $category_list = $oDocumentModel->getCategoryList($module_srl); + $category_srl_list = array_keys($category_list); + if(count($category_srl_list)<2) return new Object(); + + $prev_category = NULL; + foreach($category_list as $key => $val) { + if($key==$category_srl) break; + $prev_category = $val; + } + + // 이전 카테고리가 없으면 그냥 return + if(!$prev_category) return new Object(-1,Context::getLang('msg_category_not_moved')); + + // 선택한 카테고리가 가장 위의 카테고리이면 그냥 return + if($category_srl_list[0]==$category_srl) return new Object(-1,Context::getLang('msg_category_not_moved')); + + // 선택한 카테고리의 정보 + $cur_args->category_srl = $category_srl; + $cur_args->list_order = $prev_category->list_order; + $cur_args->title = $category->title; + $this->updateCategory($cur_args); + + // 대상 카테고리의 정보 + $prev_args->category_srl = $prev_category->category_srl; + $prev_args->list_order = $list_order; + $prev_args->title = $prev_category->title; + $this->updateCategory($prev_args); + + return new Object(); + } + + /** + * @brief 카테고리를 아래로 이동 + **/ + function moveCategoryDown($category_srl) { + $oDocumentModel = &getModel('document'); + + // 선택된 카테고리의 정보를 구한다 + $args->category_srl = $category_srl; + $output = executeQuery('document.getCategory', $args); + + $category = $output->data; + $list_order = $category->list_order; + $module_srl = $category->module_srl; + + // 전체 카테고리 목록을 구한다 + $category_list = $oDocumentModel->getCategoryList($module_srl); + $category_srl_list = array_keys($category_list); + if(count($category_srl_list)<2) return new Object(); + + for($i=0;$icategory_srl = $category_srl; + $cur_args->list_order = $next_category->list_order; + $cur_args->title = $category->title; + $this->updateCategory($cur_args); + + // 대상 카테고리의 정보 + $next_args->category_srl = $next_category->category_srl; + $next_args->list_order = $list_order; + $next_args->title = $next_category->title; + $this->updateCategory($next_args); + + return new Object(); + } + } +?> diff --git a/modules/document/document.admin.view.php b/modules/document/document.admin.view.php new file mode 100644 index 000000000..6879e6831 --- /dev/null +++ b/modules/document/document.admin.view.php @@ -0,0 +1,81 @@ +page = Context::get('page'); ///< 페이지 + $args->list_count = 50; ///< 한페이지에 보여줄 글 수 + $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 + + $args->search_target = Context::get('search_target'); ///< 검색 대상 (title, contents...) + $args->search_keyword = Context::get('search_keyword'); ///< 검색어 + + $args->sort_index = 'list_order'; ///< 소팅 값 + + $args->module_srl = Context::get('module_srl'); + + // mid목록을 구함 + $oModuleModel = &getModel('module'); + $mid_list = $oModuleModel->getMidList(); + Context::set('mid_list', $mid_list); + + // 목록 구함, document->getDocumentList 에서 걍 알아서 다 해버리는 구조이다... (아.. 이거 나쁜 버릇인데.. ㅡ.ㅜ 어쩔수 없다) + $oDocumentModel = &getModel('document'); + $output = $oDocumentModel->getDocumentList($args); + + // 목록의 loop를 돌면서 mid를 구하기 위한 module_srl값을 구함 + $document_count = count($output->data); + $module_srl_list = array(); + if($document_count) { + foreach($output->data as $key => $val) { + $module_srl = $val->module_srl; + if(!in_array($module_srl, $module_srl_list)) $module_srl_list[] = $module_srl; + } + if(count($module_srl_list)) { + $args->module_srls = implode(',',$module_srl_list); + $mid_output = executeQuery('module.getModuleInfoByModuleSrl', $args); + if($mid_output->data && !is_array($mid_output->data)) $mid_output->data = array($mid_output->data); + for($i=0;$idata);$i++) { + $mid_info = $mid_output->data[$i]; + $module_list[$mid_info->module_srl] = $mid_info; + } + } + } + + // 템플릿에 쓰기 위해서 document_model::getDocumentList() 의 return object에 있는 값들을 세팅 + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('document_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + Context::set('module_list', $module_list); + + // 템플릿에서 사용할 검색옵션 세팅 + $count_search_option = count($this->search_option); + for($i=0;$i<$count_search_option;$i++) { + $search_option[$this->search_option[$i]] = Context::getLang($this->search_option[$i]); + } + Context::set('search_option', $search_option); + + // 템플릿 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('document_list'); + } + + } +?> diff --git a/modules/document/document.class.php b/modules/document/document.class.php new file mode 100644 index 000000000..eaec4297d --- /dev/null +++ b/modules/document/document.class.php @@ -0,0 +1,76 @@ +insertActionForward('document', 'view', 'dispDocumentAdminList'); + $oModuleController->insertActionForward('document', 'view', 'dispDocumentPrint'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + $oDB = &DB::getInstance(); + + /** + * 2007. 7. 23 : 확장변수(extra_vars1~20까지 추가) + **/ + if(!$oDB->isColumnExists("documents","extra_vars20")) return true; + + /** + * 2007. 7. 25 : 알림 필드(notify_message) 추가 + **/ + if(!$oDB->isColumnExists("documents","notify_message")) return true; + + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + $oDB = &DB::getInstance(); + + /** + * 2007. 7. 23 : 확장변수(extra_vars1~20까지 추가) + **/ + if(!$oDB->isColumnExists("documents","extra_vars20")) { + for($i=1;$i<=20;$i++) { + $column_name = "extra_vars".$i; + $oDB->addColumn('documents',$column_name,'text'); + } + } + + /** + * 2007. 7. 25 : 알림 필드(notify_message) 추가 + **/ + if(!$oDB->isColumnExists("documents","notify_message")) { + $oDB->addColumn('documents',"notify_message","char",1); + } + + return new Object(0,'success_updated'); + } + + } +?> diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php new file mode 100644 index 000000000..6cabafa66 --- /dev/null +++ b/modules/document/document.controller.php @@ -0,0 +1,440 @@ +begin(); + + // 기본 변수들 정리 + if($obj->is_secret!='Y') $obj->is_secret = 'N'; + if($obj->allow_comment!='Y') $obj->allow_comment = 'N'; + if($obj->lock_comment!='Y') $obj->lock_comment = 'N'; + if($obj->allow_trackback!='Y') $obj->allow_trackback = 'N'; + if($obj->homepage && !eregi('^http:\/\/',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; + if($obj->notify_message != "Y") $obj->notify_message = "N"; + + // 내용의 경우 javascript, iframe제거 + $obj->content = removeHackTag($obj->content); + + // 자동저장용 필드 제거 + unset($obj->_saved_doc_srl); + unset($obj->_saved_doc_title); + unset($obj->_saved_doc_content); + unset($obj->_saved_doc_message); + + // file의 Model객체 생성 + $oFileModel = &getModel('file'); + + // 첨부 파일의 갯수를 구함 + $obj->uploaded_count = $oFileModel->getFilesCount($obj->document_srl); + + // 카테고리가 있나 검사하여 없는 카테고리면 0으로 세팅 + if($obj->category_srl) { + $oDocumentModel = &getModel('document'); + $category_list = $oDocumentModel->getCategoryList($obj->module_srl); + if(!$category_list[$obj->category_srl]) $obj->category_srl = 0; + } + + // 태그 처리 + $oTagController = &getController('tag'); + $obj->tags = $oTagController->insertTag($obj->module_srl, $obj->document_srl, $obj->tags); + + // 글 입력 + if(!$obj->readed_count) $obj->readed_count = 0; + $obj->update_order = $obj->list_order = $obj->document_srl * -1; + if($obj->password && !$obj->password_is_hashed) $obj->password = md5($obj->password); + + // 공지사항일 경우 list_order에 무지막지한 값;;을 입력 + if($obj->is_notice=='Y') $obj->list_order = $this->notice_list_order; + + // 로그인 된 회원일 경우 회원의 정보를 입력 + if(Context::get('is_logged')&&!$manual_inserted) { + $logged_info = Context::get('logged_info'); + $obj->member_srl = $logged_info->member_srl; + $obj->user_id = $logged_info->user_id; + $obj->user_name = $logged_info->user_name; + $obj->nick_name = $logged_info->nick_name; + $obj->email_address = $logged_info->email_address; + $obj->homepage = $logged_info->homepage; + } + + // DB에 입력 + $output = executeQuery('document.insertDocument', $obj); + + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 성공하였을 경우 category_srl이 있으면 카테고리 update + if($obj->category_srl) $this->updateCategoryCount($obj->category_srl); + + // 첨부 파일이 있었을 경우 해당 첨부파일들의 valid값을 Y로 변경 + if($obj->uploaded_count) { + $oFileController = &getController('file'); + $oFileController->setFilesValid($obj->document_srl); + } + + // commit + $oDB->commit(); + + // 자동 저장 문서 삭제 + if(!$manual_inserted) { + $oEditorController = &getController('editor'); + $oEditorController->deleteSavedDoc(); + } + + // return + $this->addGrant($obj->document_srl); + $output->add('document_srl',$obj->document_srl); + $output->add('category_srl',$obj->category_srl); + return $output; + } + + /** + * @brief 문서 수정 + **/ + function updateDocument($source_obj, $obj) { + + // begin transaction + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 기본 변수들 정리 + if($obj->is_secret!='Y') $obj->is_secret = 'N'; + if($obj->allow_comment!='Y') $obj->allow_comment = 'N'; + if($obj->lock_comment!='Y') $obj->lock_comment = 'N'; + if($obj->allow_trackback!='Y') $obj->allow_trackback = 'N'; + if($obj->homepage && !eregi('^http:\/\/',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; + if($obj->notify_message != "Y") $obj->notify_message = "N"; + $obj->content = removeHackTag($obj->content); + + // 자동저장용 필드 제거 + unset($obj->_saved_doc_srl); + unset($obj->_saved_doc_title); + unset($obj->_saved_doc_content); + unset($obj->_saved_doc_message); + + // file의 Model객체 생성 + $oFileModel = &getModel('file'); + + // 첨부 파일의 갯수를 구함 + $obj->uploaded_count = $oFileModel->getFilesCount($obj->document_srl); + + // 카테고리가 변경되었으면 검사후 없는 카테고리면 0으로 세팅 + if($source_obj->get('category_srl')!=$obj->category_srl) { + $oDocumentModel = &getModel('document'); + $category_list = $oDocumentModel->getCategoryList($obj->module_srl); + if(!$category_list[$obj->category_srl]) $obj->category_srl = 0; + } + + // 태그 처리 + if($source_obj->get('tags') != $obj->tags) { + $oTagController = &getController('tag'); + $obj->tags = $oTagController->insertTag($obj->module_srl, $obj->document_srl, $obj->tags); + } + + // 수정 + $obj->update_order = getNextSequence() * -1; + + // 공지사항일 경우 list_order에 무지막지한 값을, 그렇지 않으면 document_srl*-1값을 + if($obj->is_notice=='Y') $obj->list_order = $this->notice_list_order; + else $obj->list_order = $obj->document_srl*-1; + + if($obj->password) $obj->password = md5($obj->password); + + // 원본 작성인과 수정하려는 수정인이 동일할 시에 로그인 회원의 정보를 입력 + if(Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + if($source_obj->get('member_srl')==$logged_info->member_srl) { + $obj->member_srl = $logged_info->member_srl; + $obj->user_name = $logged_info->user_name; + $obj->nick_name = $logged_info->nick_name; + $obj->email_address = $logged_info->email_address; + $obj->homepage = $logged_info->homepage; + } + } + + // 로그인한 유저가 작성한 글인데 nick_name이 없을 경우 + if($source_obj->get('member_srl')&& !$obj->nick_name) { + $obj->member_srl = $source_obj->get('member_srl'); + $obj->user_name = $source_obj->get('user_name'); + $obj->nick_name = $source_obj->get('nick_name'); + $obj->email_address = $source_obj->get('email_address'); + $obj->homepage = $source_obj->get('homepage'); + } + + // DB에 입력 + $output = executeQuery('document.updateDocument', $obj); + + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 성공하였을 경우 category_srl이 있으면 카테고리 update + if($source_obj->get('category_srl')!=$obj->category_srl) { + if($source_obj->get('category_srl')) $this->updateCategoryCount($source_obj->get('category_srl')); + if($obj->category_srl) $this->updateCategoryCount($obj->category_srl); + } + + // 첨부 파일이 있었을 경우 해당 첨부파일들의 valid값을 Y로 변경 + if($obj->uploaded_count) { + $oFileController = &getController('file'); + $oFileController->setFilesValid($obj->document_srl); + } + + // 자동 저장 문서 삭제 + $oEditorController = &getController('editor'); + $oEditorController->deleteSavedDoc(); + + // commit + $oDB->commit(); + + $output->add('document_srl',$obj->document_srl); + return $output; + } + + /** + * @brief 문서 삭제 + **/ + function deleteDocument($document_srl, $is_admin = false) { + + // begin transaction + $oDB = &DB::getInstance(); + $oDB->begin(); + + // document의 model 객체 생성 + $oDocumentModel = &getModel('document'); + + // 기존 문서가 있는지 확인 + $oDocument = $oDocumentModel->getDocument($document_srl, $is_admin); + if(!$oDocument->isExists() || $oDocument->document_srl != $document_srl) return new Object(-1, 'msg_invalid_document'); + + // 권한이 있는지 확인 + if(!$oDocument->isGranted()) return new Object(-1, 'msg_not_permitted'); + + // 글 삭제 + $args->document_srl = $document_srl; + $output = executeQuery('document.deleteDocument', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 댓글 삭제 + $oCommentController = &getController('comment'); + $output = $oCommentController->deleteComments($document_srl, $is_admin); + + // 엮인글 삭제 + $oTrackbackController = &getController('trackback'); + $output = $oTrackbackController->deleteTrackbacks($document_srl, $is_admin); + + // 태그 삭제 + $oTagController = &getController('tag'); + $oTagController->deleteTag($document_srl, $is_admin); + + // 첨부 파일 삭제 + if($oDocument->hasUploadedFiles()) { + $oFileController = &getController('file'); + $oFileController->deleteFiles($document_srl); + } + + // 카테고리가 있으면 카테고리 정보 변경 + if($oDocument->get('category_srl')) $this->updateCategoryCount($oDocument->get('category_srl')); + + // commit + $oDB->commit(); + + return $output; + } + + /** + * @brief 해당 document의 조회수 증가 + **/ + function updateReadedCount($oDocument) { + $document_srl = $oDocument->document_srl; + $member_srl = $oDocument->get('member_srl'); + $logged_info = Context::get('logged_info'); + + // session에 정보로 조회수를 증가하였다고 생각하면 패스 + if($_SESSION['readed_document'][$document_srl]) return false; + + // 글의 작성 ip와 현재 접속자의 ip가 동일하면 패스 + if($document->ipaddress == $_SERVER['REMOTE_ADDR']) { + $_SESSION['readed_document'][$document_srl] = true; + return false; + } + + // document의 작성자가 회원일때 조사 + if($member_srl) { + + // 글쓴이와 현재 로그인 사용자의 정보가 일치하면 읽었다고 생각하고 세션 등록후 패스 + if($member_srl && $logged_info->member_srl == $member_srl) { + $_SESSION['readed_document'][$document_srl] = true; + return false; + } + } + + // 로그인 사용자이면 member_srl, 비회원이면 ipaddress로 판단 + if($logged_info->member_srl) { + $args->member_srl = $logged_info->member_srl; + } else { + $args->ipaddress = $_SERVER['REMOTE_ADDR']; + } + $args->document_srl = $document_srl; + $output = executeQuery('document.getDocumentReadedLogInfo', $args); + + // 로그 정보에 조회 로그가 있으면 세션 등록후 패스 + if($output->data->count) return $_SESSION['readed_document'][$document_srl] = true; + + // 조회수 업데이트 + $output = executeQuery('document.updateReadedCount', $args); + + // 로그 남기기 + $output = executeQuery('document.insertDocumentReadedLog', $args); + + // 세션 정보에 남김 + return $_SESSION['readed_document'][$document_srl] = true; + } + + /** + * @brief 해당 document의 추천수 증가 + **/ + function updateVotedCount($document_srl) { + // 세션 정보에 추천 정보가 있으면 중단 + if($_SESSION['voted_document'][$document_srl]) return new Object(-1, 'failed_voted'); + + // 문서 원본을 가져옴 + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl, false, false); + + // 글의 작성 ip와 현재 접속자의 ip가 동일하면 패스 + if($oDocument->get('ipaddress') == $_SERVER['REMOTE_ADDR']) { + $_SESSION['voted_document'][$document_srl] = true; + return new Object(-1, 'failed_voted'); + } + + // document의 작성자가 회원일때 조사 + if($oDocument->get('member_srl')) { + // member model 객체 생성 + $oMemberModel = &getModel('member'); + $member_srl = $oMemberModel->getLoggedMemberSrl(); + + // 글쓴이와 현재 로그인 사용자의 정보가 일치하면 읽었다고 생각하고 세션 등록후 패스 + if($member_srl && $member_srl == $oDocument->get('member_srl')) { + $_SESSION['voted_document'][$document_srl] = true; + return new Object(-1, 'failed_voted'); + } + } + + // 로그인 사용자이면 member_srl, 비회원이면 ipaddress로 판단 + if($member_srl) { + $args->member_srl = $member_srl; + } else { + $args->ipaddress = $_SERVER['REMOTE_ADDR']; + } + $args->document_srl = $document_srl; + $output = executeQuery('document.getDocumentVotedLogInfo', $args); + + // 로그 정보에 추천 로그가 있으면 세션 등록후 패스 + if($output->data->count) { + $_SESSION['voted_document'][$document_srl] = true; + return new Object(-1, 'failed_voted'); + } + + // 추천수 업데이트 + $output = executeQuery('document.updateVotedCount', $args); + + // 로그 남기기 + $output = executeQuery('document.insertDocumentVotedLog', $args); + + // 세션 정보에 남김 + $_SESSION['voted_document'][$document_srl] = true; + + // 결과 리턴 + return new Object(0, 'success_voted'); + } + + /** + * @brief 해당 document의 댓글 수 증가 + **/ + function updateCommentCount($document_srl, $comment_count, $comment_inserted = false) { + $args->document_srl = $document_srl; + $args->comment_count = $comment_count; + + if($comment_inserted) $args->update_order = -1*getNextSequence(); + + return executeQuery('document.updateCommentCount', $args); + } + + /** + * @brief 해당 document의 엮인글 수증가 + **/ + function updateTrackbackCount($document_srl, $trackback_count) { + $args->document_srl = $document_srl; + $args->trackback_count = $trackback_count; + + return executeQuery('document.updateTrackbackCount', $args); + } + + /** + * @brief 카테고리에 문서의 숫자를 변경 + **/ + function updateCategoryCount($category_srl, $document_count = 0) { + // document model 객체 생성 + $oDocumentModel = &getModel('document'); + if(!$document_count) $document_count = $oDocumentModel->getCategoryDocumentCount($category_srl); + + $args->category_srl = $category_srl; + $args->document_count = $document_count; + return executeQuery('document.updateCategoryCount', $args); + } + + /** + * @brief document의 20개 확장변수를 xml js filter 적용을 위해 직접 적용 + * 모듈정보를 받아서 20개의 확장변수를 체크하여 type, required등의 값을 체크하여 header에 javascript 코드 추가 + **/ + function addXmlJsFilter($module_info) { + $extra_vars = $module_info->extra_vars; + if(!$extra_vars) return; + + $js_code = ""; + + foreach($extra_vars as $key => $val) { + $js_code .= sprintf('alertMsg["extra_vars%d"] = "%s";', $key, $val->name); + $js_code .= sprintf('extra_vars[extra_vars.length] = "extra_vars%d";', $key); + $js_code .= sprintf('target_type_list["extra_vars%d"] = "%s";', $key, $val->type); + if($val->is_required == 'Y') $js_code .= sprintf('notnull_list[notnull_list.length] = "extra_vars%s";',$key); + } + + $js_code = ""; + Context::addHtmlHeader($js_code); + } + } +?> diff --git a/modules/document/document.item.php b/modules/document/document.item.php new file mode 100644 index 000000000..a00bfd236 --- /dev/null +++ b/modules/document/document.item.php @@ -0,0 +1,349 @@ +document_srl = $document_srl; + $this->_loadFromDB(); + } + + function setDocument($document_srl) { + $this->document_srl = $document_srl; + $this->_loadFromDB(); + } + + function _loadFromDB() { + if(!$this->document_srl) return; + + $args->document_srl = $this->document_srl; + $output = executeQuery('document.getDocument', $args); + + $this->setAttribute($output->data); + } + + function setAttribute($attribute) { + if(!$attribute->document_srl || !$attribute->content) { + $this->document_srl = null; + return; + } + $this->document_srl = $attribute->document_srl; + $this->adds($attribute); + + // 태그 정리 + if($this->get('tags')) { + $tags = explode(',',$this->get('tags')); + $tag_count = count($tags); + for($i=0;$i<$tag_count;$i++) if(trim($tags[$i])) $tag_list[] = trim($tags[$i]); + $this->add('tag_list', $tag_list); + } + } + + function isExists() { + return $this->document_srl ? true : false; + } + + function isGranted() { + if($_SESSION['own_document'][$this->document_srl]) return true; + + if(!Context::get('is_logged')) return false; + + $logged_info = Context::get('logged_info'); + + if($logged_info->is_admin == 'Y') return true; + + if($this->get('member_srl') && $this->get('member_srl') == $logged_info->member_srl) return true; + + return false; + } + + function setGrant() { + $_SESSION['own_document'][$this->document_srl] = true; + } + + function isAccessible() { + return $_SESSION['accessible'][$this->document_srl]==true?true:false; + } + + function allowComment() { + return $this->get('allow_comment') == 'Y' || !$this->isExists() ? true : false; + } + + function allowTrackback() { + return $this->get('allow_trackback') == 'Y' || !$this->isExists() ? true : false; + } + + function isLocked() { + return $this->get('lock_comment') == 'Y' ? true : false; + } + + function isEditable() { + if($this->isGranted() || !$this->get('member_srl')) return true; + return false; + } + + function isSecret() { + return $this->get('is_secret') == 'Y' ? true : false; + } + + function isNotice() { + return $this->get('is_notice') == 'Y' ? true : false; + } + + function useNotify() { + return $this->get('notify_message')=='Y' ? true : false; + } + + function notify($type, $content) { + // useNotify가 아니면 return + if(!$this->useNotify()) return; + + // 글쓴이가 로그인 유저가 아니면 패스~ + if(!$this->get('member_srl')) return; + + // 현재 로그인한 사용자와 글을 쓴 사용자를 비교하여 동일하면 return + $logged_info = Context::get('logged_info'); + if($logged_info->member_srl == $this->get('member_srl')) return; + + // 변수 정리 + if($type) $title = "[".$type."] "; + $title .= cut_str(strip_tags($content), 10, '...'); + $content = sprintf('%s

from : %s',$content, $this->getPermanentUrl(), $this->getPermanentUrl()); + $receiver_srl = $this->get('member_srl'); + $sender_member_srl = $logged_info->member_srl; + + // 쪽지 발송 + $oMemberController = &getController('member'); + $oMemberController->sendMessage($sender_member_srl, $receiver_srl, $title, $content, false); + } + + function getUserID() { + return htmlspecialchars($this->get('user_id')); + } + + function getUserName() { + return htmlspecialchars($this->get('user_name')); + } + + function getNickName() { + return htmlspecialchars($this->get('nick_name')); + } + + function getTitleText($cut_size = 0, $tail='...') { + return htmlspecialchars($this->getTitle($cut_size, $tail)); + } + + function getTitle($cut_size = 0, $tail='...') { + if($this->isSecret() && !$this->isGranted()) return Context::getLang('msg_is_secret'); + + if($cut_size) return cut_str($this->get('title'), $cut_size, $tail); + + return $this->get('title'); + } + + function getContentText($strlen = 0) { + if($this->isSecret() && !$this->isGranted()) return Context::getLang('msg_is_secret'); + + $_SESSION['accessible'][$this->document_srl] = true; + + $content = $this->get('content'); + if($strlen) return cut_str(strip_tags($content),$strlen,'...'); + + return htmlspecialchars($content); + } + + function getContent($add_document_info = true) { + if($this->isSecret() && !$this->isGranted()) return Context::getLang('msg_is_secret'); + + $_SESSION['accessible'][$this->document_srl] = true; + + $content = $this->get('content'); + + if($add_document_info) return sprintf('%s', $this->document_srl, $this->get('member_srl'), $content, $this->document_srl, $this->get('member_srl')); + + return $content; + } + + function getSummary($str_size = 50) { + $content = htmlspecialchars(strip_tags($this->get('content'))); + return cut_str($content, $str_size, '...'); + } + + function getRegdate($format = 'Y.m.d H:i:s') { + return zdate($this->get('regdate'), $format); + } + + function getRegdateTime() { + $year = substr($this->get('regdate'),0,4); + $month = substr($this->get('regdate'),4,2); + $day = substr($this->get('regdate'),6,2); + $hour = substr($this->get('regdate'),8,2); + $min = substr($this->get('regdate'),10,2); + $sec = substr($this->get('regdate'),12,2); + return mktime($hour,$min,$sec,$month,$day,$year); + } + + function getRegdateGM() { + return gmdate("D, d M Y H:i:s", $this->getRegdateTime()); + } + + function getUpdate($format = 'Y.m.d H:i:s') { + return zdate($this->get('last_update'), $format); + } + + 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 getPermanentUrl() { + return getUrl('','document_srl',$this->document_srl); + } + + function getTrackbackUrl() { + return getUrl('','document_srl',$this->document_srl,'act','trackback'); + } + + function updateReadedCount() { + $oDocumentController = &getController('document'); + if($oDocumentController->updateReadedCount($this)) { + $readed_count = $this->get('readed_count'); + $readed_count++; + $this->add('readed_count', $readed_count); + } + } + + function isExtraVarsExists() { + for($i=1;$i<=20;$i++) { + if($this->get('extra_vars'.$i)) return true; + } + return false; + } + + function getExtraValue($key) { + $val = $this->get('extra_vars'.$key); + if(strpos($val,'|@|')!==false) $val = explode('|@|', $val); + return $val; + } + + function getCommentCount() { + if(!$this->isGranted() && $this->isSecret()) return 0; + return $this->get('comment_count'); + } + + function getComments() { + if(!$this->allowComment() || !$this->get('comment_count')) return; + if(!$this->isGranted() && $this->isSecret()) return; + + $oCommentModel = &getModel('comment'); + return $oCommentModel->getCommentList($this->document_srl, $is_admin); + } + + function getTrackbackCount() { + return $this->get('trackback_count'); + } + + function getTrackbacks() { + if(!$this->allowTrackback() || !$this->get('trackback_count')) return; + + $oTrackbackModel = &getModel('trackback'); + return $oTrackbackModel->getTrackbackList($this->document_srl, $is_admin); + } + + function thumbnailExists($width) { + if(!$this->getThumbnail($width)) return false; + return true; + } + + function getThumbnail($width = 80) { + // 문서의 이미지 첨부파일 위치를 구함 + $document_path = sprintf('./files/attach/images/%d/%d/',$this->get('module_srl'), $this->get('document_srl')); + if(!is_dir($document_path)) FileHandler::makeDir($document_path); + + // 썸네일 임시 파일명을 구함 + $thumbnail_file = sprintf('%sthumbnail_%d.jpg', $document_path, $width); + + // 썸네일이 있더라도 글의 수정시간과 비교해서 다르면 다시 생성함 + if(file_exists($thumbnail_file)) { + $file_created_time = date("YmdHis",filectime($thumbnail_file)); + $modified_time = $this->get('last_update'); + if($modified_time > $file_created_time) @unlink($thumbnail_file); + } + + if(file_exists($thumbnail_file)&&filesize($thumbnail_file)<1) return; + + // 썸네일 파일이 있으면 url return + if(file_exists($thumbnail_file)) return Context::getRequestUri().$thumbnail_file; + + // 생성 시작 + FileHandler::writeFile($thumbnail_file, '', 'w'); + + // 첨부파일이 있는지 확인하고 있으면 썸네일 만듬 + $file_list = FileHandler::readDir($document_path); + if(count($file_list)) { + foreach($file_list as $key => $val) { + if(eregi("^thumbnail_([0-9]+)\.(jpg|gif)$",$val)) continue; + if(!eregi("\.(jpg|gif|png|jpeg)$", $val)) continue; + + $filename = sprintf("%s%s",$document_path,$val); + if(file_exists($filename)) { + FileHandler::createImageFile($filename, $thumbnail_file, $width, $width, 'jpg'); + if(file_exists($thumbnail_file)) return Context::getRequestUri().$thumbnail_file; + } + } + } + + // 첨부파일이 없으면 내용에서 추출 + $content = $this->get('content'); + + preg_match_all("!http:\/\/([^ ^\"^']*?)\.(jpg|png|gif|jpeg)!is", $content, $matches, PREG_SET_ORDER); + for($i=0;$iisSecret() && !$this->isGranted()) return false; + return $this->get('uploaded_count')? true : false; + } + + function getUploadedFiles() { + if($this->isSecret() && !$this->isGranted()) return; + if(!$this->get('uploaded_count')) return; + + $oFileModel = &getModel('file'); + $file_list = $oFileModel->getFiles($this->document_srl, $is_admin); + return $file_list; + } + } +?> diff --git a/modules/document/document.model.php b/modules/document/document.model.php new file mode 100644 index 000000000..446c6498c --- /dev/null +++ b/modules/document/document.model.php @@ -0,0 +1,316 @@ +setGrant(); + + return $oDocument; + } + + /** + * @brief 여러개의 문서들을 가져옴 (페이징 아님) + **/ + function getDocuments($document_srls, $is_admin = false) { + if(is_array($document_srls)) $document_srls = implode(',',$document_srls); + + // DB에서 가져옴 + $args->document_srls = $document_srls; + $output = executeQuery('document.getDocuments', $args); + $document_list = $output->data; + if(!$document_list) return; + if(!is_array($document_list)) $document_list = array($document_list); + + $document_count = count($document_list); + foreach($document_list as $key => $attribute) { + if(!$attribute->document_srl) continue; + $oDocument = null; + $oDocument = new documentItem(); + $oDocument->setAttribute($attribute); + if($is_admin) $oDocument->setGrant(); + + $result[$attribute->document_srl] = $oDocument; + } + return $result; + } + + /** + * @brief module_srl값을 가지는 문서의 목록을 가져옴 + **/ + function getDocumentList($obj) { + // 정렬 대상과 순서 체크 + if(!in_array($obj->sort_index, array('list_order','regdate','last_update','update_order','readed_count','voted_count'))) $obj->sort_index = 'list_order'; + if(!in_array($obj->order_type, array('desc','asc'))) $obj->order_type = 'asc'; + + // module_srl 대신 mid가 넘어왔을 경우는 직접 module_srl을 구해줌 + if($obj->mid) { + $oModuleModel = &getModel('module'); + $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); + unset($obj->mid); + } + + // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 + if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); + else $args->module_srl = $obj->module_srl; + + // 변수 체크 + $args->category_srl = $obj->category_srl?$obj->category_srl:null; + $args->sort_index = $obj->sort_index; + $args->order_type = $obj->order_type; + $args->page = $obj->page?$obj->page:1; + $args->list_count = $obj->list_count?$obj->list_count:20; + $args->page_count = $obj->page_count?$obj->page_count:10; + $args->start_date = $obj->start_date?$obj->start_date:null; + $args->end_date = $obj->end_date?$obj->end_date:null; + + $query_id = 'document.getDocumentList'; + + // 검색 옵션 정리 + $search_target = $obj->search_target; + $search_keyword = $obj->search_keyword; + if($search_target && $search_keyword) { + switch($search_target) { + case 'title' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_title = $search_keyword; + break; + case 'content' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_content = $search_keyword; + break; + case 'title_content' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_title = $search_keyword; + $args->s_content = $search_keyword; + break; + case 'user_id' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_user_id = $search_keyword; + $args->sort_index = 'documents.'.$args->sort_index; + break; + case 'member_srl' : + $args->s_member_srl = (int)$search_keyword; + break; + case 'user_name' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_user_name = $search_keyword; + break; + case 'nick_name' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_nick_name = $search_keyword; + break; + case 'email_address' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_email_address = $search_keyword; + break; + case 'homepage' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_homepage = $search_keyword; + break; + case 'is_notice' : + if($search_keyword=='Y') $args->s_is_notice = 'Y'; + else $args->s_is_notice = ''; + break; + case 'is_secret' : + if($search_keyword=='Y') $args->s_is_secret = 'Y'; + else $args->s_is_secret = ''; + break; + case 'tag' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_tags = $search_keyword; + break; + case 'readed_count' : + $args->s_readed_count = (int)$search_keyword; + break; + case 'voted_count' : + $args->s_voted_count = (int)$search_keyword; + break; + case 'comment_count' : + $args->s_comment_count = (int)$search_keyword; + break; + case 'trackback_count' : + $args->s_trackback_count = (int)$search_keyword; + break; + case 'uploaded_count' : + $args->s_uploaded_count = (int)$search_keyword; + break; + case 'regdate' : + $args->s_regdate = $search_keyword; + break; + case 'last_update' : + $args->s_last_upate = $search_keyword; + break; + case 'ipaddress' : + $args->s_ipaddress= $search_keyword; + break; + default : + preg_match('/^extra_vars([0-9]+)$/',$search_target,$matches); + if($matches[1]) { + $args->{"s_extra_vars".$matches[1]} = $search_keyword; + } + break; + } + } + + // document.getDocumentList 쿼리 실행 + $output = executeQuery($query_id, $args); + + // 결과가 없거나 오류 발생시 그냥 return + if(!$output->toBool()||!count($output->data)) return $output; + + foreach($output->data as $key => $attribute) { + $document_srl = $attribute->document_srl; + + $oDocument = null; + $oDocument = new documentItem(); + $oDocument->setAttribute($attribute); + if($is_admin) $oDocument->setGrant(); + + $output->data[$key] = $oDocument; + + } + return $output; + } + + /** + * @brief module_srl에 해당하는 문서의 전체 갯수를 가져옴 + **/ + function getDocumentCount($module_srl, $search_obj = NULL) { + // 검색 옵션 추가 + $args->module_srl = $module_srl; + $args->s_title = $search_obj->s_title; + $args->s_content = $search_obj->s_content; + $args->s_user_name = $search_obj->s_user_name; + $args->s_member_srl = $search_obj->s_member_srl; + $args->s_ipaddress = $search_obj->s_ipaddress; + $args->s_regdate = $search_obj->s_regdate; + $args->category_srl = $search_obj->category_srl; + + $output = executeQuery('document.getDocumentCount', $args); + + // 전체 갯수를 return + $total_count = $output->data->count; + return (int)$total_count; + } + /** + * @brief 해당 document의 page 가져오기, module_srl이 없으면 전체에서.. + **/ + function getDocumentPage($document_srl, $module_srl=0, $list_count) { + // 변수 설정 + $args->document_srl = $document_srl; + $args->module_srl = $module_srl; + + // 전체 갯수를 구한후 해당 글의 페이지를 검색 + $output = executeQuery('document.getDocumentPage', $args); + $count = $output->data->count; + $page = (int)(($count-1)/$list_count)+1; + return $page; + } + + /** + * @brief 카테고리의 정보를 가져옴 + **/ + function getCategory($category_srl) { + $args->category_srl = $category_srl; + $output = executeQuery('document.getCategory', $args); + return $output->data; + } + + /** + * @brief 특정 모듈의 카테고리 목록을 가져옴 + **/ + function getCategoryList($module_srl) { + $args->module_srl = $module_srl; + $args->sort_index = 'list_order'; + $output = executeQuery('document.getCategoryList', $args); + + $category_list = $output->data; + + if(!$category_list) return NULL; + if(!is_array($category_list)) $category_list = array($category_list); + + $category_count = count($category_list); + for($i=0;$i<$category_count;$i++) { + $category_srl = $category_list[$i]->category_srl; + $list[$category_srl] = $category_list[$i]; + } + return $list; + } + + /** + * @brief 카테고리에 속한 문서의 갯수를 구함 + **/ + function getCategoryDocumentCount($category_srl) { + $args->category_srl = $category_srl; + $output = executeQuery('document.getCategoryDocumentCount', $args); + return (int)$output->data->count; + } + + /** + * @brief 월별 글 보관현황을 가져옴 + **/ + function getMonthlyArchivedList($obj) { + if($obj->mid) { + $oModuleModel = &getModel('module'); + $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); + unset($obj->mid); + } + + // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 + if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); + else $args->module_srl = $obj->module_srl; + + $output = executeQuery('document.getMonthlyArchivedList', $args); + if(!$output->toBool()||!$output->data) return $output; + + if(!is_array($output->data)) $output->data = array($output->data); + + return $output; + } + + /** + * @brief 특정달의 일별 글 현황을 가져옴 + **/ + function getDailyArchivedList($obj) { + if($obj->mid) { + $oModuleModel = &getModel('module'); + $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); + unset($obj->mid); + } + + // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 + if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); + else $args->module_srl = $obj->module_srl; + $args->regdate = $obj->regdate; + + $output = executeQuery('document.getDailyArchivedList', $args); + if(!$output->toBool()) return $output; + + if(!is_array($output->data)) $output->data = array($output->data); + + return $output; + } + } +?> diff --git a/modules/document/document.view.php b/modules/document/document.view.php new file mode 100644 index 000000000..951b28fcd --- /dev/null +++ b/modules/document/document.view.php @@ -0,0 +1,56 @@ +getDocument($document_srl, $this->grant->manager); + if(!$oDocument->isExists()) return new Object(-1,'msg_invalid_request'); + + // 권한 체크 + if(!$oDocument->isAccessible()) return new Object(-1,'msg_not_permitted'); + + // 브라우저 타이틀 설정 + Context::setBrowserTitle($oDocument->getTitleText()); + + Context::set('oDocument', $oDocument); + + Context::set('layout','none'); + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('print_page'); + } + + /** + * @brief 미리 보기 + **/ + function dispDocumentPreview() { + Context::set('layout','none'); + + $content = Context::get('content'); + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('preview_page'); + } + + } +?> diff --git a/modules/document/lang/en.lang.php b/modules/document/lang/en.lang.php new file mode 100644 index 000000000..2100a1f6c --- /dev/null +++ b/modules/document/lang/en.lang.php @@ -0,0 +1,37 @@ + + * @brief Document module's basic language pack + **/ + + $lang->cmd_delete_checked_document = 'Delete selected'; + + $lang->msg_cart_is_null = 'Select the articles you wish to delete'; + $lang->msg_category_not_moved = 'Unabled to move'; + $lang->msg_is_secret = 'This article is secret'; + $lang->msg_checked_document_is_deleted = 'Total of %d articles has been deleted'; + + // Search targets in admin page + $lang->search_target_list = array( + 'title' => 'Subject', + 'content' => 'Content', + 'user_id' => 'User ID', + 'member_srl' => 'Member No.', + 'user_name' => 'Content', + 'nick_name' => 'Content', + 'email_address' => 'Email', + 'homepage' => 'Homepage', + 'is_notice' => 'Notice', + 'is_secret' => 'Secret', + 'tags' => 'Tag', + 'readed_count' => 'Number of Views (Above)', + 'voted_count' => 'Number of Votes (Above)', + 'comment_count ' => 'Number of Comments (Above)', + 'trackback_count ' => 'Number of trackbacks (Above)', + 'uploaded_count ' => 'Number of Attachments (Above)', + 'regdate' => 'Date', + 'last_update' => 'Last Revised', + 'ipaddress' => 'IP Address', + ); +?> diff --git a/modules/document/lang/es.lang.php b/modules/document/lang/es.lang.php new file mode 100644 index 000000000..ac320d263 --- /dev/null +++ b/modules/document/lang/es.lang.php @@ -0,0 +1,37 @@ + + * @brief Paquete lingual de módulo documento + **/ + + $lang->cmd_delete_checked_document = 'Eliminar selección'; + + $lang->msg_cart_is_null = 'Por favor selecciona documento para eliminar'; + $lang->msg_category_not_moved = 'No puede mover'; + $lang->msg_is_secret = 'es secreto'; + $lang->msg_checked_document_is_deleted = 'Eliminado %d documentos'; + + // Artículo de busqueda en la pantalla de administración + $lang->search_target_list = array( + 'title' => 'Título', + 'content' => 'Contenido', + 'user_id' => 'ID', + 'member_srl' => 'Numero de miembro', + 'user_name' => 'Nombre de usuario', + 'nick_name' => 'Apodo', + 'email_address' => 'Correo Electrónico', + 'homepage' => 'Pagina de web', + 'is_notice' => 'Noticia', + 'is_secret' => 'Secreto', + 'tags' => 'Etiqueta', + 'readed_count' => 'Leido', + 'voted_count' => 'Votado', + 'comment_count ' => 'Commentarios', + 'trackback_count ' => 'Trackback', + 'uploaded_count ' => 'Subido', + 'regdate' => 'Registrado', + 'last_update' => 'Ultimo actualizado', + 'ipaddress' => 'Dirección IP', + ); +?> diff --git a/modules/document/lang/jp.lang.php b/modules/document/lang/jp.lang.php new file mode 100644 index 000000000..9d1c3f5b3 --- /dev/null +++ b/modules/document/lang/jp.lang.php @@ -0,0 +1,37 @@ + 翻訳:RisaPapa + * @brief ドキュメント(document)モジュルの基本言語パッケージ + **/ + + $lang->cmd_delete_checked_document = '選択項目削除'; + + $lang->msg_cart_is_null = '削除する書き込みを選択してください。'; + $lang->msg_category_not_moved = '移動することができません。'; + $lang->msg_is_secret = '非公開設定の書き込みです。'; + $lang->msg_checked_document_is_deleted = '%d個の書き込みが削除されました。'; + + // 管理者ページで検索する内容 + $lang->search_target_list = array( + 'title' => 'タイトル', + 'content' => '内容', + 'user_id' => 'ユーザID', + 'member_srl' => '会員番号', + 'user_name' => 'ユーザ名', + 'nick_name' => 'ニックネーム', + 'email_address' => 'メールアドレス', + 'homepage' => 'ホームページ', + 'is_notice' => 'お知らせ', + 'is_secret' => '非公開書き込み', + 'tags' => 'タグ', + 'readed_count' => '照合数(以上)', + 'voted_count' => '推薦数(以上)', + 'comment_count ' => 'コメント数(以上)', + 'trackback_count ' => 'トラックバック数(以上)', + 'uploaded_count ' => '添付ファイル数(以上)', + 'regdate' => '登録日', + 'last_update' => '最近修正日', + 'ipaddress' => 'IPアドレス', + ); +?> diff --git a/modules/document/lang/ko.lang.php b/modules/document/lang/ko.lang.php new file mode 100644 index 000000000..824ded0f4 --- /dev/null +++ b/modules/document/lang/ko.lang.php @@ -0,0 +1,37 @@ + + * @brief 문서(document) 모듈의 기본 언어팩 + **/ + + $lang->cmd_delete_checked_document = '선택항목 삭제'; + + $lang->msg_cart_is_null = '삭제할 글을 선택해주세요'; + $lang->msg_category_not_moved = '이동할 수가 없습니다'; + $lang->msg_is_secret = '비밀글입니다'; + $lang->msg_checked_document_is_deleted = '%d개의 글이 삭제되었습니다'; + + // 관리자 페이지에서 검색할 대상 + $lang->search_target_list = array( + 'title' => '제목', + 'content' => '내용', + 'user_id' => '아이디', + 'member_srl' => '회원번호', + 'user_name' => '내용', + 'nick_name' => '내용', + 'email_address' => '이메일', + 'homepage' => '홈페이지', + 'is_notice' => '공지사항', + 'is_secret' => '비밀글', + 'tags' => '태그', + 'readed_count' => '조회수 (이상)', + 'voted_count' => '추천수 (이상)', + 'comment_count ' => '코멘트수 (이상)', + 'trackback_count ' => '트랙백수 (이상)', + 'uploaded_count ' => '첨부파일수 (이상)', + 'regdate' => '등록일', + 'last_update' => '최근수정일', + 'ipaddress' => 'IP 주소', + ); +?> diff --git a/modules/document/lang/zh-CN.lang.php b/modules/document/lang/zh-CN.lang.php new file mode 100644 index 000000000..6ebb8499c --- /dev/null +++ b/modules/document/lang/zh-CN.lang.php @@ -0,0 +1,37 @@ + + * @brief 文章(document)模块语言包 + **/ + + $lang->cmd_delete_checked_document = '删除所选项目'; + + $lang->msg_cart_is_null = '请选择要删除的文章。'; + $lang->msg_category_not_moved = '不能移动!'; + $lang->msg_is_secret = '这是密帖!'; + $lang->msg_checked_document_is_deleted = '删除了%d个文章。'; + + // 管理页面查找的对象 + $lang->search_target_list = array( + 'title' => '标题', + 'content' => '内容', + 'user_id' => 'I D', + 'member_srl' => '会员编号', + 'user_name' => '姓名', + 'nick_name' => '昵称', + 'email_address' => '电子邮件', + 'homepage' => '主页', + 'is_notice' => '公告', + 'is_secret' => '密帖', + 'tags' => '标签', + 'readed_count' => '查看数(以上)', + 'voted_count' => '推荐数(以上)', + 'comment_count ' => '评论数(以上)', + 'trackback_count ' => '引用数(以上)', + 'uploaded_count ' => '上传附件数(以上)', + 'regdate' => '登录日期', + 'last_update' => '最近更新日期', + 'ipaddress' => 'IP 地址', + ); +?> diff --git a/modules/document/queries/deleteCategory.xml b/modules/document/queries/deleteCategory.xml new file mode 100644 index 000000000..046f3dc96 --- /dev/null +++ b/modules/document/queries/deleteCategory.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/document/queries/deleteDocument.xml b/modules/document/queries/deleteDocument.xml new file mode 100644 index 000000000..9fccf5c8d --- /dev/null +++ b/modules/document/queries/deleteDocument.xml @@ -0,0 +1,8 @@ + + +
+ + + + + diff --git a/modules/document/queries/deleteModuleCategory.xml b/modules/document/queries/deleteModuleCategory.xml new file mode 100644 index 000000000..b760f5961 --- /dev/null +++ b/modules/document/queries/deleteModuleCategory.xml @@ -0,0 +1,8 @@ + + +
+ + + + + diff --git a/modules/document/queries/deleteModuleDocument.xml b/modules/document/queries/deleteModuleDocument.xml new file mode 100644 index 000000000..6d3d581fd --- /dev/null +++ b/modules/document/queries/deleteModuleDocument.xml @@ -0,0 +1,8 @@ + + +
+ + + + + diff --git a/modules/document/queries/getCategory.xml b/modules/document/queries/getCategory.xml new file mode 100644 index 000000000..2eacd97f0 --- /dev/null +++ b/modules/document/queries/getCategory.xml @@ -0,0 +1,8 @@ + + +
+ + + + + diff --git a/modules/document/queries/getCategoryDocumentCount.xml b/modules/document/queries/getCategoryDocumentCount.xml new file mode 100644 index 000000000..877a2d809 --- /dev/null +++ b/modules/document/queries/getCategoryDocumentCount.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/document/queries/getCategoryList.xml b/modules/document/queries/getCategoryList.xml new file mode 100644 index 000000000..f562956eb --- /dev/null +++ b/modules/document/queries/getCategoryList.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/document/queries/getDailyArchivedList.xml b/modules/document/queries/getDailyArchivedList.xml new file mode 100644 index 000000000..06718ffeb --- /dev/null +++ b/modules/document/queries/getDailyArchivedList.xml @@ -0,0 +1,16 @@ + + +
+ + + + + + + + + + + + + diff --git a/modules/document/queries/getDocument.xml b/modules/document/queries/getDocument.xml new file mode 100644 index 000000000..97088ec19 --- /dev/null +++ b/modules/document/queries/getDocument.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/document/queries/getDocumentCount.xml b/modules/document/queries/getDocumentCount.xml new file mode 100644 index 000000000..bfd58f7aa --- /dev/null +++ b/modules/document/queries/getDocumentCount.xml @@ -0,0 +1,20 @@ + + +
+ + + + + + + + + + + + + + + + + diff --git a/modules/document/queries/getDocumentList.xml b/modules/document/queries/getDocumentList.xml new file mode 100644 index 000000000..1bbd0c1ef --- /dev/null +++ b/modules/document/queries/getDocumentList.xml @@ -0,0 +1,63 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/document/queries/getDocumentListWithinMember.xml b/modules/document/queries/getDocumentListWithinMember.xml new file mode 100644 index 000000000..5b80862ed --- /dev/null +++ b/modules/document/queries/getDocumentListWithinMember.xml @@ -0,0 +1,39 @@ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/document/queries/getDocumentPage.xml b/modules/document/queries/getDocumentPage.xml new file mode 100644 index 000000000..7c843a971 --- /dev/null +++ b/modules/document/queries/getDocumentPage.xml @@ -0,0 +1,12 @@ + + +
+ + + + + + + + + diff --git a/modules/document/queries/getDocumentReadedLogInfo.xml b/modules/document/queries/getDocumentReadedLogInfo.xml new file mode 100644 index 000000000..762fda228 --- /dev/null +++ b/modules/document/queries/getDocumentReadedLogInfo.xml @@ -0,0 +1,15 @@ + + +
+ + + + + + + + + + + + diff --git a/modules/document/queries/getDocumentVotedLogInfo.xml b/modules/document/queries/getDocumentVotedLogInfo.xml new file mode 100644 index 000000000..3bc18936a --- /dev/null +++ b/modules/document/queries/getDocumentVotedLogInfo.xml @@ -0,0 +1,15 @@ + + +
+ + + + + + + + + + + + diff --git a/modules/document/queries/getDocuments.xml b/modules/document/queries/getDocuments.xml new file mode 100644 index 000000000..17bc6e47d --- /dev/null +++ b/modules/document/queries/getDocuments.xml @@ -0,0 +1,14 @@ + + +
+ + + + + + + + + + + diff --git a/modules/document/queries/getMonthlyArchivedList.xml b/modules/document/queries/getMonthlyArchivedList.xml new file mode 100644 index 000000000..32e7f7b22 --- /dev/null +++ b/modules/document/queries/getMonthlyArchivedList.xml @@ -0,0 +1,15 @@ + + +
+ + + + + + + + + + + + diff --git a/modules/document/queries/insertCategory.xml b/modules/document/queries/insertCategory.xml new file mode 100644 index 000000000..362d9ad4c --- /dev/null +++ b/modules/document/queries/insertCategory.xml @@ -0,0 +1,14 @@ + + +
+ + + + + + + + + + + diff --git a/modules/document/queries/insertDocument.xml b/modules/document/queries/insertDocument.xml new file mode 100644 index 000000000..9aad358d0 --- /dev/null +++ b/modules/document/queries/insertDocument.xml @@ -0,0 +1,56 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/document/queries/insertDocumentReadedLog.xml b/modules/document/queries/insertDocumentReadedLog.xml new file mode 100644 index 000000000..93774ea3f --- /dev/null +++ b/modules/document/queries/insertDocumentReadedLog.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/document/queries/insertDocumentVotedLog.xml b/modules/document/queries/insertDocumentVotedLog.xml new file mode 100644 index 000000000..5211b144f --- /dev/null +++ b/modules/document/queries/insertDocumentVotedLog.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/document/queries/updateCategory.xml b/modules/document/queries/updateCategory.xml new file mode 100644 index 000000000..7c612d8b6 --- /dev/null +++ b/modules/document/queries/updateCategory.xml @@ -0,0 +1,13 @@ + + +
+ + + + + + + + + + diff --git a/modules/document/queries/updateCategoryCount.xml b/modules/document/queries/updateCategoryCount.xml new file mode 100644 index 000000000..e0611c857 --- /dev/null +++ b/modules/document/queries/updateCategoryCount.xml @@ -0,0 +1,12 @@ + + +
+ + + + + + + + + diff --git a/modules/document/queries/updateCommentCount.xml b/modules/document/queries/updateCommentCount.xml new file mode 100644 index 000000000..67483ee63 --- /dev/null +++ b/modules/document/queries/updateCommentCount.xml @@ -0,0 +1,12 @@ + + +
+ + + + + + + + + diff --git a/modules/document/queries/updateDocument.xml b/modules/document/queries/updateDocument.xml new file mode 100644 index 000000000..7f6e8a46c --- /dev/null +++ b/modules/document/queries/updateDocument.xml @@ -0,0 +1,52 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/document/queries/updateDocumentCategory.xml b/modules/document/queries/updateDocumentCategory.xml new file mode 100644 index 000000000..89c5d032f --- /dev/null +++ b/modules/document/queries/updateDocumentCategory.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/document/queries/updateDocumentModule.xml b/modules/document/queries/updateDocumentModule.xml new file mode 100644 index 000000000..5c8f08166 --- /dev/null +++ b/modules/document/queries/updateDocumentModule.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/document/queries/updateReadedCount.xml b/modules/document/queries/updateReadedCount.xml new file mode 100644 index 000000000..a01506f13 --- /dev/null +++ b/modules/document/queries/updateReadedCount.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/document/queries/updateTrackbackCount.xml b/modules/document/queries/updateTrackbackCount.xml new file mode 100644 index 000000000..dc5ef00e5 --- /dev/null +++ b/modules/document/queries/updateTrackbackCount.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/document/queries/updateVotedCount.xml b/modules/document/queries/updateVotedCount.xml new file mode 100644 index 000000000..4aec3630a --- /dev/null +++ b/modules/document/queries/updateVotedCount.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/document/schemas/document_categories.xml b/modules/document/schemas/document_categories.xml new file mode 100644 index 000000000..bed48840e --- /dev/null +++ b/modules/document/schemas/document_categories.xml @@ -0,0 +1,9 @@ +
+ + + + + + + +
diff --git a/modules/document/schemas/document_readed_log.xml b/modules/document/schemas/document_readed_log.xml new file mode 100644 index 000000000..849038898 --- /dev/null +++ b/modules/document/schemas/document_readed_log.xml @@ -0,0 +1,6 @@ + + + + + +
diff --git a/modules/document/schemas/document_voted_log.xml b/modules/document/schemas/document_voted_log.xml new file mode 100644 index 000000000..3d324fe4a --- /dev/null +++ b/modules/document/schemas/document_voted_log.xml @@ -0,0 +1,6 @@ + + + + + +
diff --git a/modules/document/schemas/documents.xml b/modules/document/schemas/documents.xml new file mode 100644 index 000000000..ec6eaf273 --- /dev/null +++ b/modules/document/schemas/documents.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/document/tpl/css/document.css b/modules/document/tpl/css/document.css new file mode 100644 index 000000000..229870652 --- /dev/null +++ b/modules/document/tpl/css/document.css @@ -0,0 +1 @@ +body { margin:10px; font-size:.75em; font-family:sans-serif;} diff --git a/modules/document/tpl/document_list.html b/modules/document/tpl/document_list.html new file mode 100644 index 000000000..0c3e9eed2 --- /dev/null +++ b/modules/document/tpl/document_list.html @@ -0,0 +1,100 @@ + + + +

{$lang->document} {$lang->cmd_management}

+ + +
+ Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)} +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->no} +
+ GO +
+
{$lang->title}{$lang->user_name}{$lang->readed_count}{$lang->voted_count}{$lang->date}
{$no}{htmlspecialchars($module_list[$oDocument->get('module_srl')]->browser_title)} + {$oDocument->getTitleText()} + + + [{$oDocument->getCommentCount()}] + + + + [{$oDocument->getTrackbackCount()}] + +
{$oDocument->getNickName()}
{$oDocument->get('readed_count')}{$oDocument->get('voted_count')}{$oDocument->getRegdate("Y-m-d")}
+ + +
+ +
+ +
+ + + + + +
+ + + + +
+ + + + {$lang->cmd_cancel} +
+
diff --git a/modules/document/tpl/filter/delete_checked.xml b/modules/document/tpl/filter/delete_checked.xml new file mode 100644 index 000000000..c665eeb07 --- /dev/null +++ b/modules/document/tpl/filter/delete_checked.xml @@ -0,0 +1,12 @@ + +
+ + + + + + + + + +
diff --git a/modules/document/tpl/js/document_admin.js b/modules/document/tpl/js/document_admin.js new file mode 100644 index 000000000..92eff1785 --- /dev/null +++ b/modules/document/tpl/js/document_admin.js @@ -0,0 +1,6 @@ +function doCheckAll() { + var fo_obj = xGetElementById('fo_list'); + for(var i=0;i + + + +{$content} diff --git a/modules/document/tpl/print_page.html b/modules/document/tpl/print_page.html new file mode 100644 index 000000000..7e632c720 --- /dev/null +++ b/modules/document/tpl/print_page.html @@ -0,0 +1,18 @@ + + + +

{$oDocument->getTitleText()}

+ +
{$oDocument->get('nick_name')}
+
{$oDocument->getRegdate()}
+ +
+ +
{$oDocument->getContent()}
+ + + + + diff --git a/modules/editor/components/colorpicker_bg/colorpicker_bg.class.php b/modules/editor/components/colorpicker_bg/colorpicker_bg.class.php new file mode 100644 index 000000000..6ebbdbbee --- /dev/null +++ b/modules/editor/components/colorpicker_bg/colorpicker_bg.class.php @@ -0,0 +1,37 @@ +upload_target_srl = $upload_target_srl; + $this->component_path = $component_path; + } + + /** + * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 + **/ + function getPopupContent() { + // 템플릿을 미리 컴파일해서 컴파일된 소스를 return + $tpl_path = $this->component_path.'tpl'; + $tpl_file = 'popup.html'; + + Context::set("tpl_path", $tpl_path); + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + } +?> diff --git a/modules/editor/components/colorpicker_bg/icon.gif b/modules/editor/components/colorpicker_bg/icon.gif new file mode 100644 index 000000000..e1f4a8fe9 Binary files /dev/null and b/modules/editor/components/colorpicker_bg/icon.gif differ diff --git a/modules/editor/components/colorpicker_bg/info.xml b/modules/editor/components/colorpicker_bg/info.xml new file mode 100644 index 000000000..04a3e8938 --- /dev/null +++ b/modules/editor/components/colorpicker_bg/info.xml @@ -0,0 +1,17 @@ + + + 글의 배경색 변경 + 文字の背景色変更 + 背景颜色 + Change the background color of article + + 제로 + Zero + zero + zero + 글의 배경색을 변경합니다. + 文字の背景色を変更します。 + 可修改字体背景颜色。 + It will change the background color of article. + + diff --git a/modules/editor/components/colorpicker_bg/tpl/blank.gif b/modules/editor/components/colorpicker_bg/tpl/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/modules/editor/components/colorpicker_bg/tpl/blank.gif differ diff --git a/modules/editor/components/colorpicker_bg/tpl/popup.css b/modules/editor/components/colorpicker_bg/tpl/popup.css new file mode 100644 index 000000000..e2a7aa562 --- /dev/null +++ b/modules/editor/components/colorpicker_bg/tpl/popup.css @@ -0,0 +1,51 @@ +@charset "utf-8"; + +.colorpicker { + width:275px; + height:100px; + padding:5px; + clear:both; +} + +li { list-style:none; float:left; margin-right:5px; } + +img.preview_color { + width:30px; + height:16px; + border:1px solid #000000; + background-color:#FFFFFF; +} + +img.color_icon { + width:14px; + height:14px; + border:1px solid #FFFFFF; +} + +img.color_icon_over { + width:14px; + height:14px; + border:1px solid #000000; + cursor:pointer; +} + +.input_area { + text-align:center; + height:25px; + padding:5px; + font-family:tahoma; + font-size:8pt; + clear:both; + text-align:center; + background-color:#EEEEEE; +} + +.popup_input { + border:1px solid #AAAAAA; + height:14px; +} + +.popup_submit { + border:1px solid #AAAAAA; + height:18px; +} diff --git a/modules/editor/components/colorpicker_bg/tpl/popup.html b/modules/editor/components/colorpicker_bg/tpl/popup.html new file mode 100644 index 000000000..f3fc0cf78 --- /dev/null +++ b/modules/editor/components/colorpicker_bg/tpl/popup.html @@ -0,0 +1,17 @@ + + +
+ +
+
+
+
    +
  • blank
  • +
  • #
  • +
  • +
  • +
+
+
diff --git a/modules/editor/components/colorpicker_bg/tpl/popup.js b/modules/editor/components/colorpicker_bg/tpl/popup.js new file mode 100644 index 000000000..2c7ee722d --- /dev/null +++ b/modules/editor/components/colorpicker_bg/tpl/popup.js @@ -0,0 +1,49 @@ +/* 부모창의 위지윅 에디터의 선택된 영역의 글자색을 변경 */ +function applyColor() { + var code = xGetElementById("color_input").value; + + if(opener.xIE4Up) opener.editorDo("BackColor","#"+code, opener.editorPrevSrl); + else opener.editorDo("hilitecolor","#"+code, opener.editorPrevSrl); + + opener.editorFocus(opener.editorPrevSrl); + + window.close(); +} + +/* 색상 클릭시 */ +function select_color(code) { + xGetElementById("color_input").value = code; + xGetElementById("preview_color").style.backgroundColor = "#"+code; +} + +/* 색상표를 출력 */ +function printColor(blank_img_src) { + var colorTable = new Array('22','44','66','88','AA','CC','EE'); + var html = ""; + + for(var i=0;i<8;i+=1) html += printColorBlock(i.toString(16)+i.toString(16)+i.toString(16)+i.toString(16)+i.toString(16)+i.toString(16), blank_img_src); + + for(var i=0; i\"color\"<\/div>"; +} + +/* 수동 색상 변경시 */ +function manual_select_color(obj) { + if(obj.value.length!=6) return; + xGetElementById("preview_color").style.backgroundColor = "#"+obj.value; +} diff --git a/modules/editor/components/colorpicker_text/colorpicker_text.class.php b/modules/editor/components/colorpicker_text/colorpicker_text.class.php new file mode 100644 index 000000000..7ded73448 --- /dev/null +++ b/modules/editor/components/colorpicker_text/colorpicker_text.class.php @@ -0,0 +1,37 @@ +upload_target_srl = $upload_target_srl; + $this->component_path = $component_path; + } + + /** + * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 + **/ + function getPopupContent() { + // 템플릿을 미리 컴파일해서 컴파일된 소스를 return + $tpl_path = $this->component_path.'tpl'; + $tpl_file = 'popup.html'; + + Context::set("tpl_path", $tpl_path); + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + } +?> diff --git a/modules/editor/components/colorpicker_text/icon.gif b/modules/editor/components/colorpicker_text/icon.gif new file mode 100644 index 000000000..92e6ca4f7 Binary files /dev/null and b/modules/editor/components/colorpicker_text/icon.gif differ diff --git a/modules/editor/components/colorpicker_text/info.xml b/modules/editor/components/colorpicker_text/info.xml new file mode 100644 index 000000000..255d49c39 --- /dev/null +++ b/modules/editor/components/colorpicker_text/info.xml @@ -0,0 +1,17 @@ + + + 글자색 변경 + 文字色変更 + 字体颜色 + Change the color of text + + 제로 + Zero + zero + zero + 글자색을 변경합니다. + 文字色を変更します。 + 可修改字体颜色。 + It will change the color of text. + + diff --git a/modules/editor/components/colorpicker_text/tpl/blank.gif b/modules/editor/components/colorpicker_text/tpl/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/modules/editor/components/colorpicker_text/tpl/blank.gif differ diff --git a/modules/editor/components/colorpicker_text/tpl/popup.css b/modules/editor/components/colorpicker_text/tpl/popup.css new file mode 100644 index 000000000..cf9181ae4 --- /dev/null +++ b/modules/editor/components/colorpicker_text/tpl/popup.css @@ -0,0 +1,51 @@ +@charset "utf-8"; + +.colorpicker { + width:275px; + height:100px; + padding:5px; + clear:both; +} + +li { list-style:none; float:left; margin-right:5px; } + +img.preview_color { + width:30px; + height:16px; + border:1px solid #000000; + background-color:#000000; +} + +img.color_icon { + width:14px; + height:14px; + border:1px solid #FFFFFF; +} + +img.color_icon_over { + width:14px; + height:14px; + border:1px solid #000000; + cursor:pointer; +} + +.input_area { + text-align:center; + height:25px; + padding:5px; + font-family:tahoma; + font-size:8pt; + clear:both; + text-align:center; + background-color:#EEEEEE; +} + +.popup_input { + border:1px solid #AAAAAA; + height:14px; +} + +.popup_submit { + border:1px solid #AAAAAA; + height:18px; +} diff --git a/modules/editor/components/colorpicker_text/tpl/popup.html b/modules/editor/components/colorpicker_text/tpl/popup.html new file mode 100644 index 000000000..90e05ea38 --- /dev/null +++ b/modules/editor/components/colorpicker_text/tpl/popup.html @@ -0,0 +1,17 @@ + + +
+ +
+
+
+
    +
  • blank
  • +
  • #
  • +
  • +
  • +
+
+
diff --git a/modules/editor/components/colorpicker_text/tpl/popup.js b/modules/editor/components/colorpicker_text/tpl/popup.js new file mode 100644 index 000000000..521280cea --- /dev/null +++ b/modules/editor/components/colorpicker_text/tpl/popup.js @@ -0,0 +1,50 @@ +/* 부모창의 위지윅 에디터의 선택된 영역의 글자색을 변경 */ +function applyColor() { + var code = xGetElementById("color_input").value; + + opener.editorFocus(opener.editorPrevSrl); + + opener.editorDo("ForeColor", "#"+code, opener.editorPrevSrl); + + opener.editorFocus(opener.editorPrevSrl); + + self.close(); +} + +/* 색상 클릭시 */ +function select_color(code) { + xGetElementById("color_input").value = code; + xGetElementById("preview_color").style.backgroundColor = "#"+code; +} + +/* 색상표를 출력 */ +function printColor(blank_img_src) { + var colorTable = new Array('22','44','66','88','AA','CC','EE'); + var html = ""; + + for(var i=0;i<8;i+=1) html += printColorBlock(i.toString(16)+i.toString(16)+i.toString(16)+i.toString(16)+i.toString(16)+i.toString(16), blank_img_src); + + for(var i=0; i\"color\"<\/div>"; +} + +/* 수동 색상 변경시 */ +function manual_select_color(obj) { + if(obj.value.length!=6) return; + xGetElementById("preview_color").style.backgroundColor = "#"+obj.value; +} diff --git a/modules/editor/components/emoticon/emoticon.class.php b/modules/editor/components/emoticon/emoticon.class.php new file mode 100644 index 000000000..f808ac97d --- /dev/null +++ b/modules/editor/components/emoticon/emoticon.class.php @@ -0,0 +1,41 @@ +upload_target_srl = $upload_target_srl; + $this->component_path = $component_path; + } + + /** + * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 + **/ + function getPopupContent() { + // 템플릿을 미리 컴파일해서 컴파일된 소스를 return + $tpl_path = $this->component_path.'tpl'; + $tpl_file = 'popup.html'; + + Context::set("tpl_path", $tpl_path); + + // 이모티콘을 모두 가져옴 + $emoticon_list = FileHandler::readDir($tpl_path.'/images'); + Context::set('emoticon_list', $emoticon_list); + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + } +?> diff --git a/modules/editor/components/emoticon/icon.gif b/modules/editor/components/emoticon/icon.gif new file mode 100644 index 000000000..473b58146 Binary files /dev/null and b/modules/editor/components/emoticon/icon.gif differ diff --git a/modules/editor/components/emoticon/info.xml b/modules/editor/components/emoticon/info.xml new file mode 100644 index 000000000..3209015a1 --- /dev/null +++ b/modules/editor/components/emoticon/info.xml @@ -0,0 +1,17 @@ + + + 이모티콘 출력 + 顔文字 + 表情图标 + Display Emoticons + + 제로 + Zero + zero + zero + 이모티콘을 에디터에 삽입할 수 있습니다. + 顔文字(イモティコン)をエディターに追加することができます。 + 可以插入表情图标到编辑器。 + It can insert emoticons to editor. + + diff --git a/modules/editor/components/emoticon/tpl/images/msn001.gif b/modules/editor/components/emoticon/tpl/images/msn001.gif new file mode 100644 index 000000000..cdbd99eab Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn001.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn002.gif b/modules/editor/components/emoticon/tpl/images/msn002.gif new file mode 100644 index 000000000..1cb28dfa5 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn002.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn003.gif b/modules/editor/components/emoticon/tpl/images/msn003.gif new file mode 100644 index 000000000..92498b893 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn003.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn004.gif b/modules/editor/components/emoticon/tpl/images/msn004.gif new file mode 100644 index 000000000..4d28cddb7 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn004.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn005.gif b/modules/editor/components/emoticon/tpl/images/msn005.gif new file mode 100644 index 000000000..261ff6f1e Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn005.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn006.gif b/modules/editor/components/emoticon/tpl/images/msn006.gif new file mode 100644 index 000000000..4147ae7fc Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn006.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn007.gif b/modules/editor/components/emoticon/tpl/images/msn007.gif new file mode 100644 index 000000000..0e7756bfd Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn007.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn008.gif b/modules/editor/components/emoticon/tpl/images/msn008.gif new file mode 100644 index 000000000..c20b32598 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn008.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn009.gif b/modules/editor/components/emoticon/tpl/images/msn009.gif new file mode 100644 index 000000000..0b843dd1e Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn009.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn010.gif b/modules/editor/components/emoticon/tpl/images/msn010.gif new file mode 100644 index 000000000..0188685b9 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn010.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn011.gif b/modules/editor/components/emoticon/tpl/images/msn011.gif new file mode 100644 index 000000000..e3548aeb1 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn011.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn012.gif b/modules/editor/components/emoticon/tpl/images/msn012.gif new file mode 100644 index 000000000..96c29eea4 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn012.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn013.gif b/modules/editor/components/emoticon/tpl/images/msn013.gif new file mode 100644 index 000000000..baf46d258 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn013.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn014.gif b/modules/editor/components/emoticon/tpl/images/msn014.gif new file mode 100644 index 000000000..eee013eda Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn014.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn015.gif b/modules/editor/components/emoticon/tpl/images/msn015.gif new file mode 100644 index 000000000..0813a4f2b Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn015.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn016.gif b/modules/editor/components/emoticon/tpl/images/msn016.gif new file mode 100644 index 000000000..f187c63dd Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn016.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn017.gif b/modules/editor/components/emoticon/tpl/images/msn017.gif new file mode 100644 index 000000000..ccbb0758a Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn017.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn018.gif b/modules/editor/components/emoticon/tpl/images/msn018.gif new file mode 100644 index 000000000..b08d174ed Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn018.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn019.gif b/modules/editor/components/emoticon/tpl/images/msn019.gif new file mode 100644 index 000000000..7ba69aed3 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn019.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn020.gif b/modules/editor/components/emoticon/tpl/images/msn020.gif new file mode 100644 index 000000000..4808bb4c0 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn020.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn021.gif b/modules/editor/components/emoticon/tpl/images/msn021.gif new file mode 100644 index 000000000..02bcedb4e Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn021.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn022.gif b/modules/editor/components/emoticon/tpl/images/msn022.gif new file mode 100644 index 000000000..834ca31d3 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn022.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn023.gif b/modules/editor/components/emoticon/tpl/images/msn023.gif new file mode 100644 index 000000000..1c75a640a Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn023.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn024.gif b/modules/editor/components/emoticon/tpl/images/msn024.gif new file mode 100644 index 000000000..33c108eca Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn024.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn025.gif b/modules/editor/components/emoticon/tpl/images/msn025.gif new file mode 100644 index 000000000..0da3b10f5 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn025.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn026.gif b/modules/editor/components/emoticon/tpl/images/msn026.gif new file mode 100644 index 000000000..160f6a22f Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn026.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn027.gif b/modules/editor/components/emoticon/tpl/images/msn027.gif new file mode 100644 index 000000000..1e911fb26 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn027.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn028.gif b/modules/editor/components/emoticon/tpl/images/msn028.gif new file mode 100644 index 000000000..5439d0075 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn028.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn029.gif b/modules/editor/components/emoticon/tpl/images/msn029.gif new file mode 100644 index 000000000..cc4cec40a Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn029.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn030.gif b/modules/editor/components/emoticon/tpl/images/msn030.gif new file mode 100644 index 000000000..4beeeb88c Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn030.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn031.gif b/modules/editor/components/emoticon/tpl/images/msn031.gif new file mode 100644 index 000000000..c3bc29863 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn031.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn032.gif b/modules/editor/components/emoticon/tpl/images/msn032.gif new file mode 100644 index 000000000..6a8a26e9c Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn032.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn033.gif b/modules/editor/components/emoticon/tpl/images/msn033.gif new file mode 100644 index 000000000..f0dc4bf2d Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn033.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn034.gif b/modules/editor/components/emoticon/tpl/images/msn034.gif new file mode 100644 index 000000000..9283363c5 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn034.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn035.gif b/modules/editor/components/emoticon/tpl/images/msn035.gif new file mode 100644 index 000000000..6e2ecd3d3 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn035.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn036.gif b/modules/editor/components/emoticon/tpl/images/msn036.gif new file mode 100644 index 000000000..ddb0aa040 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn036.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn037.gif b/modules/editor/components/emoticon/tpl/images/msn037.gif new file mode 100644 index 000000000..cfca21644 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn037.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn038.gif b/modules/editor/components/emoticon/tpl/images/msn038.gif new file mode 100644 index 000000000..14a163612 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn038.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn039.gif b/modules/editor/components/emoticon/tpl/images/msn039.gif new file mode 100644 index 000000000..f6c0d7f4e Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn039.gif differ diff --git a/modules/editor/components/emoticon/tpl/images/msn040.gif b/modules/editor/components/emoticon/tpl/images/msn040.gif new file mode 100644 index 000000000..d379bd702 Binary files /dev/null and b/modules/editor/components/emoticon/tpl/images/msn040.gif differ diff --git a/modules/editor/components/emoticon/tpl/popup.css b/modules/editor/components/emoticon/tpl/popup.css new file mode 100644 index 000000000..20a142957 --- /dev/null +++ b/modules/editor/components/emoticon/tpl/popup.css @@ -0,0 +1,9 @@ +@charset "utf-8"; + +@import url(../../../../../../modules/admin/tpl/css/admin.css); + +img.emoticon { + margin:10px; + cursor:pointer; +} + diff --git a/modules/editor/components/emoticon/tpl/popup.html b/modules/editor/components/emoticon/tpl/popup.html new file mode 100644 index 000000000..bd96a9f55 --- /dev/null +++ b/modules/editor/components/emoticon/tpl/popup.html @@ -0,0 +1,18 @@ + + + +
+

{$component_info->title} ver. {$component_info->version}

+
+ +
+ + + emoticon + + +
+ + diff --git a/modules/editor/components/emoticon/tpl/popup.js b/modules/editor/components/emoticon/tpl/popup.js new file mode 100644 index 000000000..e3a1598c3 --- /dev/null +++ b/modules/editor/components/emoticon/tpl/popup.js @@ -0,0 +1,15 @@ +function insertEmoticon(obj) { + if(typeof(opener)=='undefined') return; + + var url = obj.src.replace(request_uri,''); + var text = "\"emoticon\""; + + opener.editorFocus(opener.editorPrevSrl); + + var iframe_obj = opener.editorGetIFrame(opener.editorPrevSrl) + + opener.editorReplaceHTML(iframe_obj, text); + opener.editorFocus(opener.editorPrevSrl); + + window.close(); +} diff --git a/modules/editor/components/image_gallery/icon.gif b/modules/editor/components/image_gallery/icon.gif new file mode 100644 index 000000000..2b922e7dd Binary files /dev/null and b/modules/editor/components/image_gallery/icon.gif differ diff --git a/modules/editor/components/image_gallery/image_gallery.class.php b/modules/editor/components/image_gallery/image_gallery.class.php new file mode 100644 index 000000000..b12e8f8b1 --- /dev/null +++ b/modules/editor/components/image_gallery/image_gallery.class.php @@ -0,0 +1,71 @@ +upload_target_srl = $upload_target_srl; + $this->component_path = $component_path; + } + + /** + * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 + **/ + function getPopupContent() { + // 템플릿을 미리 컴파일해서 컴파일된 소스를 return + $tpl_path = $this->component_path.'tpl'; + $tpl_file = 'popup.html'; + + Context::set("tpl_path", $tpl_path); + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + /** + * @brief 에디터 컴포넌트가 별도의 고유 코드를 이용한다면 그 코드를 html로 변경하여 주는 method + * + * 이미지나 멀티미디어, 설문등 고유 코드가 필요한 에디터 컴포넌트는 고유코드를 내용에 추가하고 나서 + * DocumentModule::transContent() 에서 해당 컴포넌트의 transHtml() method를 호출하여 고유코드를 html로 변경 + **/ + function transHTML($xml_obj) { + $gallery_info->srl = rand(111111,999999); + $gallery_info->border_thickness = $xml_obj->attrs->border_thickness; + $gallery_info->gallery_style = $xml_obj->attrs->gallery_style; + $gallery_info->border_color = $xml_obj->attrs->border_color; + $gallery_info->bg_color = $xml_obj->attrs->bg_color; + $gallery_info->gallery_align = $xml_obj->attrs->gallery_align; + + $images_list = $xml_obj->attrs->images_list; + $images_list = preg_replace('/\.(gif|jpg|jpeg|png) /i',".\\1\n",$images_list); + $gallery_info->images_list = explode("\n",trim($images_list)); + + preg_match_all('/(width|height)([^[:digit:]]+)([0-9]+)/i',$xml_obj->attrs->style,$matches); + $gallery_info->width = trim($matches[3][0]); + if(!$gallery_info->width) $gallery_info->width = 400; + + Context::set('gallery_info', $gallery_info); + + $tpl_path = $this->component_path.'tpl'; + Context::set("tpl_path", $tpl_path); + + if($gallery_info->gallery_style == "list") $tpl_file = 'list_gallery.html'; + else $tpl_file = 'slide_gallery.html'; + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + } +?> diff --git a/modules/editor/components/image_gallery/info.xml b/modules/editor/components/image_gallery/info.xml new file mode 100644 index 000000000..bc8e447a1 --- /dev/null +++ b/modules/editor/components/image_gallery/info.xml @@ -0,0 +1,17 @@ + + + 기본 이미지 갤러리 + イメージギャラリー + 图片相册 + Basic Image Gallery + + 제로 + Zero + zero + zero + 첨부된 이미지파일을 이용하여 슬라이드/목록형 이미지 갤러리를 만들 수 있습니다. + 添付されたイメージファイルを利用して、スライド型・リスト型のイメージギャラリーが作成できます。 + 利用上传的图片文件实现幻灯片式或目录型相册图片。 + It can create image gallery of slide/list style by using attached image file. + + diff --git a/modules/editor/components/image_gallery/lang/en.lang.php b/modules/editor/components/image_gallery/lang/en.lang.php new file mode 100644 index 000000000..ab8e4d901 --- /dev/null +++ b/modules/editor/components/image_gallery/lang/en.lang.php @@ -0,0 +1,27 @@ + + * @brief editor module > language pack of image_gallery component. + **/ + + $lang->image_gallery = "Make Image Gallery"; + $lang->width = "Width"; + $lang->height = "Height"; + $lang->image_list = "Image List"; + $lang->gallery_style = "Gallery Style"; + $lang->gallery_slide_style = "Slide Style"; + $lang->gallery_slide_align = "Align Style"; + $lang->gallery_slide_center = "Center"; + $lang->gallery_slide_left = "Left"; + $lang->gallery_slide_right = "Right"; + $lang->gallery_list_style = "Expand All"; + $lang->gallery_border_color = "Border Color"; + $lang->gallery_border_thickness = "Border Thickness"; + $lang->gallery_bg_color = "Background Color"; + $lang->about_image_list = "Select file to add to the image gallery. You can drag it after selecting or shift+click(for selecting widely), ctrl+click(for selecting individually)"; + + $lang->cmd_gallery_prev = "Previous Picture"; + $lang->cmd_gallery_next = "Next Picture"; + $lang->cmd_gallery_thumbnail = "Thumbnail"; +?> diff --git a/modules/editor/components/image_gallery/lang/jp.lang.php b/modules/editor/components/image_gallery/lang/jp.lang.php new file mode 100644 index 000000000..11e64628d --- /dev/null +++ b/modules/editor/components/image_gallery/lang/jp.lang.php @@ -0,0 +1,26 @@ + 翻訳:RisaPapa + * @brief ウィジウィグエディター(editor)モジュール > イメージギャラリー(image_gallery)コンポネント言語パッケージ + **/ + + $lang->image_gallery = "イメージギャラリー作成"; + $lang->width = "横幅サイズ"; + $lang->height = "縦幅サイズ"; + $lang->image_list = "イメージリスト"; + $lang->gallery_style = "ギャラリースタイル"; + $lang->gallery_slide_style = "スライドスタイル"; + $lang->gallery_slide_align = "アライン位置"; + $lang->gallery_slide_center = "中央揃え"; + $lang->gallery_slide_left = "左揃え"; + $lang->gallery_slide_right = "右揃え"; + $lang->gallery_list_style = "展開表示(リスト)"; + $lang->gallery_border_color = "ボーダーカラー"; + $lang->gallery_border_thickness = "ボーダー"; + $lang->gallery_bg_color = "背景色"; + $lang->about_image_list = "イメージギャラリーに追加するファイルを選択してください。選択・ドラッグまたは「Shift+クリック(範囲選択)、Ctrl+クリック(個別選択)」ができます。"; + $lang->cmd_gallery_prev = "前のイメージ表示"; + $lang->cmd_gallery_next = "次のイメージ表示"; + $lang->cmd_gallery_thumbnail = "サムネール表示"; +?> diff --git a/modules/editor/components/image_gallery/lang/ko.lang.php b/modules/editor/components/image_gallery/lang/ko.lang.php new file mode 100644 index 000000000..511598e4a --- /dev/null +++ b/modules/editor/components/image_gallery/lang/ko.lang.php @@ -0,0 +1,27 @@ + + * @brief 위지윅에디터(editor) 모듈 > 이미지갤러리(image_gallery) 컴포넌트의 언어팩 + **/ + + $lang->image_gallery = "이미지 갤러리 제작"; + $lang->width = "가로크기"; + $lang->height = "세로크기"; + $lang->image_list = "이미지 목록"; + $lang->gallery_style = "갤러리형식 "; + $lang->gallery_slide_style = "슬라이드 형식"; + $lang->gallery_slide_align = "정렬방식"; + $lang->gallery_slide_center = "가운데"; + $lang->gallery_slide_left = "왼쪽"; + $lang->gallery_slide_right = "오른쪽"; + $lang->gallery_list_style = "모두 펼침"; + $lang->gallery_border_color = "테두리색"; + $lang->gallery_border_thickness = "테두리 두께"; + $lang->gallery_bg_color = "배경색"; + $lang->about_image_list = "이미지 갤러리에 추가할 파일을 선택하세요. 선택후 드래그 또는 shift+클릭(범위선택), ctrl+클릭(개별선택) 가능합니다"; + + $lang->cmd_gallery_prev = "이전 그림 보기"; + $lang->cmd_gallery_next = "다음 그림 보기"; + $lang->cmd_gallery_thumbnail = "썸네일 보기"; +?> diff --git a/modules/editor/components/image_gallery/lang/zh-CN.lang.php b/modules/editor/components/image_gallery/lang/zh-CN.lang.php new file mode 100644 index 000000000..87674c927 --- /dev/null +++ b/modules/editor/components/image_gallery/lang/zh-CN.lang.php @@ -0,0 +1,27 @@ + + * @brief 网页编辑器(editor) 模块 > 图像(image_gallery) 组件的语言包 + **/ + + $lang->image_gallery = "图像编辑"; + $lang->width = "宽度"; + $lang->height = "高度"; + $lang->image_list = "图像目录"; + $lang->gallery_style = "风格"; + $lang->gallery_slide_style = "幻灯片风格"; + $lang->gallery_slide_align = "对齐方式"; + $lang->gallery_slide_center = "居中对齐"; + $lang->gallery_slide_left = "左对齐"; + $lang->gallery_slide_right = "右对齐"; + $lang->gallery_list_style = "全部展开"; + $lang->gallery_border_color = "边框颜色"; + $lang->gallery_border_thickness = "边框粗细"; + $lang->gallery_bg_color = "背景颜色"; + $lang->about_image_list = "请选择要添加的图像文件。 选择后可以拖动或按 shift+点击(范围选择), ctrl+点击(个别选择)"; + + $lang->cmd_gallery_prev = "上一个"; + $lang->cmd_gallery_next = "下一个"; + $lang->cmd_gallery_thumbnail = "查看缩略图il"; +?> diff --git a/modules/editor/components/image_gallery/tpl/image_gallery_component.gif b/modules/editor/components/image_gallery/tpl/image_gallery_component.gif new file mode 100644 index 000000000..c3e1bbdb7 Binary files /dev/null and b/modules/editor/components/image_gallery/tpl/image_gallery_component.gif differ diff --git a/modules/editor/components/image_gallery/tpl/images/align_left.gif b/modules/editor/components/image_gallery/tpl/images/align_left.gif new file mode 100644 index 000000000..f16697d91 Binary files /dev/null and b/modules/editor/components/image_gallery/tpl/images/align_left.gif differ diff --git a/modules/editor/components/image_gallery/tpl/images/align_middle.gif b/modules/editor/components/image_gallery/tpl/images/align_middle.gif new file mode 100644 index 000000000..5e9a00d35 Binary files /dev/null and b/modules/editor/components/image_gallery/tpl/images/align_middle.gif differ diff --git a/modules/editor/components/image_gallery/tpl/images/align_normal.gif b/modules/editor/components/image_gallery/tpl/images/align_normal.gif new file mode 100644 index 000000000..f16697d91 Binary files /dev/null and b/modules/editor/components/image_gallery/tpl/images/align_normal.gif differ diff --git a/modules/editor/components/image_gallery/tpl/images/align_right.gif b/modules/editor/components/image_gallery/tpl/images/align_right.gif new file mode 100644 index 000000000..0ac97aa0b Binary files /dev/null and b/modules/editor/components/image_gallery/tpl/images/align_right.gif differ diff --git a/modules/editor/components/image_gallery/tpl/images/blank.gif b/modules/editor/components/image_gallery/tpl/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/modules/editor/components/image_gallery/tpl/images/blank.gif differ diff --git a/modules/editor/components/image_gallery/tpl/images/border_solid.gif b/modules/editor/components/image_gallery/tpl/images/border_solid.gif new file mode 100644 index 000000000..9fbf79f57 Binary files /dev/null and b/modules/editor/components/image_gallery/tpl/images/border_solid.gif differ diff --git a/modules/editor/components/image_gallery/tpl/images/next.gif b/modules/editor/components/image_gallery/tpl/images/next.gif new file mode 100644 index 000000000..a68e3e806 Binary files /dev/null and b/modules/editor/components/image_gallery/tpl/images/next.gif differ diff --git a/modules/editor/components/image_gallery/tpl/images/prev.gif b/modules/editor/components/image_gallery/tpl/images/prev.gif new file mode 100644 index 000000000..6af480e39 Binary files /dev/null and b/modules/editor/components/image_gallery/tpl/images/prev.gif differ diff --git a/modules/editor/components/image_gallery/tpl/list_gallery.html b/modules/editor/components/image_gallery/tpl/list_gallery.html new file mode 100644 index 000000000..8d159d4ad --- /dev/null +++ b/modules/editor/components/image_gallery/tpl/list_gallery.html @@ -0,0 +1,14 @@ + + + +
+ +
diff --git a/modules/editor/components/image_gallery/tpl/list_gallery.js b/modules/editor/components/image_gallery/tpl/list_gallery.js new file mode 100644 index 000000000..d92ab8c14 --- /dev/null +++ b/modules/editor/components/image_gallery/tpl/list_gallery.js @@ -0,0 +1,85 @@ +/** + * @file list_gallery.js + * @brief 이미지 이미지갤러리 쇼 스크립트 + * @author zero (zero@nzeo.com) + **/ + +// 이미지갤러리쇼를 하기 위한 변수 +var list_gallery_images = new Array(); + +// 이미지갤러리쇼 이미지 목록에 추가 +function list_gallery_add_image(srl, image_url) { + if(!image_url) return; + if(image_url.indexOf('files')==0) image_url = request_uri+image_url; + + // 객체 생성 + var obj = {"srl":0, "image_url":null, "image":null} + + // list_gallery_images에 이미지갤러리 쇼 고유번호에 해당하는 공간을 초기화 + if(typeof(list_gallery_images[srl])=="undefined") list_gallery_images[srl] = new Array(); + + // 이미지갤러리쇼 고유번호를 세팅 + obj.srl = srl; + obj.idx = list_gallery_images[srl].length; + + // 원본 이미지를 미리 로딩 + obj.image = new Image(); + obj.image.src = image_url; + obj.image.srl = obj.srl; + obj.image.idx = obj.idx; + + // 생성된 객체를 list_gallery_images[이미지갤러리쇼 고유번호]에 추가 + list_gallery_images[srl][list_gallery_images[srl].length] = obj; +} + +// 이미지갤러리쇼 시작 +function start_list_gallery() { + + // 등록된 모든 이미지 목록을 돌면서 목록을 만들어줌 + for(var srl in list_gallery_images) { + + // 등록된 이미지가 없으면 pass~ + if(!list_gallery_images[srl].length) continue; + + // 메인이미지가 나올 곳과 썸네일이 노출될 곳의 객체를 구함 + var zone = xGetElementById('zone_list_gallery_'+srl); + + // 갤러리 외부 박스보다 이미지가 클 경우 resizing시킴 + var borderTop = parseInt(zone.style.borderTopWidth.replace(/px$/,''),10); + var borderLeft = parseInt(zone.style.borderLeftWidth.replace(/px$/,''),10); + var borderRight = parseInt(zone.style.borderRightWidth.replace(/px$/,''),10); + var borderBottom = parseInt(zone.style.borderBottomWidth.replace(/px$/,''),10); + + var zone_width = xWidth(zone)-borderLeft-borderRight; + + // 이미지 출력 + for(var i=0; i(zone_width-25)) { + resize_scale = (zone_width-25)/image_width; + image_width = parseInt(image_width*resize_scale,10); + image_height = parseInt(image_height*resize_scale,10); + } + + obj.image.style.width = image_width+"px"; + obj.image.style.height = image_height+"px"; + obj.image.style.marginLeft = "10px"; + obj.image.style.marginBottom = "10px"; + obj.image.style.display = "block"; + + // resize_scale이 1이 아니면, 즉 리사이즈 되었다면 해당 이미지 클릭시 원본을 새창으로 띄워줌 + if(resize_scale!=1) { + obj.image.style.cursor = 'pointer'; + xAddEventListener(obj.image, 'click', showOriginalImage); + } + + zone.appendChild(obj.image); + } + zone.style.paddingTop = "10px"; + } +} diff --git a/modules/editor/components/image_gallery/tpl/popup.css b/modules/editor/components/image_gallery/tpl/popup.css new file mode 100644 index 000000000..07fe31b57 --- /dev/null +++ b/modules/editor/components/image_gallery/tpl/popup.css @@ -0,0 +1,35 @@ +@charset "utf-8"; +@import url(../../../../../../modules/admin/tpl/css/admin.css); + +li { float:left; list-style:none; margin-right:5px; } + +img.bg_preview_color { + width:30px; + height:16px; + border:1px solid #000000; + background-color:#FFFFFF; +} + +img.border_preview_color { + width:30px; + height:16px; + border:1px solid #EEEEEE; + background-color:#000000; +} + +img.color_icon { + width:14px; + height:14px; + border:1px solid #FFFFFF; +} + +img.color_icon_over { + width:14px; + height:14px; + border:1px solid #000000; + cursor:pointer; +} + +.editor_color_box { clear:both; height:65px; width:400px; border:1px solid #DDDDDD; padding:2px; } + +.image_list { width:100%; border:1px solid #EEEEEE; } diff --git a/modules/editor/components/image_gallery/tpl/popup.html b/modules/editor/components/image_gallery/tpl/popup.html new file mode 100644 index 000000000..1ac863546 --- /dev/null +++ b/modules/editor/components/image_gallery/tpl/popup.html @@ -0,0 +1,89 @@ + + + + +
+

{$component_info->title} ver. {$component_info->version}

+
+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->width}px
{$lang->gallery_style} + +
{$lang->gallery_slide_align} + +
{$lang->gallery_border_thickness}px
{$lang->gallery_border_color} +
+ +
+
    +
  • blank
  • +
  • #
  • +
+
{$lang->gallery_bg_color} +
+ +
+
    +
  • blank
  • +
  • #
  • +
+
{$lang->image_list} + +

{$lang->about_image_list}

+
+
+ + + +
diff --git a/modules/editor/components/image_gallery/tpl/popup.js b/modules/editor/components/image_gallery/tpl/popup.js new file mode 100644 index 000000000..095b72977 --- /dev/null +++ b/modules/editor/components/image_gallery/tpl/popup.js @@ -0,0 +1,162 @@ +var selected_node = null; +function getSlideShow() { + // 부모창이 있는지 체크 + if(typeof(opener)=="undefined") return; + + // 부모 위지윅 에디터에서 선택된 영역이 있으면 처리 + var node = opener.editorPrevNode; + var selected_images = ""; + if(node && node.nodeName == "IMG") { + selected_node = node; + + var width = xWidth(selected_node)-4; + var gallery_style = selected_node.getAttribute("gallery_style"); + var gallery_align = selected_node.getAttribute("gallery_align"); + var border_color = selected_node.getAttribute("border_color"); + var bg_color = selected_node.getAttribute("bg_color"); + var border_thickness = selected_node.getAttribute("border_thickness"); + if(!border_thickness) border_thickness = 1; + + xGetElementById("width").value = width; + + if(gallery_style=="list") xGetElementById("gallery_style").selectedIndex = 1; + else xGetElementById("gallery_style").selectedIndex = 0; + + if(!gallery_align || gallery_align=="center") xGetElementById("gallery_align").selectedIndex = 0; + else if(gallery_align=="left") xGetElementById("gallery_align").selectedIndex = 1; + else if(gallery_align=="right") xGetElementById("gallery_align").selectedIndex = 2; + + xGetElementById("border_thickness").value = border_thickness; + + xGetElementById("border_color_input").value = border_color; + manual_select_color("border", xGetElementById("border_color_input")); + + xGetElementById("bg_color_input").value = bg_color; + manual_select_color("bg", xGetElementById("bg_color_input")); + + selected_images = selected_node.getAttribute("images_list"); + } + + // 부모창의 업로드된 파일중 이미지 목록을 모두 가져와서 세팅 + var fo = xGetElementById("fo"); + var upload_target_srl = fo.upload_target_srl.value; + + var parent_list_obj = opener.xGetElementById("uploaded_file_list_"+upload_target_srl); + if(parent_list_obj) { + + var list_obj = xGetElementById("image_list"); + + for(var i=0;i"; + opener.editorFocus(opener.editorPrevSrl); + var iframe_obj = opener.editorGetIFrame(opener.editorPrevSrl) + opener.editorReplaceHTML(iframe_obj, text); + } + + opener.editorFocus(opener.editorPrevSrl); + + window.close(); +} + +/* 색상 클릭시 */ +function select_color(type, code) { + xGetElementById(type+"_preview_color").style.backgroundColor = "#"+code; + xGetElementById(type+"_color_input").value = code; +} + +/* 수동 색상 변경시 */ +function manual_select_color(type, obj) { + if(obj.value.length!=6) return; + code = obj.value; + xGetElementById(type+"_preview_color").style.backgroundColor = "#"+code; +} + +/* 색상표를 출력 */ +function printColor(type, blank_img_src) { + var colorTable = new Array('22','44','66','88','AA','CC','EE'); + var html = ""; + + for(var i=0;i<8;i+=1) html += printColorBlock(type, i.toString(16)+i.toString(16)+i.toString(16)+i.toString(16)+i.toString(16)+i.toString(16), blank_img_src); + + for(var i=0; i\"color\"<\/div>"; + } else { + return "
\"color\"<\/div>"; + } +} + +xAddEventListener(window, "load", getSlideShow); diff --git a/modules/editor/components/image_gallery/tpl/slide_gallery.css b/modules/editor/components/image_gallery/tpl/slide_gallery.css new file mode 100644 index 000000000..9973a2218 --- /dev/null +++ b/modules/editor/components/image_gallery/tpl/slide_gallery.css @@ -0,0 +1,51 @@ +@charset "utf-8"; +.slide_gallery_loading_text { + color:#555555; + font-size:8pt; + font-family:tahoma; + font-weight:bold; + margin:20px 0px 20px 0px; + text-align:center; +} + +.slide_gallery_navigator_box { + font-size:9pt; + text-align:center; + margin:5px 0px 5px 0px; +} + +.zone_gallery_navigator_status { + color:#444444; + font-family:verdana; + font-size:8pt; + cursor:pointer; +} + +.slide_gallery_navigator_box img { + vertical-align:bottom; +} + +.slide_gallery_main_image_box { + border:3px solid #EEEEEE; + margin:10px; +} + +.slide_gallery_thumbnail_image_box { + margin:10px; + text-align:center; +} + +.slide_gallery_thumbnail_image_box img { + border:1px solid #555555; + padding:1px; + margin:4px; +} + +.slide_gallery_filename { + margin:5px 0px 10px 0px; +} + +.slide_gallery_filename A { + color:#000000; + text-decoration:none; +} diff --git a/modules/editor/components/image_gallery/tpl/slide_gallery.html b/modules/editor/components/image_gallery/tpl/slide_gallery.html new file mode 100644 index 000000000..06214bc48 --- /dev/null +++ b/modules/editor/components/image_gallery/tpl/slide_gallery.html @@ -0,0 +1,26 @@ + + + + + +
+ + + +
diff --git a/modules/editor/components/image_gallery/tpl/slide_gallery.js b/modules/editor/components/image_gallery/tpl/slide_gallery.js new file mode 100644 index 000000000..b56cfa3ac --- /dev/null +++ b/modules/editor/components/image_gallery/tpl/slide_gallery.js @@ -0,0 +1,194 @@ +/** + * @file slide_gallery.js + * @brief 이미지 이미지갤러리 쇼 스크립트 + * @author zero (zero@nzeo.com) + **/ + +// 이미지갤러리쇼를 하기 위한 변수 +var slide_gallery_images = new Array(); +var thumbnail_zone_height = new Array(); + +// 이미지갤러리쇼 이미지 목록에 추가 +function slide_gallery_add_image(srl, image_url) { + if(!image_url) return; + if(image_url.indexOf('files')==0) image_url = request_uri+image_url; + + // 객체 생성 + var obj = {"srl":0, "thumbnail_url":null, "thumbnail":null, "image_url":null, "image":null} + + // slide_gallery_images에 이미지갤러리 쇼 고유번호에 해당하는 공간을 초기화 + if(typeof(slide_gallery_images[srl])=="undefined") slide_gallery_images[srl] = new Array(); + + // 이미지갤러리쇼 고유번호를 세팅 + obj.srl = srl; + obj.idx = slide_gallery_images[srl].length; + obj.image_url = image_url; + + // 원본 이미지를 미리 로딩 + obj.image = new Image(); + obj.image.src = image_url; + //if(!obj.image.width) return; + + // 썸네일 이미지를 미리 로딩 + obj.thumbnail = new Image(); + obj.thumbnail.src = image_url; + obj.thumbnail.style.cursor = "pointer"; + obj.thumbnail.style.width = "60px"; + obj.thumbnail.style.height = "60px"; + obj.thumbnail.style.margin = "5px"; + obj.thumbnail.style.opacity = 0.5; + obj.thumbnail.style.filter = "alpha(opacity=50)"; + + // 썸네일 클릭시 메인 이미지로 바꾸어줌 + xAddEventListener(obj.thumbnail, "mousedown", function() { display_gallery_image(obj) }); + + // 생성된 객체를 slide_gallery_images[이미지갤러리쇼 고유번호]에 추가 + slide_gallery_images[srl][slide_gallery_images[srl].length] = obj; +} + +// 이미지갤러리쇼 시작 +function start_slide_gallery() { + + // 등록된 모든 이미지 목록을 돌면서 thumbnail 목록을 만들어줌 + for(var srl in slide_gallery_images) { + + // 등록된 이미지가 없으면 pass~ + if(!slide_gallery_images[srl].length) continue; + + // 메인이미지가 나올 곳과 썸네일이 노출될 곳의 객체를 구함 + var zone_thumbnail = xGetElementById('zone_thumbnail_'+srl); + + // 썸네일 출력 + for(var i=0; i(zone_width-20)) { + resize_scale = (zone_width-20)/image_width; + image_width = parseInt(image_width*resize_scale,10); + image_height = parseInt(image_height*resize_scale,10); + } + var x = parseInt((zone_width - image_width)/2,10); + + // 이미지 표시 + var target_image = xGetElementById("slide_gallery_main_image_"+obj.srl); + + target_image.style.marginLeft = x+"px"; + + target_image.src = obj.image.src; + target_image.srl = obj.srl; + target_image.idx = obj.idx; + target_image.style.opacity = 1; + target_image.style.filter = "alpha(opacity=100)"; + target_image.start_opacity = 0; + xWidth(target_image, image_width); + xHeight(target_image, image_height); + + if(image_height<200) { + target_image.style.marginTop = (100-image_height/2)+"px"; + target_image.style.marginBottom = (100-image_height/2)+"px"; + } else { + target_image.style.marginTop = "10px"; + target_image.style.marginBottom = "10px"; + } + + if(resize_scale!=1) { + xAddEventListener(target_image, 'click', showOriginalImage); + target_image.style.cursor = 'pointer'; + } else { + xRemoveEventListener(target_image, 'click', showOriginalImage); + target_image.style.cursor = 'default'; + } + + // resize_scale이 1이 아니면, 즉 리사이즈 되었다면 해당 이미지 클릭시 원본을 새창으로 띄워줌 + var next_idx = obj.idx+1; + if(slide_gallery_images[obj.srl].length<=next_idx) next_idx = 0; + + // srl의 모든 썸네일의 투명도 조절 + for(var i=0; i"+unescape(filename)+""); + + // 네이게이션 영역의 숫자 변경 + var zone_navigator = xGetElementById("zone_gallery_navigator_status_"+obj.srl); + var html = (obj.idx+1) + " / " + slide_gallery_images[obj.srl].length; + xInnerHtml(zone_navigator, html); +} + +// 이전 보기 +function gallery_view_prev(srl) { + var target_image = xGetElementById("slide_gallery_main_image_"+srl); + var idx = target_image.idx; + var max_length = slide_gallery_images[srl].length; + idx--; + if(idx<0) idx = max_length-1; + display_gallery_image(slide_gallery_images[srl][idx]); +} + +// 다음 보기 +function gallery_view_next(srl) { + var target_image = xGetElementById("slide_gallery_main_image_"+srl); + var idx = target_image.idx; + var max_length = slide_gallery_images[srl].length; + idx++; + if(idx>max_length-1) idx = 0; + display_gallery_image(slide_gallery_images[srl][idx]); +} + +// 썸네일 보기 +function gallery_view_thumbnail(srl) { + var thumbnail_zone = xGetElementById("zone_thumbnail_"+srl); + if(thumbnail_zone.style.display == "none") thumbnail_zone.style.display = "block"; + else thumbnail_zone.style.display = "none"; +} + diff --git a/modules/editor/components/image_link/icon.gif b/modules/editor/components/image_link/icon.gif new file mode 100644 index 000000000..3b9334c2d Binary files /dev/null and b/modules/editor/components/image_link/icon.gif differ diff --git a/modules/editor/components/image_link/image_link.class.php b/modules/editor/components/image_link/image_link.class.php new file mode 100644 index 000000000..8a3d2a89f --- /dev/null +++ b/modules/editor/components/image_link/image_link.class.php @@ -0,0 +1,85 @@ +upload_target_srl = $upload_target_srl; + $this->component_path = $component_path; + } + + /** + * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 + **/ + function getPopupContent() { + // 템플릿을 미리 컴파일해서 컴파일된 소스를 return + $tpl_path = $this->component_path.'tpl'; + $tpl_file = 'popup.html'; + + Context::set("tpl_path", $tpl_path); + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + /** + * @brief 에디터 컴포넌트가 별도의 고유 코드를 이용한다면 그 코드를 html로 변경하여 주는 method + * + * 이미지나 멀티미디어, 설문등 고유 코드가 필요한 에디터 컴포넌트는 고유코드를 내용에 추가하고 나서 + * DocumentModule::transContent() 에서 해당 컴포넌트의 transHtml() method를 호출하여 고유코드를 html로 변경 + **/ + function transHTML($xml_obj) { + $src = $xml_obj->attrs->src; + $width = $xml_obj->attrs->width; + $height = $xml_obj->attrs->height; + $align = $xml_obj->attrs->align; + $alt = $xml_obj->attrs->alt; + $border = $xml_obj->attrs->border; + $link_url = $xml_obj->attrs->link_url; + $open_window = $xml_obj->attrs->open_window; + + if(!$alt) { + $tmp_arr = explode('/',$src); + $alt = array_pop($tmp_arr); + } + + $src = str_replace(array('&','"'), array('&','&qout;'), $src); + if(!$alt) $alt = $src; + + $attr_output = array(); + $style_output = array(); + $attr_output = array("src=\"".$src."\""); + if($alt) { + $attr_output[] = "alt=\"".$alt."\""; + $attr_output[] = "title=\"".$alt."\""; + } + if($align) $attr_output[] = "align=\"".$align."\""; + + if(eregi("\.png$",$src)) $attr_output[] = "class=\"iePngFix\""; + + if($width) $style_output[] = "width:".$width."px"; + if($height) $style_output[] = "height:".$height."px"; + if(!$align) $style_output[] = "display:block"; + if($border) $style_output[] = "border:".$border."px"; + $code = sprintf("", implode(" ",$attr_output), implode(";",$style_output)); + + if($link_url) { + if($open_window =='Y') $code = sprintf('%s', $link_url, $code); + else $code = sprintf('%s', $link_url, $code); + } + return $code; + } + + } +?> diff --git a/modules/editor/components/image_link/info.xml b/modules/editor/components/image_link/info.xml new file mode 100644 index 000000000..2d6b372ed --- /dev/null +++ b/modules/editor/components/image_link/info.xml @@ -0,0 +1,17 @@ + + + 이미지 추가 + イメージ追加 + 插入图像 + Add Images + + 제로 + Zero + zero + zero + 에디터에 이미지를 추가하거나 속성을 변경할 수 있습니다. + エディターにイメージを追加したり、属性を変更したりすることができます。 + 可以插入图像或编辑其相应属性。 + It can add an image to editor or change the attribution of image. + + diff --git a/modules/editor/components/image_link/lang/en.lang.php b/modules/editor/components/image_link/lang/en.lang.php new file mode 100644 index 000000000..ecc125a8f --- /dev/null +++ b/modules/editor/components/image_link/lang/en.lang.php @@ -0,0 +1,21 @@ + + * @brief editor Module > language pack of image_link component + **/ + + $lang->image_url = "Image Path"; + $lang->image_alt = "Input Description"; + $lang->image_scale = "Image Size"; + $lang->image_align = "Align Style"; + $lang->image_align_normal = "Occupy a Paragraph"; + $lang->image_align_left = "Left of Article"; + $lang->image_align_middle = "Center"; + $lang->image_align_right = "Right of Article"; + $lang->image_border = "Border Thickness"; + $lang->urllink_url = "URL"; + + $lang->about_url_link_open_window = "Make the link to open as a new window"; + $lang->cmd_get_scale = "Get Image Size"; +?> diff --git a/modules/editor/components/image_link/lang/jp.lang.php b/modules/editor/components/image_link/lang/jp.lang.php new file mode 100644 index 000000000..d6ddd3d22 --- /dev/null +++ b/modules/editor/components/image_link/lang/jp.lang.php @@ -0,0 +1,23 @@ + 翻訳:RisaPapa + * @brief ウィジウィグエディター(editor)モジュール > イメージリンク(image_link)コンポネント言語パッケージ + **/ + + $lang->image_url = "イメージパス"; + $lang->image_alt = "説明(Alt)入力"; + $lang->image_scale = "イメージサイズ"; + $lang->image_align = "アライン位置"; + $lang->image_align_normal = "一段落"; + $lang->image_align_left = "左揃え"; + $lang->image_align_middle = "中央揃え"; + $lang->image_align_right = "右揃え"; + $lang->image_border = "ボーダー"; + $lang->urllink_url = "URL"; + + $lang->about_url_link_open_window = "チェックするとリンクをクリックした時に、新しいウィンドウで開きます。"; + $lang->cmd_get_scale = "サイズ表示"; + + $lang->cmd_get_scale = "サイズ表示"; +?> diff --git a/modules/editor/components/image_link/lang/ko.lang.php b/modules/editor/components/image_link/lang/ko.lang.php new file mode 100644 index 000000000..d8f9bfbbe --- /dev/null +++ b/modules/editor/components/image_link/lang/ko.lang.php @@ -0,0 +1,22 @@ + + * @brief 위지윅에디터(editor) 모듈 > 이미지링크(image_link) 컴포넌트의 언어팩 + **/ + + $lang->image_url = "이미지 경로"; + $lang->image_alt = "설명 입력"; + $lang->image_scale = "이미지크기"; + $lang->image_align = "정렬 방법 "; + $lang->image_align_normal = "한 문단을 차지"; + $lang->image_align_left = "글의 왼쪽으로"; + $lang->image_align_middle = "가운데"; + $lang->image_align_right = "글의 우측으로"; + $lang->image_border = "경계선 두께"; + + $lang->urllink_open_window = "새창열기"; + $lang->about_url_link_open_window = "선택하시면 링크 선택시 새창으로 열립니다"; + + $lang->cmd_get_scale = "크기 구하기"; +?> diff --git a/modules/editor/components/image_link/lang/zh-CN.lang.php b/modules/editor/components/image_link/lang/zh-CN.lang.php new file mode 100644 index 000000000..72163ad03 --- /dev/null +++ b/modules/editor/components/image_link/lang/zh-CN.lang.php @@ -0,0 +1,21 @@ + + * @brief 网页编辑器(editor) 模块 > 图像链接(image_link) 组件的语言包 + **/ + + $lang->image_url = "图像路径"; + $lang->image_alt = "图像说明"; + $lang->image_scale = "图像大小"; + $lang->image_align = "对齐方式"; + $lang->image_align_normal = "占一个段落"; + $lang->image_align_left = "内容左侧"; + $lang->image_align_middle = "居中"; + $lang->image_align_right = "内容右侧"; + $lang->image_border = "边框粗细"; + $lang->urllink_url = "URL"; + + $lang->about_url_link_open_window = "将在新窗口中打开链接。"; + $lang->cmd_get_scale = "获得图片大小"; +?> diff --git a/modules/editor/components/image_link/tpl/images/align_left.gif b/modules/editor/components/image_link/tpl/images/align_left.gif new file mode 100644 index 000000000..f16697d91 Binary files /dev/null and b/modules/editor/components/image_link/tpl/images/align_left.gif differ diff --git a/modules/editor/components/image_link/tpl/images/align_middle.gif b/modules/editor/components/image_link/tpl/images/align_middle.gif new file mode 100644 index 000000000..5e9a00d35 Binary files /dev/null and b/modules/editor/components/image_link/tpl/images/align_middle.gif differ diff --git a/modules/editor/components/image_link/tpl/images/align_normal.gif b/modules/editor/components/image_link/tpl/images/align_normal.gif new file mode 100644 index 000000000..f16697d91 Binary files /dev/null and b/modules/editor/components/image_link/tpl/images/align_normal.gif differ diff --git a/modules/editor/components/image_link/tpl/images/align_right.gif b/modules/editor/components/image_link/tpl/images/align_right.gif new file mode 100644 index 000000000..0ac97aa0b Binary files /dev/null and b/modules/editor/components/image_link/tpl/images/align_right.gif differ diff --git a/modules/editor/components/image_link/tpl/popup.css b/modules/editor/components/image_link/tpl/popup.css new file mode 100644 index 000000000..982c99327 --- /dev/null +++ b/modules/editor/components/image_link/tpl/popup.css @@ -0,0 +1,10 @@ +@charset "utf-8"; +@import url(../../../../../../modules/admin/tpl/css/admin.css); + +.image_align { + margin:0px 0px 5px 0px; + float:left; + width:200px; +} + +li {list-style:none; float:left; margin-right:.5em;} diff --git a/modules/editor/components/image_link/tpl/popup.html b/modules/editor/components/image_link/tpl/popup.html new file mode 100644 index 000000000..b0f190e4e --- /dev/null +++ b/modules/editor/components/image_link/tpl/popup.html @@ -0,0 +1,90 @@ + + + + +
+

{$component_info->title} ver. {$component_info->version}

+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->image_url}
{$lang->image_scale} + +
URL
{$lang->urllink_open_window} {$lang->about_url_link_open_window}
{$lang->image_alt}
{$lang->image_align} +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
{$lang->image_border}px
+
+ + +
diff --git a/modules/editor/components/image_link/tpl/popup.js b/modules/editor/components/image_link/tpl/popup.js new file mode 100644 index 000000000..2e815a32b --- /dev/null +++ b/modules/editor/components/image_link/tpl/popup.js @@ -0,0 +1,135 @@ +/** + * popup으로 열렸을 경우 부모창의 위지윅에디터에 select된 이미지가 있는지 체크하여 + * 있으면 가져와서 원하는 곳에 삽입 + **/ + +var orig_width = 0; +var orig_height = 0; +function getImage() { + // 부모 위지윅 에디터에서 선택된 영역이 있는지 확인 + if(typeof(opener)=="undefined") return; + + // url이 미리 입력되어 있을 경우 scale구해줌 + if(xGetElementById("image_url").value) { + getImageScale(); + return; + } + + // 부모 위지윅 에디터에서 선택된 영역이 있으면 처리 + var node = opener.editorPrevNode; + if(!node || node.nodeName != "IMG") { + return; + } + var src = node.getAttribute("src"); + var border = node.getAttribute("border"); + var align = node.getAttribute("align"); + var alt = node.getAttribute("alt"); + var width = node.getAttribute("width"); + var height = node.getAttribute("height"); + orig_width = width; + orig_height = height; + var link_url = node.getAttribute("link_url"); + var open_window = node.getAttribute("open_window"); + + xGetElementById("image_url").value = src; + xGetElementById("image_alt").value = alt; + + if(link_url) { + link_url = link_url.replace(/<([^>]*)>/ig,'').replace(/</ig,'<').replace(/>/ig,'>').replace(/&/ig,'&'); + xGetElementById('link_url').value = link_url; + } + if(open_window == 'Y') xGetElementById('open_window').checked = "true"; + + switch(align) { + case 'left' : xGetElementById("align_left").checked = true; break; + case 'middle' : xGetElementById("align_middle").checked = true; break; + case 'right' : xGetElementById("align_right").checked = true; break; + default : xGetElementById("align_normal").checked = true; break; + } + + xGetElementById("image_border").value = border; + + xGetElementById("width").value = width; + xGetElementById("height").value = height; + +} + +function getImageScale() { + var url = xGetElementById("image_url").value; + if(!url) return; + + var img = new Image(); + img.src = url; + + xGetElementById("width").value = img.width; + xGetElementById("height").value = img.height; + + orig_width = img.width; + orig_height = img.height; +} +function insertImage(obj) { + if(typeof(opener)=="undefined") return; + + var link_url = xGetElementById('link_url').value; + if(link_url) link_url = link_url.replace(/&/ig,'&').replace(//ig,'>'); + var open_window = 'N'; + if(xGetElementById('open_window').checked) open_window = 'Y'; + + var url = xGetElementById("image_url").value; + var alt = xGetElementById("image_alt").value; + var align = ""; + if(xGetElementById("align_normal").checked==true) align = ""; + else if(xGetElementById("align_left").checked==true) align = "left"; + else if(xGetElementById("align_middle").checked==true) align = "middle"; + else if(xGetElementById("align_right").checked==true) align = "right"; + var border = parseInt(xGetElementById("image_border").value,10); + + var width = xGetElementById("width").value; + var height = xGetElementById("height").value; + + if(!url) { + window.close(); + return; + } + + url = url.replace(request_uri,''); + var text = " + + 멀티미디어 자료 관리 + マルチメディア管理 + 多媒体 + Manage Multimedia Data + + 제로 + Zero + zero + zero + 에디터에 wmv,avi,flv등의 멀티미디어 자료를 추가하거나 속성을 수정할 수 있습니다. + エディターに拡張子が「wmv,avi,flv」などのマルチメディアコンテンツを追加したり、属性を修正したりすることができます。 + 插入wmv,avi,flv等多媒体文件或修改其相应属性 。 + It can add multimedia data like wmv,avi,flv to editor or change the attribution of multimedia data. + + diff --git a/modules/editor/components/multimedia_link/lang/en.lang.php b/modules/editor/components/multimedia_link/lang/en.lang.php new file mode 100644 index 000000000..f6e6fd1b6 --- /dev/null +++ b/modules/editor/components/multimedia_link/lang/en.lang.php @@ -0,0 +1,13 @@ + + * @brief editor module > language pack of multimedia_link component + **/ + + $lang->multimedia_url = "Multimedia Path"; + $lang->multimedia_caption = "Input Description"; + $lang->multimedia_width = "Width"; + $lang->multimedia_height = "Height"; + $lang->multimedia_auto_start = "Auto Start"; +?> diff --git a/modules/editor/components/multimedia_link/lang/jp.lang.php b/modules/editor/components/multimedia_link/lang/jp.lang.php new file mode 100644 index 000000000..16ed170e1 --- /dev/null +++ b/modules/editor/components/multimedia_link/lang/jp.lang.php @@ -0,0 +1,13 @@ + 翻訳:RisaPapa + * @brief ウィジウィグエディター(editor)モジュール > マルチメディアリンク((multimedia_link)コンポネント言語パッケージ + **/ + + $lang->multimedia_url = "マルチメディアのパス"; + $lang->multimedia_caption = "説明入力"; + $lang->multimedia_width = "横幅サイズ"; + $lang->multimedia_height = "縦幅サイズ"; + $lang->multimedia_auto_start = "自動再生"; +?> diff --git a/modules/editor/components/multimedia_link/lang/ko.lang.php b/modules/editor/components/multimedia_link/lang/ko.lang.php new file mode 100644 index 000000000..6655b451b --- /dev/null +++ b/modules/editor/components/multimedia_link/lang/ko.lang.php @@ -0,0 +1,13 @@ + + * @brief 위지윅에디터(editor) 모듈 > 멀티미디어 링크 (multimedia_link) 컴포넌트의 언어팩 + **/ + + $lang->multimedia_url = "멀티미디어 경로"; + $lang->multimedia_caption = "설명 입력"; + $lang->multimedia_width = "가로크기"; + $lang->multimedia_height = "세로크기"; + $lang->multimedia_auto_start = "자동시작"; +?> diff --git a/modules/editor/components/multimedia_link/lang/zh-CN.lang.php b/modules/editor/components/multimedia_link/lang/zh-CN.lang.php new file mode 100644 index 000000000..0ecd88f97 --- /dev/null +++ b/modules/editor/components/multimedia_link/lang/zh-CN.lang.php @@ -0,0 +1,13 @@ + + * @brief 网页编辑器(editor) 模块 > 媒体链接 (multimedia_link) 组件的语言包 + **/ + + $lang->multimedia_url = "媒体路径"; + $lang->multimedia_caption = "输入说明"; + $lang->multimedia_width = "宽度"; + $lang->multimedia_height = "高度"; + $lang->multimedia_auto_start = "自动播放"; +?> diff --git a/modules/editor/components/multimedia_link/multimedia_link.class.php b/modules/editor/components/multimedia_link/multimedia_link.class.php new file mode 100644 index 000000000..e1f0b5ba3 --- /dev/null +++ b/modules/editor/components/multimedia_link/multimedia_link.class.php @@ -0,0 +1,63 @@ +upload_target_srl = $upload_target_srl; + $this->component_path = $component_path; + } + + /** + * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 + **/ + function getPopupContent() { + // 템플릿을 미리 컴파일해서 컴파일된 소스를 return + $tpl_path = $this->component_path.'tpl'; + $tpl_file = 'popup.html'; + + Context::set("tpl_path", $tpl_path); + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + /** + * @brief 에디터 컴포넌트가 별도의 고유 코드를 이용한다면 그 코드를 html로 변경하여 주는 method + * + * 이미지나 멀티미디어, 설문등 고유 코드가 필요한 에디터 컴포넌트는 고유코드를 내용에 추가하고 나서 + * DocumentModule::transContent() 에서 해당 컴포넌트의 transHtml() method를 호출하여 고유코드를 html로 변경 + **/ + function transHTML($xml_obj) { + $src = $xml_obj->attrs->multimedia_src; + $style = $xml_obj->attrs->style; + + preg_match_all('/(width|height)([^[:digit:]]+)([0-9]+)/i',$style,$matches); + $width = trim($matches[3][0]); + $height = trim($matches[3][1]); + if(!$width) $width = 400; + if(!$height) $height = 400; + + $auto_start = $xml_obj->attrs->auto_start; + if($auto_start!="true") $auto_start = "false"; + else $auto_start = "true"; + + $caption = $xml_obj->body; + + $src = str_replace(array('&','"'), array('&','&qout;'), $src); + + return sprintf("
", $src, $width, $height, $auto_start); + } + } +?> diff --git a/modules/editor/components/multimedia_link/tpl/multimedia_link_component.gif b/modules/editor/components/multimedia_link/tpl/multimedia_link_component.gif new file mode 100644 index 000000000..5a32ea2ef Binary files /dev/null and b/modules/editor/components/multimedia_link/tpl/multimedia_link_component.gif differ diff --git a/modules/editor/components/multimedia_link/tpl/popup.css b/modules/editor/components/multimedia_link/tpl/popup.css new file mode 100644 index 000000000..7b1334f4d --- /dev/null +++ b/modules/editor/components/multimedia_link/tpl/popup.css @@ -0,0 +1,2 @@ +@charset "utf-8"; +@import url(../../../../../../modules/admin/tpl/css/admin.css); diff --git a/modules/editor/components/multimedia_link/tpl/popup.html b/modules/editor/components/multimedia_link/tpl/popup.html new file mode 100644 index 000000000..a88e51cb7 --- /dev/null +++ b/modules/editor/components/multimedia_link/tpl/popup.html @@ -0,0 +1,42 @@ + + + + +
+

{$component_info->title} ver. {$component_info->version}

+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
{$lang->multimedia_url}
{$lang->multimedia_caption}
{$lang->multimedia_width}px
{$lang->multimedia_height}px
{$lang->multimedia_auto_start}
+
+ + +
diff --git a/modules/editor/components/multimedia_link/tpl/popup.js b/modules/editor/components/multimedia_link/tpl/popup.js new file mode 100644 index 000000000..0d0c74900 --- /dev/null +++ b/modules/editor/components/multimedia_link/tpl/popup.js @@ -0,0 +1,60 @@ +/** + * popup으로 열렸을 경우 부모창의 위지윅에디터에 select된 멀티미디어 컴포넌트 코드를 체크하여 + * 있으면 가져와서 원하는 곳에 삽입 + **/ +function getMultimedia() { + // 부모 위지윅 에디터에서 선택된 영역이 있는지 확인 + if(typeof(opener)=="undefined") return; + + var node = opener.editorPrevNode; + if(!node || node.nodeName != "IMG") return; + + var url = node.getAttribute("multimedia_src"); + var caption = node.getAttribute("alt"); + var width = xWidth(node); + var height = xHeight(node); + var auto_start = node.getAttribute("auto_start"); + + xGetElementById("multimedia_url").value = url; + xGetElementById("multimedia_caption").value = caption; + xGetElementById("multimedia_width").value = width-4; + xGetElementById("multimedia_height").value = height-4; + if(auto_start=="true") xGetElementById("multimedia_auto_start").checked = true; + +} + +function insertMultimedia(obj) { + if(typeof(opener)=="undefined") return; + + var url = xGetElementById("multimedia_url").value; + url = url.replace(request_uri,''); + + var caption = xGetElementById("multimedia_caption").value; + + var width = xGetElementById("multimedia_width").value; + if(!width) width = 400; + + var height = xGetElementById("multimedia_height").value; + if(!height) height= 400; + + var auto_start = "false"; + if(xGetElementById("multimedia_auto_start").checked) auto_start = "true"; + + if(!url) { + window.close(); + return; + } + + var text = "\""+caption+"\""; + + opener.editorFocus(opener.editorPrevSrl); + + var iframe_obj = opener.editorGetIFrame(opener.editorPrevSrl) + + opener.editorReplaceHTML(iframe_obj, text); + opener.editorFocus(opener.editorPrevSrl); + + window.close(); +} + +xAddEventListener(window, "load", getMultimedia); diff --git a/modules/editor/components/naver_map/icon.gif b/modules/editor/components/naver_map/icon.gif new file mode 100644 index 000000000..26c0eaef4 Binary files /dev/null and b/modules/editor/components/naver_map/icon.gif differ diff --git a/modules/editor/components/naver_map/info.xml b/modules/editor/components/naver_map/info.xml new file mode 100644 index 000000000..66a584832 --- /dev/null +++ b/modules/editor/components/naver_map/info.xml @@ -0,0 +1,29 @@ + + + 네이버맵 연동 + ネイバーマップ + NAVER 地图 + Naver Map Open Api + + 제로 + Zero + zero + zero + 네이버에서 제공하는 네이버 지도 open api를 이용하여 에디터에 원하는 곳의 지도를 추가하거나 수정할 수 있습니다.\n네이버 지도 open api키를 발급 받아서 등록을 해주셔야 정상적인 사용이 가능합니다. + ネバーから提供されるネイバーマップのOpenAPIを利用してエディターに表示したい地図を追加したり修正したりすることができます。ネイバーマップは、OpenAPIキーを取得してから登録すれば使用することができます。 + naver提供的naver地图,利用open api在编辑器里添加或修改您所需要的地图。\n为了使用naver地图首先要取得open api key,然后登录此key才可正常使用。 + You can add a map to the editor or modify it by using Naver Map open api provided by Naver.\nYou would be able to use it when you register Naver Map api key after you get it from http://www.naver.com. + + + + 네이버지도 api key + APIキー + naver地图 api key + Naver Map api key + http://www.naver.com/ 에서 네이버 지도 API key를 발급 받으신 후 입력해주세요. + http://www.naver.com/ からネイバーマップのAPIキーを取得してから入力してください。 + 在http://www.naver.com/ 取得naver地图 API key后输入。 + Please get Naver Map API key from http://www.naver.com first and then input the key. + + + diff --git a/modules/editor/components/naver_map/lang/en.lang.php b/modules/editor/components/naver_map/lang/en.lang.php new file mode 100644 index 000000000..b8840e7ed --- /dev/null +++ b/modules/editor/components/naver_map/lang/en.lang.php @@ -0,0 +1,22 @@ + + * @brief editor module > language pack of multimedia_link(Naver Map) component + **/ + + $lang->map_width = "Width"; + $lang->map_height = "Height"; + + // Expressions + $lang->about_address = "Ex) Jeongjadong Boondang, Yeoksam"; + $lang->about_address_use = "Please search the address first and then press [Insert] button. Then, the map would be added to the article."; + + // Error Messages + $lang->msg_not_exists_addr = "Address doesn't exists"; + $lang->msg_fail_to_socket_open = "Failed to connect zip code searching server"; + $lang->msg_no_result = "Nothing Found"; + + $lang->msg_no_apikey = "Naver Map api key is necessary to use Naver Map.\nPlease input api key after selecting Module > WISYWIG Editor > Naver Map Open Api"; + +?> diff --git a/modules/editor/components/naver_map/lang/jp.lang.php b/modules/editor/components/naver_map/lang/jp.lang.php new file mode 100644 index 000000000..9346c207b --- /dev/null +++ b/modules/editor/components/naver_map/lang/jp.lang.php @@ -0,0 +1,21 @@ + 翻訳:RisaPapa + * @brief ウィジウィグエディター(editor) > マルチメディアリンク(naver_map)コンポネント言語パッケージ + **/ + + $lang->map_width = "横幅サイズ"; + $lang->map_height = "縦幅サイズ"; + + // 表示メッセージ + $lang->about_address = "例)분당 정자동, 역삼"; + $lang->about_address_use = "検索ウィンドウで住所を検索した後、出力された結果を選択して、「追加」ボタンを押せば、書き込みに地図が追加されます。"; + + // エラーメッセージ + $lang->msg_not_exists_addr = "検索対象がありません。"; + $lang->msg_fail_to_socket_open = "郵便番号を検索するサーバとの接続に失敗しました。"; + $lang->msg_no_result = "検索結果がありません。"; + + $lang->msg_no_apikey = "ネイバーマップを使用するためには、ネイバーマップのOpenAPIキーを取得しなければなりません。\nOpenAPIキーを 管理者 > ウィジウィグエディター > ネイバーマップコンポネント設定を選択した後、入力してください。"; +?> diff --git a/modules/editor/components/naver_map/lang/ko.lang.php b/modules/editor/components/naver_map/lang/ko.lang.php new file mode 100644 index 000000000..da1af2a8e --- /dev/null +++ b/modules/editor/components/naver_map/lang/ko.lang.php @@ -0,0 +1,21 @@ + + * @brief 위지윅에디터(editor) 모듈 > 멀티미디어 링크 (naver_map) 컴포넌트의 언어팩 + **/ + + $lang->map_width = "가로크기"; + $lang->map_height = "세로크기"; + + // 문구 + $lang->about_address = "예) 분당 정자동, 역삼"; + $lang->about_address_use = "검색창에서 원하는 주소를 검색하신후 출력된 결과물을 선택하시고 [추가] 버튼을 눌러주시면 글에 지도가 추가가 됩니다"; + + // 에러 메세지들 + $lang->msg_not_exists_addr = "검색하려는 대상이 없습니다"; + $lang->msg_fail_to_socket_open = "우편번호 검색 대상 서버 접속이 실패하였습니다"; + $lang->msg_no_result = "검색 결과가 없습니다"; + + $lang->msg_no_apikey = "네이버맵 사용을 위해서는 네이버맵 open api key가 있어야 합니다.\nopen api key를 관리자 > 위지윅에디터 > 네이버 지도 연동 컴포넌트 설정을 선택한 후 입력하여 주세요"; +?> diff --git a/modules/editor/components/naver_map/lang/zh-CN.lang.php b/modules/editor/components/naver_map/lang/zh-CN.lang.php new file mode 100644 index 000000000..8535f3252 --- /dev/null +++ b/modules/editor/components/naver_map/lang/zh-CN.lang.php @@ -0,0 +1,21 @@ + + * @brief 网页编辑器(editor) 模块 > naver地图 (naver_map) 组件语言包 + **/ + + $lang->map_width = "宽度"; + $lang->map_height = "高度"; + + // 词句 + $lang->about_address = "例) 王府井 餐厅, 月坛公园"; + $lang->about_address_use = "在搜索窗口搜索要找的地址后,按『添加』按钮即可把相关地图插入到文章当中。"; + + // 错误信息 + $lang->msg_not_exists_addr = "没有找到搜索的对象"; + $lang->msg_fail_to_socket_open = "链接搜索邮编服务器失败。"; + $lang->msg_no_result = "没有搜索结果"; + + $lang->msg_no_apikey = "要想使用naver地图,将需要一个open api key。\n 请选择管理员 > 网页编辑器 > naver地图设置后输入open api key。"; +?> diff --git a/modules/editor/components/naver_map/naver_map.class.php b/modules/editor/components/naver_map/naver_map.class.php new file mode 100644 index 000000000..5c1150839 --- /dev/null +++ b/modules/editor/components/naver_map/naver_map.class.php @@ -0,0 +1,183 @@ +upload_target_srl = $upload_target_srl; + $this->component_path = $component_path; + } + + /** + * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 + **/ + function getPopupContent() { + // 템플릿을 미리 컴파일해서 컴파일된 소스를 return + $tpl_path = $this->component_path.'tpl'; + + if(!$this->api_key) $tpl_file = 'error.html'; + else $tpl_file = 'popup.html'; + + Context::set("tpl_path", $tpl_path); + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + /** + * @brief naver map open api에서 주소를 찾는 함수 + **/ + function search_address() { + $address = Context::get('address'); + if(!$address) return new Object(-1,'msg_not_exists_addr'); + + Context::loadLang($this->component_path."lang"); + + // 지정된 서버에 요청을 시도한다 + $query_string = iconv("UTF-8","EUC-KR",sprintf('/api/geocode.php?key=%s&query=%s', $this->api_key, $address)); + + $fp = fsockopen('maps.naver.com', 80, $errno, $errstr); + if(!$fp) return new Object(-1, 'msg_fail_to_socket_open'); + + fputs($fp, "GET {$query_string} HTTP/1.0\r\n"); + fputs($fp, "Host: maps.naver.com\r\n\r\n"); + + $buff = ''; + while(!feof($fp)) { + $str = fgets($fp, 1024); + if(trim($str)=='') $start = true; + if($start) $buff .= trim($str); + } + + fclose($fp); + + $buff = trim(iconv("EUC-KR", "UTF-8", $buff)); + $buff = str_replace('', '', $buff); + + $oXmlParser = new XmlParser(); + $xml_doc = $oXmlParser->parse($buff); + + $addrs = $xml_doc->geocode->item; + if(!is_array($addrs)) $addrs = array($addrs); + $addrs_count = count($addrs); + + $address_list = array(); + for($i=0;$i<$addrs_count;$i++) { + $item = $addrs[$i]; + + $address_list[] = sprintf("%s,%s,%s", $item->point->x->body, $item->point->y->body, $item->address->body); + + } + + $this->add("address_list", implode("\n", $address_list)); + } + + /** + * @brief 에디터 컴포넌트가 별도의 고유 코드를 이용한다면 그 코드를 html로 변경하여 주는 method + * + * 이미지나 멀티미디어, 설문등 고유 코드가 필요한 에디터 컴포넌트는 고유코드를 내용에 추가하고 나서 + * DocumentModule::transContent() 에서 해당 컴포넌트의 transHtml() method를 호출하여 고유코드를 html로 변경 + * + * 네이버 지도 open api 는 doctype에 대한 오류 및 기타 등등등등의 문제 때문에 iframe 을 만들고 컴포넌트를 다시 호출해서 html을 출력하게 한다. + * 네이버 지도 open api 가 xhtml1-transitional.dtd 를 지원하게 되면 다시 깔끔하게 고쳐야 함.. + * 2006년 3월 12일 하루 다 날렸다~~~ ㅡ.ㅜ + **/ + function transHTML($xml_obj) { + $x = $xml_obj->attrs->x; + $y = $xml_obj->attrs->y; + $marker = $xml_obj->attrs->marker; + $style = $xml_obj->attrs->style; + + preg_match_all('/(width|height)([^[:digit:]]+)([0-9]+)/i',$style,$matches); + $width = trim($matches[3][0]); + $height = trim($matches[3][1]); + if(!$width) $width = 400; + if(!$height) $height = 400; + + $body_code = sprintf('
', $width, $height, Context::getRequestUri(), $width, $height, $x, $y, $marker, $width, $height); + return $body_code; + } + + function displayMap() { + $id = "navermap".rand(11111111,99999999); + + $width = Context::get('width'); + if(!$width) $width = 640; + + $height = Context::get('height'); + if(!$height) $height = 480; + + $x = Context::get('x'); + if(!$x) $x = 321198; + + $y = Context::get('y'); + if(!$y) $y = 529730; + + $marker = Context::get('marker'); + + $html = ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + '
'. + ''. + ''. + ''; + + print $html; + exit(); + } + } +?> diff --git a/modules/editor/components/naver_map/tpl/error.html b/modules/editor/components/naver_map/tpl/error.html new file mode 100644 index 000000000..1a909bf5d --- /dev/null +++ b/modules/editor/components/naver_map/tpl/error.html @@ -0,0 +1,10 @@ + + +
+
+ {nl2br($lang->msg_no_apikey)} +
+
+ +
+
diff --git a/modules/editor/components/naver_map/tpl/navermap_component.gif b/modules/editor/components/naver_map/tpl/navermap_component.gif new file mode 100644 index 000000000..a9e22712b Binary files /dev/null and b/modules/editor/components/naver_map/tpl/navermap_component.gif differ diff --git a/modules/editor/components/naver_map/tpl/popup.css b/modules/editor/components/naver_map/tpl/popup.css new file mode 100644 index 000000000..6080afd51 --- /dev/null +++ b/modules/editor/components/naver_map/tpl/popup.css @@ -0,0 +1,11 @@ +@charset "utf-8"; +@import url(../../../../../../modules/admin/tpl/css/admin.css); + +.search { border:1px solid #DDDDDD; padding:5px; } +#address { width:100px; } +.about_address { clear:both; color:#DDDDDD; } + +.address_list_box { color:#AAAAAA; margin-top:1em; clear:both;} +.address_list_box a { color:#AAAAAA; } + +#display_map { width:400px; height:400px; border:0px; border:1px solid #DDDDDD; margin-left:10px; } diff --git a/modules/editor/components/naver_map/tpl/popup.html b/modules/editor/components/naver_map/tpl/popup.html new file mode 100644 index 000000000..7cf0a97d1 --- /dev/null +++ b/modules/editor/components/naver_map/tpl/popup.html @@ -0,0 +1,57 @@ + + + + +
+

{$component_info->title} ver. {$component_info->version}

+
+ +
+ + + + + + + + +
+ + +
{$lang->about_address_use}
+ + + + + + + + + +
{$lang->map_width}px
{$lang->map_height}px
+
+ +
+
+ + diff --git a/modules/editor/components/naver_map/tpl/popup.js b/modules/editor/components/naver_map/tpl/popup.js new file mode 100644 index 000000000..1e301f25e --- /dev/null +++ b/modules/editor/components/naver_map/tpl/popup.js @@ -0,0 +1,108 @@ +/** + * popup으로 열렸을 경우 부모창의 위지윅에디터에 select된 멀티미디어 컴포넌트 코드를 체크하여 + * 있으면 가져와서 원하는 곳에 삽입 + **/ +function getNaverMap() { + // 부모 위지윅 에디터에서 선택된 영역이 있는지 확인 + if(typeof(opener)=="undefined") return; + + var node = opener.editorPrevNode; + if(!node || node.nodeName != "IMG") return; + + var x = node.getAttribute("x"); + var y = node.getAttribute("y"); + var width = xWidth(node); + var height = xHeight(node); + var address = node.getAttribute("address"); + + if(x&&y) { + xGetElementById("map_x").value = x; + xGetElementById("map_y").value = y; + moveMap(x,y,3); + } + if(address) { + xGetElementById("address").value = address; + search_address(address); + } + + xGetElementById("map_width").value = width-4; + xGetElementById("map_height").value = height-4; +} + +function insertNaverMap(obj) { + if(typeof(opener)=="undefined") return; + + var x = xGetElementById("map_x").value; + var y = xGetElementById("map_y").value; + var marker = xGetElementById("marker").value; + var address = xGetElementById("address").value; + + var width = xGetElementById("map_width").value; + var height = xGetElementById("map_height").value; + + var text = ""; + + opener.editorFocus(opener.editorPrevSrl); + + var iframe_obj = opener.editorGetIFrame(opener.editorPrevSrl) + + opener.editorReplaceHTML(iframe_obj, text); + opener.editorFocus(opener.editorPrevSrl); + + window.close(); +} + +xAddEventListener(window, "load", getNaverMap); + +/* 네이버의 map openapi로 주소에 따른 좌표를 요청 */ +function search_address(selected_address) { + if(typeof(selected_address)=="undefined") selected_address = null; + var address = xGetElementById("address").value; + if(!address) return; + var params = new Array(); + params['component'] = "naver_map"; + params['address'] = address; + params['method'] = "search_address"; + + var response_tags = new Array('error','message','address_list'); + exec_xml('editor', 'procEditorCall', params, complete_search_address, response_tags, selected_address); +} + +function moveMap(x,y,scale) { + if(typeof(scale)=="undefined") scale = 3; + display_map.moveMap(x,y,scale); +} + +function mapClicked(pos) { + xGetElementById("map_x").value = pos.x; + xGetElementById("map_y").value = pos.y; +} + +var naver_address_list = new Array(); +function complete_search_address(ret_obj, response_tags, selected_address) { + var address_list = ret_obj['address_list']; + if(!address_list) return; + + naver_address_list = new Array(); + + var html = ""; + var address_list = address_list.split("\n"); + for(var i=0;i"+item[2]+"
"; + } + + var list_zone = xGetElementById("address_list"); + xInnerHtml(list_zone, html); +} + +/* 마커 표시 */ +var marker_count = 1; +function addMarker(pos) { + if(marker_count>10) return; + xGetElementById("marker").value += '|@|'+pos; + marker_count++; + return true; +} diff --git a/modules/editor/components/poll_maker/icon.gif b/modules/editor/components/poll_maker/icon.gif new file mode 100644 index 000000000..b47fb1ba3 Binary files /dev/null and b/modules/editor/components/poll_maker/icon.gif differ diff --git a/modules/editor/components/poll_maker/info.xml b/modules/editor/components/poll_maker/info.xml new file mode 100644 index 000000000..868d875f2 --- /dev/null +++ b/modules/editor/components/poll_maker/info.xml @@ -0,0 +1,17 @@ + + + 설문조사 컴포넌트 + アンケート調査 + 投票调查 + Poll Component + + 제로 + Zero + zero + zero + 글 작성시에 설문조사를 첨부하실 수 있습니다. 설문조사 컴포넌트는 설문조사 모듈의 설정에 영향을 받습니다. + 書き込みにアンケート調査を追加して作成することができます。アンケートモジュールの影響を受けます。 + 发表主题时可以附加投票调查。投票调查组件受投票调查模块设置的影响。 + You can attach a poll on writing articles. Poll component is affected by setting of poll module. + + diff --git a/modules/editor/components/poll_maker/lang/en.lang.php b/modules/editor/components/poll_maker/lang/en.lang.php new file mode 100644 index 000000000..39d0afc06 --- /dev/null +++ b/modules/editor/components/poll_maker/lang/en.lang.php @@ -0,0 +1,18 @@ + + * @brief editor module > language pack of poll_maker component + **/ + + $lang->poll_title = "Title"; + $lang->poll_item = "Items"; + $lang->poll_stop_date = "Expiration Date"; + $lang->poll_chk_count = "Number of Checking Item"; + + $lang->cmd_add_poll = "Add Poll"; + $lang->cmd_del_poll = "Delete Poll"; + $lang->cmd_add_item = "Add Item"; + + $lang->msg_poll_cannot_modify = "You cannot modify the poll. It should be deleted to create a new poll"; +?> diff --git a/modules/editor/components/poll_maker/lang/jp.lang.php b/modules/editor/components/poll_maker/lang/jp.lang.php new file mode 100644 index 000000000..a6b861d58 --- /dev/null +++ b/modules/editor/components/poll_maker/lang/jp.lang.php @@ -0,0 +1,18 @@ + 翻訳:RisaPapa + * @brief ウィジウィグエディター(editor)モジュール > アンケート調査言語パッケージ + **/ + + $lang->poll_title = "タイトル"; + $lang->poll_item = "項目"; + $lang->poll_stop_date = "終了日"; + $lang->poll_chk_count = "選択項目数"; + + $lang->cmd_add_poll = "アンケート追加"; + $lang->cmd_del_poll = "アンケート削除"; + $lang->cmd_add_item = "項目追加"; + + $lang->msg_poll_cannot_modify = 'アンケート調査を修正することはできません。削除後、新しく作成しなければなりません。'; +?> diff --git a/modules/editor/components/poll_maker/lang/ko.lang.php b/modules/editor/components/poll_maker/lang/ko.lang.php new file mode 100644 index 000000000..ed2fe7fef --- /dev/null +++ b/modules/editor/components/poll_maker/lang/ko.lang.php @@ -0,0 +1,18 @@ + + * @brief 위지윅에디터(editor) 모듈 > 설문조사 컴포넌트의 언어팩 + **/ + + $lang->poll_title = "제목"; + $lang->poll_item = "항목"; + $lang->poll_stop_date = "종료 일자"; + $lang->poll_chk_count = "선택항목 수"; + + $lang->cmd_add_poll = "설문 추가"; + $lang->cmd_del_poll = "설문 제거"; + $lang->cmd_add_item = "항목 추가"; + + $lang->msg_poll_cannot_modify = '설문조사는 수정하실 수 없습니다. 삭제후 다시 생성하셔야 합니다'; +?> diff --git a/modules/editor/components/poll_maker/lang/zh-CN.lang.php b/modules/editor/components/poll_maker/lang/zh-CN.lang.php new file mode 100644 index 000000000..1cc51edb3 --- /dev/null +++ b/modules/editor/components/poll_maker/lang/zh-CN.lang.php @@ -0,0 +1,18 @@ + + * @brief 网页编辑器(editor) 模块 > 投票调查组件语言包 + **/ + + $lang->poll_title = "标题"; + $lang->poll_item = "项目"; + $lang->poll_stop_date = "结束日期"; + $lang->poll_chk_count = "选择项目数"; + + $lang->cmd_add_poll = "添加投票"; + $lang->cmd_del_poll = "解除投票"; + $lang->cmd_add_item = "添加项目"; + + $lang->msg_poll_cannot_modify = '投票调查不提供修改功能。必须删除后再生成'; +?> diff --git a/modules/editor/components/poll_maker/poll_maker.class.php b/modules/editor/components/poll_maker/poll_maker.class.php new file mode 100644 index 000000000..7b559fd56 --- /dev/null +++ b/modules/editor/components/poll_maker/poll_maker.class.php @@ -0,0 +1,53 @@ +upload_target_srl = $upload_target_srl; + $this->component_path = $component_path; + } + + /** + * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 + **/ + function getPopupContent() { + // 템플릿을 미리 컴파일해서 컴파일된 소스를 return + $tpl_path = $this->component_path.'tpl'; + $tpl_file = 'popup.html'; + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + /** + * @brief 에디터 컴포넌트가 별도의 고유 코드를 이용한다면 그 코드를 html로 변경하여 주는 method + * + * 이미지나 멀티미디어, 설문등 고유 코드가 필요한 에디터 컴포넌트는 고유코드를 내용에 추가하고 나서 + * DocumentModule::transContent() 에서 해당 컴포넌트의 transHtml() method를 호출하여 고유코드를 html로 변경 + **/ + function transHTML($xml_obj) { + $poll_srl = $xml_obj->attrs->poll_srl; + + preg_match('/width([^[:digit:]]+)([0-9]+)/i',$xml_obj->attrs->style,$matches); + $width = $matches[2]; + if(!$width) $width = 400; + $style = sprintf('width:%dpx', $width); + + // poll model 객체 생성해서 html 얻어와서 return + $oPollModel = &getModel('poll'); + return $oPollModel->getPollHtml($poll_srl, $style); + } + } +?> diff --git a/modules/editor/components/poll_maker/tpl/filter/insert_poll.xml b/modules/editor/components/poll_maker/tpl/filter/insert_poll.xml new file mode 100644 index 000000000..55d3413e3 --- /dev/null +++ b/modules/editor/components/poll_maker/tpl/filter/insert_poll.xml @@ -0,0 +1,9 @@ + +
+ + + + + + + diff --git a/modules/editor/components/poll_maker/tpl/poll_maker_component.gif b/modules/editor/components/poll_maker/tpl/poll_maker_component.gif new file mode 100644 index 000000000..a4a58a847 Binary files /dev/null and b/modules/editor/components/poll_maker/tpl/poll_maker_component.gif differ diff --git a/modules/editor/components/poll_maker/tpl/popup.css b/modules/editor/components/poll_maker/tpl/popup.css new file mode 100644 index 000000000..9835ccc69 --- /dev/null +++ b/modules/editor/components/poll_maker/tpl/popup.css @@ -0,0 +1,8 @@ +@charset "utf-8"; +@import url(../../../../../../modules/admin/tpl/css/admin.css); + +.pollButton { clear:both; margin:.5em 0 0 0; height:20px; } +.pollButton label { vertical-align:middle; color:#888888; } + +li { list-style:none; margin-right:5px; float:left; color:#666666} +li a { text-decoration:none; color:#666666;} diff --git a/modules/editor/components/poll_maker/tpl/popup.html b/modules/editor/components/poll_maker/tpl/popup.html new file mode 100644 index 000000000..fb1abeda7 --- /dev/null +++ b/modules/editor/components/poll_maker/tpl/popup.html @@ -0,0 +1,101 @@ + + + + + + + +
+

{$component_info->title} ver. {$component_info->version}

+
+ + + + + + + +
+ + + + + + + + +
{$lang->poll_stop_date} +
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • {$lang->cmd_add_poll}
  • +
+
+ + + +
+ + + + + diff --git a/modules/editor/components/poll_maker/tpl/popup.js b/modules/editor/components/poll_maker/tpl/popup.js new file mode 100644 index 000000000..8e3618100 --- /dev/null +++ b/modules/editor/components/poll_maker/tpl/popup.js @@ -0,0 +1,140 @@ +/** + * popup으로 열렸을 경우 부모창의 위지윅에디터에 select된 block이 있는지 체크하여 + * 있으면 가져와서 원하는 곳에 삽입 + **/ +var poll_index = 1; +function setPoll() { + var node = opener.editorPrevNode; + if(node && node.getAttribute('editor_component')=='poll_maker') { + alert(msg_poll_cannot_modify); + window.close(); + return; + } + + var obj = xCreateElement("div"); + var source = xGetElementById("poll_source"); + + var html = xInnerHtml(source); + html = html.replace(/tidx/g, poll_index); + xInnerHtml(obj, html); + + obj.id = "poll_"+poll_index; + obj.className = "poll_box"; + obj.style.display = "block"; + + source.parentNode.insertBefore(obj, source); + + setFixedPopupSize(); +} + +/** + * 부모창의 위지윅에디터에 데이터를 삽입 + **/ +function completeInsertPoll(ret_obj) { + if(typeof(opener)=="undefined") return null; + + var poll_srl = ret_obj["poll_srl"]; + if(!poll_srl) return null; + + var text = ""; + + alert(ret_obj['message']); + + var iframe_obj = opener.editorGetIFrame(opener.editorPrevSrl) + opener.editorReplaceHTML(iframe_obj, text); + + opener.focus(); + window.close(); + + return null; +} + +xAddEventListener(window, "load", setPoll); + +/** + * 새 설문 추가 + **/ +function doPollAdd() { + var obj = xCreateElement("div"); + var source = xGetElementById("poll_source"); + if(poll_index+1>8) return null; + poll_index++; + + var html = xInnerHtml(source); + html = html.replace(/tidx/g, poll_index); + xInnerHtml(obj, html); + + obj.id = "poll_"+poll_index; + obj.className = "poll_box"; + obj.style.display = "block"; + + source.parentNode.insertBefore(obj, source); + + setFixedPopupSize(); + + return null; +} + +/** + * 항목 삭제 + **/ +function doPollDelete(obj) { + var pobj = obj.parentNode.parentNode.parentNode.parentNode; + var tmp_arr = pobj.id.split('_'); + var index = tmp_arr[1]; + if(index==1) return; + + pobj.parentNode.removeChild(pobj); + + var obj_list = xGetElementsByClassName('poll_box'); + for(var i=0;i + + 인용구 작성 + 引用文作成 + 引用 + Quotations + + 제로 + Zero + zero + zero + 특정 범위를 인용문으로 꾸밀 수 있습니다. 외곽선의 종류나 색상, 굵기를 수정할 수 있으며 열기/닫기 기능을 가진 폴더기능을 만들 수 있습니다. + 特定範囲を引用文として表示することができます。ボーダーの種類、色、太さを修正することができ、「開く・畳む」の機能も作成できます。 + 可以把要发表的主题特定范围用引用布置。可以修改外围线的种类或粗细,还支持展开/折叠功能。 + You can decorate specific range as quotation. The style, color or thickness of outline can be modified and folder system which has open/close function can be made. + + diff --git a/modules/editor/components/quotation/lang/en.lang.php b/modules/editor/components/quotation/lang/en.lang.php new file mode 100644 index 000000000..061624f99 --- /dev/null +++ b/modules/editor/components/quotation/lang/en.lang.php @@ -0,0 +1,40 @@ + + * @brief editor module > language pack of quotation component + **/ + + $lang->quotation_use_folder = "Use Folding Function"; + $lang->quotation_opener = "Name of Open Button"; + $lang->quotation_closer = "Name of Close Button"; + $lang->quotation_padding = "Padding"; + $lang->quotation_margin = "Margin"; + $lang->quotation_border_color = "Border Color"; + $lang->quotation_border_thickness = "Border Thickness"; + + $lang->folder_text_bold = "Text Boldness"; + $lang->about_folder_text_bold = "Make Link Text Bold"; + + $lang->folder_text_color = "Link Color"; + $lang->folder_text_color_blue = "Blue"; + $lang->folder_text_color_red = "Red"; + $lang->folder_text_color_yellow = "Yellow"; + $lang->folder_text_color_green = "Green"; + + $lang->quotation_border_style = "Border Style"; + $lang->quotation_border_style_list = array( + "None", + "Solid", + "Dotted", + "Solid on Left", + "Solid on Right", + ); + + $lang->quotation_bg_color = "Background Color"; + + $lang->quotation_opener = "Name of Open Link"; + $lang->quotation_opener = "Name of Close Link"; + $lang->quotation_cmd_opener = "More..."; + $lang->quotation_cmd_closer = "Close"; +?> diff --git a/modules/editor/components/quotation/lang/jp.lang.php b/modules/editor/components/quotation/lang/jp.lang.php new file mode 100644 index 000000000..a5d1ac03e --- /dev/null +++ b/modules/editor/components/quotation/lang/jp.lang.php @@ -0,0 +1,40 @@ + 翻訳:RisaPapa + * @brief ウィジウィグエディター(editor)モジュール > 引用句 (quotation)コンポネント言語パッケージ + **/ + + $lang->quotation_use_folder = "畳み機能使用"; + $lang->quotation_opener = "開くボタン名"; + $lang->quotation_closer = "閉じるボタン名"; + $lang->quotation_padding = "内部余白"; + $lang->quotation_margin = "外部余白"; + $lang->quotation_border_color = "ボーダーカラー"; + $lang->quotation_border_thickness = "ボーダー"; + + $lang->folder_text_bold = "太字にする"; + $lang->about_folder_text_bold = "チェックするとリンクの文字列が太字で表示されます。"; + + $lang->folder_text_color = "リンク色 "; + $lang->folder_text_color_blue = "青"; + $lang->folder_text_color_red = "赤"; + $lang->folder_text_color_yellow = "黄"; + $lang->folder_text_color_green = "緑"; + + $lang->quotation_border_style = "ボーダータイプ"; + $lang->quotation_border_style_list = array( + "なし", + "実線", + "点線", + "左側実線", + "右側実践", + ); + + $lang->quotation_bg_color = "背景色"; + + $lang->quotation_opener = "「開く」リンク名"; + $lang->quotation_opener = "「閉じる」リンク名"; + $lang->quotation_cmd_opener = "詳細表示..."; + $lang->quotation_cmd_closer = "閉じる"; +?> diff --git a/modules/editor/components/quotation/lang/ko.lang.php b/modules/editor/components/quotation/lang/ko.lang.php new file mode 100644 index 000000000..3ccd1e989 --- /dev/null +++ b/modules/editor/components/quotation/lang/ko.lang.php @@ -0,0 +1,40 @@ + + * @brief 위지윅에디터(editor) 모듈 > 인용구 (quotation) 컴포넌트의 언어팩 + **/ + + $lang->quotation_use_folder = "접기 기능 사용"; + $lang->quotation_opener = "열기 버튼 이름"; + $lang->quotation_closer = "닫기 버튼 이름"; + $lang->quotation_padding = "내부 여백"; + $lang->quotation_margin = "외부 여백"; + $lang->quotation_border_color = "테두리 색"; + $lang->quotation_border_thickness = "테두리 굵기"; + + $lang->folder_text_bold = "글자 굵게"; + $lang->about_folder_text_bold = "선택하시면 링크의 글자가 굵게 표시됩니다"; + + $lang->folder_text_color = "링크 색상 "; + $lang->folder_text_color_blue = "파란색"; + $lang->folder_text_color_red = "붉은색"; + $lang->folder_text_color_yellow = "노란색"; + $lang->folder_text_color_green = "녹색"; + + $lang->quotation_border_style = "테두리 종류"; + $lang->quotation_border_style_list = array( + "없음", + "실선", + "점선", + "좌측 실선", + "우측 실선", + ); + + $lang->quotation_bg_color = "배경 색"; + + $lang->quotation_opener = "열기 링크 이름"; + $lang->quotation_opener = "닫기 링크 이름"; + $lang->quotation_cmd_opener = "더 보기..."; + $lang->quotation_cmd_closer = "닫기"; +?> diff --git a/modules/editor/components/quotation/lang/zh-CN.lang.php b/modules/editor/components/quotation/lang/zh-CN.lang.php new file mode 100644 index 000000000..9ecaaf20d --- /dev/null +++ b/modules/editor/components/quotation/lang/zh-CN.lang.php @@ -0,0 +1,40 @@ + + * @brief 网页编辑器(editor) 模块 > 引用 (quotation) 组件语言包 + **/ + + $lang->quotation_use_folder = "使用折叠功能"; + $lang->quotation_opener = "打开按钮名称"; + $lang->quotation_closer = "关闭按钮名称"; + $lang->quotation_padding = "内测边距"; + $lang->quotation_margin = "外侧边距"; + $lang->quotation_border_color = "边框颜色"; + $lang->quotation_border_thickness = "边框粗细"; + + $lang->folder_text_bold = "粗体显示"; + $lang->about_folder_text_bold = "选择此项将把链接的文本显示为粗体"; + + $lang->folder_text_color = "链接颜色"; + $lang->folder_text_color_blue = "蓝色"; + $lang->folder_text_color_red = "红色"; + $lang->folder_text_color_yellow = "黄色"; + $lang->folder_text_color_green = "绿色"; + + $lang->quotation_border_style = "边框种类"; + $lang->quotation_border_style_list = array( + "无", + "实线", + "点线", + "左侧实线", + "右侧实线", + ); + + $lang->quotation_bg_color = "背景颜色"; + + $lang->quotation_opener = "打开链接名称"; + $lang->quotation_opener = "关闭链接名称"; + $lang->quotation_cmd_opener = "更多..."; + $lang->quotation_cmd_closer = "关闭"; +?> diff --git a/modules/editor/components/quotation/quotation.class.php b/modules/editor/components/quotation/quotation.class.php new file mode 100644 index 000000000..c93b53d76 --- /dev/null +++ b/modules/editor/components/quotation/quotation.class.php @@ -0,0 +1,108 @@ +upload_target_srl = $upload_target_srl; + $this->component_path = $component_path; + } + + /** + * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 + **/ + function getPopupContent() { + // 템플릿을 미리 컴파일해서 컴파일된 소스를 return + $tpl_path = $this->component_path.'tpl'; + $tpl_file = 'popup.html'; + + Context::set("tpl_path", $tpl_path); + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + /** + * @brief 에디터 컴포넌트가 별도의 고유 코드를 이용한다면 그 코드를 html로 변경하여 주는 method + * + * 이미지나 멀티미디어, 설문등 고유 코드가 필요한 에디터 컴포넌트는 고유코드를 내용에 추가하고 나서 + * DocumentModule::transContent() 에서 해당 컴포넌트의 transHtml() method를 호출하여 고유코드를 html로 변경 + **/ + function transHTML($xml_obj) { + $use_folder = $xml_obj->attrs->use_folder; + $folder_opener = $xml_obj->attrs->folder_opener; + if(!$folder_opener) $folder_opener = "more..."; + $folder_closer = $xml_obj->attrs->folder_closer; + if(!$folder_closer) $folder_closer= "close..."; + $bold = $xml_obj->attrs->bold; + $color = $xml_obj->attrs->color; + $margin = $xml_obj->attrs->margin; + $padding = $xml_obj->attrs->padding; + $border_style = $xml_obj->attrs->border_style; + $border_thickness = $xml_obj->attrs->border_thickness; + $border_color = $xml_obj->attrs->border_color; + $bg_color = $xml_obj->attrs->bg_color; + $body = $xml_obj->body; + + $output = ""; + $style = sprintf('margin:%spx;padding:%spx;background-color:#%s;', $margin, $padding, $bg_color); + switch($border_style) { + case "solid" : + $style .= "border:".$border_thickness."px solid #".$border_color.";"; + break; + case "dotted" : + $style .= "border:".$border_thickness."px dotted #".$border_color.";"; + break; + case "left_solid" : + $style .= "border-left:".$border_thickness."px solid #".$border_color.";"; + break; + case "left_dotted" : + $style .= "border-elft:".$border_thickness."px dotted #".$border_color.";"; + break; + } + + if($use_folder == "Y") { + $folder_id = rand(1000000,9999999); + + if($bold == "Y") $class = "bold"; + switch($color) { + case "red" : + $class .= " editor_red_text"; + break; + case "yellow" : + $class .= " editor_yellow_text"; + break; + case "green" : + $class .= " editor_green_text"; + break; + default : + $class .= " editor_blue_text"; + break; + } + + $style .= "display:none;"; + + $folder_margin = sprintf("%spx %spx %spx %spx", $margin, $margin, 10, $margin); + $output .= sprintf('', $folder_id, $folder_margin, $class, $folder_id, $folder_opener); + $output .= sprintf('', $folder_id, $folder_margin, $class, $folder_id, $folder_closer); + + $output .= sprintf('
%s
', $style, $folder_id,$body); + } else { + $output .= sprintf('
%s
', $style, $body); + } + return $output; + } + + } +?> diff --git a/modules/editor/components/quotation/tpl/images/blank.gif b/modules/editor/components/quotation/tpl/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/modules/editor/components/quotation/tpl/images/blank.gif differ diff --git a/modules/editor/components/quotation/tpl/images/border_dotted.gif b/modules/editor/components/quotation/tpl/images/border_dotted.gif new file mode 100644 index 000000000..eaf1ae738 Binary files /dev/null and b/modules/editor/components/quotation/tpl/images/border_dotted.gif differ diff --git a/modules/editor/components/quotation/tpl/images/border_left_dotted.gif b/modules/editor/components/quotation/tpl/images/border_left_dotted.gif new file mode 100644 index 000000000..101259cb7 Binary files /dev/null and b/modules/editor/components/quotation/tpl/images/border_left_dotted.gif differ diff --git a/modules/editor/components/quotation/tpl/images/border_left_solid.gif b/modules/editor/components/quotation/tpl/images/border_left_solid.gif new file mode 100644 index 000000000..10b7e789f Binary files /dev/null and b/modules/editor/components/quotation/tpl/images/border_left_solid.gif differ diff --git a/modules/editor/components/quotation/tpl/images/border_solid.gif b/modules/editor/components/quotation/tpl/images/border_solid.gif new file mode 100644 index 000000000..9fbf79f57 Binary files /dev/null and b/modules/editor/components/quotation/tpl/images/border_solid.gif differ diff --git a/modules/editor/components/quotation/tpl/popup.css b/modules/editor/components/quotation/tpl/popup.css new file mode 100644 index 000000000..e16db9862 --- /dev/null +++ b/modules/editor/components/quotation/tpl/popup.css @@ -0,0 +1,24 @@ +@charset "utf-8"; +@import url(../../../../../../modules/admin/tpl/css/admin.css); + +#folder_area { clear:left; } + +.border_type { float:left; margin-right:1em; width:120px; } + +img.color_icon { width:14px; height:14px; border:1px solid #FFFFFF; } + +img.color_icon_over { width:14px; height:14px; border:1px solid #000000; cursor:pointer; } + +img.border_preview_color { width:30px; height:16px; border:1px solid #EEEEEE; background-color:#88EE22; } + +img.border_preview_none_color { width:30px; height:12px; border:1px solid #EEEEEE; background-color:#FFFFFF; } + +img.bg_preview_color { width:30px; height:16px; border:1px solid #000000; background-color:#FFFFFF; } + +.editor_color_box { clear:both; height:65px; width:400px; border:1px solid #DDDDDD; padding:2px; } + +.editor_link_type { float:left; margin-right:.5em; vertical-align:middle; white-space:nowrap; } + +.editor_color_input { clear:both; } + +li { list-style:none; float:left; margin:5px 10px 0px 0;} diff --git a/modules/editor/components/quotation/tpl/popup.html b/modules/editor/components/quotation/tpl/popup.html new file mode 100644 index 000000000..73c504f53 --- /dev/null +++ b/modules/editor/components/quotation/tpl/popup.html @@ -0,0 +1,149 @@ + + + + +
+

{$component_info->title} ver. {$component_info->version}

+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->quotation_use_folder} + + + +
{$lang->quotation_padding}px{$lang->quotation_margin}px{$lang->quotation_border_thickness}px
{$lang->quotation_border_style} +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
{$lang->quotation_border_color} +
+ +
+ +
    +
  • blank
  • +
  • #
  • +
+ +
{$lang->quotation_bg_color} +
+ +
+
    +
  • blank
  • +
  • #
  • +
+
+
+ + + +
diff --git a/modules/editor/components/quotation/tpl/popup.js b/modules/editor/components/quotation/tpl/popup.js new file mode 100644 index 000000000..74a77ac39 --- /dev/null +++ b/modules/editor/components/quotation/tpl/popup.js @@ -0,0 +1,261 @@ +/** + * popup으로 열렸을 경우 부모창의 위지윅에디터에 select된 멀티미디어 컴포넌트 코드를 체크하여 + * 있으면 가져와서 원하는 곳에 삽입 + **/ +var selected_node = null; +function getQuotation() { + // 부모 위지윅 에디터에서 선택된 영역이 있는지 확인 + if(typeof(opener)=="undefined") return; + + var node = opener.editorPrevNode; + if(!node || node.nodeName != "DIV") return; + + selected_node = node; + + var use_folder = node.getAttribute("use_folder"); + var folder_opener = node.getAttribute("folder_opener"); + var folder_closer = node.getAttribute("folder_closer"); + var bold = node.getAttribute("bold"); + var color = node.getAttribute("color"); + var margin = node.getAttribute("margin"); + var padding = node.getAttribute("padding"); + var border_style = node.getAttribute("border_style"); + var border_thickness = node.getAttribute("border_thickness"); + var border_color = node.getAttribute("border_color"); + var bg_color = node.getAttribute("bg_color"); + + if(use_folder=="Y") xGetElementById("quotation_use").checked = true; + else xGetElementById("quotation_use").checked = false; + toggle_folder( xGetElementById("quotation_use") ); + + if(bold=="Y") xGetElementById("quotation_bold").checked = true; + switch(color) { + case "red" : + xGetElementById("quotation_color_red").checked = true; + break; + case "yellow" : + xGetElementById("quotation_color_yellow").checked = true; + break; + case "green" : + xGetElementById("quotation_color_green").checked = true; + break; + default : + xGetElementById("quotation_color_blue").checked = true; + break; + } + + xGetElementById("quotation_opener").value = folder_opener; + xGetElementById("quotation_closer").value = folder_closer; + xGetElementById("quotation_margin").value = margin; + xGetElementById("quotation_padding").value = padding; + + switch(border_style) { + case "solid" : + xGetElementById("border_style_solid").checked = true; + break; + case "dotted" : + xGetElementById("border_style_dotted").checked = true; + break; + case "left_solid" : + xGetElementById("border_style_left_solid").checked = true; + break; + case "left_dotted" : + xGetElementById("border_style_left_dotted").checked = true; + break; + default : + xGetElementById("border_style_none").checked = true; + break; + } + + xGetElementById("border_thickness").value = border_thickness; + + select_color('border', border_color); + select_color('bg', bg_color); +} + +/* 추가 버튼 클릭시 부모창의 위지윅 에디터에 인용구 추가 */ +function insertQuotation() { + if(typeof(opener)=="undefined") return; + + var use_folder = "N"; + if(xGetElementById("quotation_use").checked) use_folder = "Y"; + + var folder_opener = xGetElementById("quotation_opener").value; + var folder_closer = xGetElementById("quotation_closer").value; + if(!folder_opener||!folder_closer) use_folder = "N"; + + var bold = "N"; + if(xGetElementById("quotation_bold").checked) bold = "Y"; + var color = "blue"; + if(xGetElementById("quotation_color_red").checked) color = "red"; + if(xGetElementById("quotation_color_yellow").checked) color = "yellow"; + if(xGetElementById("quotation_color_green").checked) color = "green"; + + var margin = parseInt(xGetElementById("quotation_margin").value,10); + + var padding = parseInt(xGetElementById("quotation_padding").value,10); + + var border_style = "solid"; + if(xGetElementById("border_style_none").checked) border_style = "none"; + if(xGetElementById("border_style_solid").checked) border_style = "solid"; + if(xGetElementById("border_style_dotted").checked) border_style = "dotted"; + if(xGetElementById("border_style_left_solid").checked) border_style = "left_solid"; + if(xGetElementById("border_style_left_dotted").checked) border_style = "left_dotted"; + + var border_thickness = parseInt(xGetElementById("border_thickness").value,10); + + var border_color = xGetElementById("border_color_input").value; + + var bg_color = xGetElementById("bg_color_input").value; + + var content = ""; + if(selected_node) content = xInnerHtml(selected_node); + else content = opener.editorGetSelectedHtml(opener.editorPrevSrl); + + var style = "margin:"+margin+"px; padding:"+padding+"px; background-color:#"+bg_color+";"; + switch(border_style) { + case "solid" : + style += "border:"+border_thickness+"px solid #"+border_color+";"; + break; + case "dotted" : + style += "border:"+border_thickness+"px dotted #"+border_color+";"; + break; + case "left_solid" : + style += "border-left:"+border_thickness+"px solid #"+border_color+";"; + break; + case "left_dotted" : + style += "border-left:"+border_thickness+"px dotted #"+border_color+";"; + break; + } + + if(!content) content = " "; + + var text = "\n
"+content+"
\n
"; + + if(selected_node) { + selected_node.setAttribute("use_folder", use_folder); + selected_node.setAttribute("folder_opener", folder_opener); + selected_node.setAttribute("folder_closer", folder_closer); + selected_node.setAttribute("bold", bold); + selected_node.setAttribute("color", color); + selected_node.setAttribute("margin", margin); + selected_node.setAttribute("padding", padding); + selected_node.setAttribute("border_style", border_style); + selected_node.setAttribute("border_thickness", border_thickness); + selected_node.setAttribute("border_color", border_color); + selected_node.setAttribute("bg_color", bg_color); + selected_node.setAttribute("style", style); + + selected_node.style.margin = margin+"px"; + selected_node.style.padding = padding +"px"; + selected_node.style.backgroundColor = "#"+bg_color; + + selected_node.style.borderStyle = "none"; + selected_node.style.borderWidth = "0px"; + + switch(border_style) { + case "solid" : + selected_node.style.borderStyle = "solid"; + selected_node.style.borderWidth = border_thickness+"px"; + selected_node.style.borderColor = "#"+border_color; + break; + case "dotted" : + selected_node.style.borderStyle = "dotted"; + selected_node.style.borderWidth = border_thickness+"px"; + selected_node.style.borderColor = "#"+border_color; + break; + case "left_solid" : + selected_node.style.borderLeftStyle = "solid"; + selected_node.style.borderLeftWidth = border_thickness+"px"; + selected_node.style.borderLeftColor = "#"+border_color; + break; + case "left_dotted" : + selected_node.style.borderLeftStyle = "dotted"; + selected_node.style.borderLeftWidth = border_thickness+"px"; + selected_node.style.borderCLeftColor = "#"+border_color; + break; + default : + selected_node.style.borderStyle = "solid"; + selected_node.style.borderWidth = "0px"; + selected_node.style.borderColor = "#"+border_color; + break; + } + + opener.editorFocus(opener.editorPrevSrl); + + } else { + + opener.editorFocus(opener.editorPrevSrl); + var iframe_obj = opener.editorGetIFrame(opener.editorPrevSrl) + opener.editorReplaceHTML(iframe_obj, text); + opener.editorFocus(opener.editorPrevSrl); + } + + window.close(); +} + +/* 색상 클릭시 */ +function select_color(type, code) { + xGetElementById(type+"_preview_color").style.backgroundColor = "#"+code; + xGetElementById(type+"_color_input").value = code; + + if(type=="border") { + xGetElementById("border_style_solid_icon").style.backgroundColor = "#"+code; + xGetElementById("border_style_dotted_icon").style.backgroundColor = "#"+code; + xGetElementById("border_style_left_solid_icon").style.backgroundColor = "#"+code; + xGetElementById("border_style_left_dotted_icon").style.backgroundColor = "#"+code; + } +} + +/* 수동 색상 변경시 */ +function manual_select_color(type, obj) { + if(obj.value.length!=6) return; + code = obj.value; + xGetElementById(type+"_preview_color").style.backgroundColor = "#"+code; + + if(type=="border") { + xGetElementById("border_style_solid_icon").style.backgroundColor = "#"+code; + xGetElementById("border_style_dotted_icon").style.backgroundColor = "#"+code; + xGetElementById("border_style_left_solid_icon").style.backgroundColor = "#"+code; + xGetElementById("border_style_left_dotted_icon").style.backgroundColor = "#"+code; + } +} + +/* 색상표를 출력 */ +function printColor(type, blank_img_src) { + var colorTable = new Array('22','44','66','88','AA','CC','EE'); + var html = ""; + + for(var i=0;i<8;i+=1) html += printColorBlock(type, i.toString(16)+i.toString(16)+i.toString(16)+i.toString(16)+i.toString(16)+i.toString(16), blank_img_src); + + for(var i=0; i\"color\"<\/div>"; + } else { + return "
\"color\"<\/div>"; + } +} + +/* 폴더 여닫기 기능 toggle */ +function toggle_folder(obj) { + if(obj.checked) xGetElementById("folder_area").style.display = "block"; + else xGetElementById("folder_area").style.display = "none"; + setFixedPopupSize(); +} + +xAddEventListener(window, "load", getQuotation); diff --git a/modules/editor/components/table_maker/icon.gif b/modules/editor/components/table_maker/icon.gif new file mode 100644 index 000000000..f32174284 Binary files /dev/null and b/modules/editor/components/table_maker/icon.gif differ diff --git a/modules/editor/components/table_maker/info.xml b/modules/editor/components/table_maker/info.xml new file mode 100644 index 000000000..f6a719e2c --- /dev/null +++ b/modules/editor/components/table_maker/info.xml @@ -0,0 +1,17 @@ + + + 표(table) 생성 + テーブル作成 + 表格 + Create Table + + 제로 + Zero + zero + zero + 에디터에 표(table)을 생성하거나 표(table) 또는 칸(td)의 속성을 변경할 수 있습니다. + エディターにテーブル(table)を作成したり、テーブル(table)またはセル(td)の属性を変更したりすることができます。 + 插入表格(table)或编辑表格属性。 + It can create a table on editor or modify the attribution of table or td. + + diff --git a/modules/editor/components/table_maker/lang/en.lang.php b/modules/editor/components/table_maker/lang/en.lang.php new file mode 100644 index 000000000..9f6e7c853 --- /dev/null +++ b/modules/editor/components/table_maker/lang/en.lang.php @@ -0,0 +1,24 @@ + + * @brief editor module > language pack of table_maker component + **/ + + $lang->table_attribute = "Change Table Attibution"; + $lang->cell_attribute = "Change Cell Attribution"; + + $lang->table_width = "Width"; + $lang->table_cols_count = "Number of Columns"; + $lang->table_rows_count = "Number of Rows"; + $lang->table_cellspacing = "Cellspacing"; + $lang->table_cellpadding = "Cellpadding"; + $lang->table_border = "Border Thicknes"; + $lang->table_inner_border = "Inner Line Thickness"; + + $lang->cell_width = "Width"; + $lang->cell_height = "Height"; + + $lang->table_border_color = "Border Color"; + $lang->table_bg_color = "Background Color"; +?> diff --git a/modules/editor/components/table_maker/lang/jp.lang.php b/modules/editor/components/table_maker/lang/jp.lang.php new file mode 100644 index 000000000..7f854fee2 --- /dev/null +++ b/modules/editor/components/table_maker/lang/jp.lang.php @@ -0,0 +1,24 @@ + 翻訳:RisaPapa + * @brief ウィジウィグエディター(editor) > テーブル生成(table_maker)コンポネント言語パッケージ + **/ + + $lang->table_attribute = "テーブル属性変更"; + $lang->cell_attribute = "セル属性変更"; + + $lang->table_width = "横幅サイズ"; + $lang->table_cols_count = "縦幅サイズ"; + $lang->table_rows_count = "列(Rows)数"; + $lang->table_cellspacing = "セルの間隔"; + $lang->table_cellpadding = "セル内余白"; + $lang->table_border = "ボーダー"; + $lang->table_inner_border = "ボーダー境界線の太さ"; + + $lang->cell_width = "セル横幅"; + $lang->cell_height = "セル立幅"; + + $lang->table_border_color = "ボーダーカラー"; + $lang->table_bg_color = "背景色"; +?> diff --git a/modules/editor/components/table_maker/lang/ko.lang.php b/modules/editor/components/table_maker/lang/ko.lang.php new file mode 100644 index 000000000..8de490f10 --- /dev/null +++ b/modules/editor/components/table_maker/lang/ko.lang.php @@ -0,0 +1,24 @@ + + * @brief 위지윅에디터(editor) 모듈 > 테이블 생성(table_maker) 컴포넌트의 언어팩 + **/ + + $lang->table_attribute = "테이블 속성 변경"; + $lang->cell_attribute = "셀 속성 변경"; + + $lang->table_width = "가로크기"; + $lang->table_cols_count = "가로열 갯수"; + $lang->table_rows_count = "세로열 갯수"; + $lang->table_cellspacing = "셀간 간격"; + $lang->table_cellpadding = "셀내 여백"; + $lang->table_border = "외곽선 굵기"; + $lang->table_inner_border = "구분선 굵기"; + + $lang->cell_width = "가로크기 "; + $lang->cell_height = "세로 크기 "; + + $lang->table_border_color = "외곽선 색"; + $lang->table_bg_color = "배경 색"; +?> diff --git a/modules/editor/components/table_maker/lang/zh-CN.lang.php b/modules/editor/components/table_maker/lang/zh-CN.lang.php new file mode 100644 index 000000000..8027bf68c --- /dev/null +++ b/modules/editor/components/table_maker/lang/zh-CN.lang.php @@ -0,0 +1,24 @@ + + * @brief 网页编辑器(editor) 模块 > 表格生成(table_maker) 组件的语言包 + **/ + + $lang->table_attribute = "修改表格属性"; + $lang->cell_attribute = "修改单元格属性"; + + $lang->table_width = "宽度"; + $lang->table_cols_count = "行数"; + $lang->table_rows_count = "列数"; + $lang->table_cellspacing = "单元格间距"; + $lang->table_cellpadding = "单元格边距"; + $lang->table_border = "边框粗细"; + $lang->table_inner_border = "区分线粗细"; + + $lang->cell_width = "宽度 "; + $lang->cell_height = "高度 "; + + $lang->table_border_color = "边框颜色"; + $lang->table_bg_color = "背景颜色"; +?> diff --git a/modules/editor/components/table_maker/table_maker.class.php b/modules/editor/components/table_maker/table_maker.class.php new file mode 100644 index 000000000..6b87d2758 --- /dev/null +++ b/modules/editor/components/table_maker/table_maker.class.php @@ -0,0 +1,37 @@ +upload_target_srl = $upload_target_srl; + $this->component_path = $component_path; + } + + /** + * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 + **/ + function getPopupContent() { + // 템플릿을 미리 컴파일해서 컴파일된 소스를 return + $tpl_path = $this->component_path.'tpl'; + $tpl_file = 'popup.html'; + + Context::set("tpl_path", $tpl_path); + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + } +?> diff --git a/modules/editor/components/table_maker/tpl/images/blank.gif b/modules/editor/components/table_maker/tpl/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/modules/editor/components/table_maker/tpl/images/blank.gif differ diff --git a/modules/editor/components/table_maker/tpl/images/border_dotted.gif b/modules/editor/components/table_maker/tpl/images/border_dotted.gif new file mode 100644 index 000000000..eaf1ae738 Binary files /dev/null and b/modules/editor/components/table_maker/tpl/images/border_dotted.gif differ diff --git a/modules/editor/components/table_maker/tpl/images/border_left_dotted.gif b/modules/editor/components/table_maker/tpl/images/border_left_dotted.gif new file mode 100644 index 000000000..101259cb7 Binary files /dev/null and b/modules/editor/components/table_maker/tpl/images/border_left_dotted.gif differ diff --git a/modules/editor/components/table_maker/tpl/images/border_left_solid.gif b/modules/editor/components/table_maker/tpl/images/border_left_solid.gif new file mode 100644 index 000000000..10b7e789f Binary files /dev/null and b/modules/editor/components/table_maker/tpl/images/border_left_solid.gif differ diff --git a/modules/editor/components/table_maker/tpl/images/border_solid.gif b/modules/editor/components/table_maker/tpl/images/border_solid.gif new file mode 100644 index 000000000..9fbf79f57 Binary files /dev/null and b/modules/editor/components/table_maker/tpl/images/border_solid.gif differ diff --git a/modules/editor/components/table_maker/tpl/popup.css b/modules/editor/components/table_maker/tpl/popup.css new file mode 100644 index 000000000..bd9498e7f --- /dev/null +++ b/modules/editor/components/table_maker/tpl/popup.css @@ -0,0 +1,51 @@ +@charset "utf-8"; +@import url(../../../../../../modules/admin/tpl/css/admin.css); + +#table_option { border:1px solid #EEEEEE; padding:.5em; color:#555555; font-weight:bold; } +#table_option input { vertical-align:middle; } +#table_option label { margin-left:.3em; margin-right:2em; } + +li { list-style:none; float:left; margin-right:5px; } + +img.color_icon { + width:14px; + height:14px; + border:1px solid #FFFFFF; +} + +img.color_icon_over { + width:14px; + height:14px; + border:1px solid #000000; + cursor:pointer; +} + +img.border_preview_color { + width:30px; + height:16px; + border:1px solid #EEEEEE; + background-color:#000000; +} + +img.border_preview_none_color { + width:30px; + height:12px; + border:1px solid #EEEEEE; + background-color:#FFFFFF; +} + +img.bg_preview_color { + width:30px; + height:16px; + border:1px solid #000000; + background-color:#FFFFFF; +} + +.editor_color_box { + clear:both; + height:65px; + width:400px; + border:1px solid #DDDDDD; + padding:2px; + margin-bottom:3px; +} diff --git a/modules/editor/components/table_maker/tpl/popup.html b/modules/editor/components/table_maker/tpl/popup.html new file mode 100644 index 000000000..52bc1ee70 --- /dev/null +++ b/modules/editor/components/table_maker/tpl/popup.html @@ -0,0 +1,137 @@ + + + + +
+

{$component_info->title} ver. {$component_info->version}

+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
{$lang->table_cellspacing}px{$lang->table_cellpadding}px
{$lang->table_border}px{$lang->table_inner_border}px
+ + + + + + +
+ + +
diff --git a/modules/editor/components/table_maker/tpl/popup.js b/modules/editor/components/table_maker/tpl/popup.js new file mode 100644 index 000000000..f8b28279b --- /dev/null +++ b/modules/editor/components/table_maker/tpl/popup.js @@ -0,0 +1,257 @@ +/** + * popup으로 열렸을 경우 부모창의 위지윅에디터에 select된 멀티미디어 컴포넌트 코드를 체크하여 + * 있으면 가져와서 원하는 곳에 삽입 + **/ +var selected_node = null; +function getTable() { + // 부모 위지윅 에디터에서 선택된 영역이 있는지 확인 + if(typeof(opener)=="undefined") return; + + var node = opener.editorPrevNode; + selected_node = node; + + // 선택된 객체가 없으면 테이블 새로 추가 + if(!selected_node) { + doSelectOption('table'); + } else { + doSelectOption('cell'); + } + + setFixedPopupSize(); +} + +/* 테이블, 셀 선택 옵션의 처리 */ +function doSelectOption(type) { + + // 셀 변경 + if(selected_node && type == "cell") { + xGetElementById("table_option").style.display = "block"; + xGetElementById("cell_attribute").style.display = "block"; + + var cell_width = selected_node.style.width.replace(/(px|\%)$/,''); + var cell_width_unit = selected_node.style.width.replace(/^([0-9]+)/,''); + var cell_height = selected_node.style.height.replace(/px$/,''); + + var border_color = selected_node.style.borderColor.replace(/^#/,''); + if(border_color.indexOf('rgb')>-1) { + var tmp_color = border_color.replace(/([a-z\(\) ]*)/ig,'').split(','); + border_color = xHex(tmp_color[0], 2, '')+xHex(tmp_color[1], 2, '')+xHex(tmp_color[2], 2, ''); + } + + var bg_color = selected_node.style.backgroundColor.replace(/^#/,''); + if(bg_color.indexOf('rgb')>-1) { + var tmp_color = bg_color.replace(/([a-z\(\) ]*)/ig,'').split(','); + bg_color = xHex(tmp_color[0], 2, '')+xHex(tmp_color[1], 2, '')+xHex(tmp_color[2], 2, ''); + } + if(!bg_color) bg_color = "FFFFFF"; + + xGetElementById("cell_width").value = cell_width?cell_width:0; + if(cell_width_unit=="px") xGetElementById("cell_width_unit_pixel").checked = "true"; + else xGetElementById("cell_width_unit_percent").value = "true"; + xGetElementById("cell_height").value = cell_height?cell_height:0; + + xGetElementById("border_color_input").value = border_color; + manual_select_color("border", xGetElementById("border_color_input")) + xGetElementById("bg_color_input").value = bg_color; + manual_select_color("bg", xGetElementById("bg_color_input")) + + xGetElementById("table_attribute").style.display = "none"; + xGetElementById("cell_attribute").style.display = "block"; + xGetElementById("cell_attribute_select").checked = true; + xGetElementById("border_color_area").style.display = "none"; + xGetElementById("bg_color_area").style.display = "block"; + + // 테이블 변경 + } else { + var table_obj = xParent(selected_node); + while(table_obj && table_obj.nodeName != "TABLE") { table_obj = xParent(table_obj); } + if(!table_obj) xGetElementById("col_row_area").style.display = "block"; + else { + xGetElementById("col_row_area").style.display = "none"; + + var width = table_obj.width.replace(/\%/,''); + var width_unit = table_obj.width.replace(/^([0-9]+)/,''); + if(!width_unit) xGetElementById("width_unit_pixel").checked = "true"; + else xGetElementById("width_unit_percent").value = "true"; + + var border = table_obj.style.borderLeftWidth.replace(/px$/,''); + if(!border) border = 0; + var inner_border = table_obj.getAttribute("border"); + if(!inner_border) inner_border = 0; + var cellspacing = table_obj.getAttribute("cellspacing"); + if(!cellspacing) cellspacing = 0; + var cellpadding = table_obj.getAttribute("cellpadding"); + if(!cellpadding) cellpadding = 1; + + var border_color = table_obj.style.borderColor.replace(/^#/,''); + if(border_color.indexOf('rgb')>-1) { + var tmp_color = border_color.replace(/([a-z\(\) ]*)/ig,'').split(','); + border_color = xHex(tmp_color[0], 2, '')+xHex(tmp_color[1], 2, '')+xHex(tmp_color[2], 2, ''); + } + + var bg_color = table_obj.style.backgroundColor.replace(/^#/,''); + if(bg_color.indexOf('rgb')>-1) { + var tmp_color = bg_color.replace(/([a-z\(\) ]*)/ig,'').split(','); + bg_color = xHex(tmp_color[0], 2, '')+xHex(tmp_color[1], 2, '')+xHex(tmp_color[2], 2, ''); + } + + xGetElementById("border_color_input").value = border_color; + manual_select_color("border", xGetElementById("border_color_input")) + xGetElementById("bg_color_input").value = bg_color; + manual_select_color("bg", xGetElementById("bg_color_input")) + + xGetElementById("width").value = width; + xGetElementById("border").value = border; + xGetElementById("inner_border").value = inner_border; + xGetElementById("cellspacing").value = cellspacing; + xGetElementById("cellpadding").value = cellpadding + } + xGetElementById("table_attribute").style.display = "block"; + xGetElementById("cell_attribute").style.display = "none"; + xGetElementById("table_attribute_select").checked = true; + xGetElementById("border_color_area").style.display = "block"; + xGetElementById("bg_color_area").style.display = "block"; + } + + setFixedPopupSize(); +} + +/* 추가 버튼 클릭시 부모창의 위지윅 에디터에 인용구 추가 */ +function insertTable() { + if(typeof(opener)=="undefined") return; + + var table_obj = null; + + if(selected_node) { + table_obj = xParent(selected_node); + while(table_obj && table_obj.nodeName != "TABLE") { table_obj = xParent(table_obj); } + } + + // 테이블 생성일 경우 + if(xGetElementById("table_attribute_select").checked && !table_obj) { + var cols_count = parseInt(xGetElementById("cols_count").value,10); + if(!cols_count) cols_count = 1; + + var rows_count = parseInt(xGetElementById("rows_count").value,10); + if(!rows_count) rows_count = 1; + + var width = parseInt(xGetElementById("width").value,10); + var width_unit = "%"; + if(xGetElementById("width_unit_pixel").checked) width_unit = ""; + + var border = parseInt(xGetElementById("border").value,10); + var inner_border = parseInt(xGetElementById("inner_border").value,10); + var cellspacing = parseInt(xGetElementById("cellspacing").value,10); + var cellpadding = parseInt(xGetElementById("cellpadding").value,10); + var border_color = xGetElementById("border_color_input").value; + if(border_color.length!=6) border_color = "000000"; + + var bg_color = xGetElementById("bg_color_input").value; + if(bg_color.length!=6) bg_color = "FFFFFF"; + + var text = ""; + text += "0) text += " style=\"border:"+border+"px solid #"+border_color+";background-color:#"+bg_color+"\" "; + text +=">"; + + for(var row=0; row"; + for(var col=0; col\"color\"<\/div>"; + } else { + return "
\"color\"<\/div>"; + } +} + +xAddEventListener(window, "load", getTable); + diff --git a/modules/editor/components/url_link/icon.gif b/modules/editor/components/url_link/icon.gif new file mode 100644 index 000000000..3f8c276c9 Binary files /dev/null and b/modules/editor/components/url_link/icon.gif differ diff --git a/modules/editor/components/url_link/info.xml b/modules/editor/components/url_link/info.xml new file mode 100644 index 000000000..30371092f --- /dev/null +++ b/modules/editor/components/url_link/info.xml @@ -0,0 +1,17 @@ + + + 링크 생성 + リンク生成 + 链接 + Create Link + + 제로 + Zero + zero + zero + 에디터에 링크를 추가하거나 링크의 속성을 변경할 수 있습니다. + エディターにリンクを追加したり、属性を変更したりすることができます。 + 插入链接或编辑链接属性。 + It can add a link to editor or modify the attribution of link. + + diff --git a/modules/editor/components/url_link/lang/en.lang.php b/modules/editor/components/url_link/lang/en.lang.php new file mode 100644 index 000000000..baecc4ba9 --- /dev/null +++ b/modules/editor/components/url_link/lang/en.lang.php @@ -0,0 +1,21 @@ + + * @brief editor module > language pack of url_link component + **/ + + $lang->urllink_title = "Title"; + $lang->urllink_url = "URL"; + $lang->urllink_open_window = "Open New Window"; + $lang->urllink_bold = "Bold Text"; + + $lang->urllink_color = "Link Color"; + $lang->urllink_color_blue = "Blue"; + $lang->urllink_color_red = "Red"; + $lang->urllink_color_yellow = "Yellow"; + $lang->urllink_color_green = "Green"; + + $lang->about_url_link_open_window = "Make the link to open as a new window"; + $lang->about_url_link_bold = "Make the link text bold"; +?> diff --git a/modules/editor/components/url_link/lang/jp.lang.php b/modules/editor/components/url_link/lang/jp.lang.php new file mode 100644 index 000000000..afeae95eb --- /dev/null +++ b/modules/editor/components/url_link/lang/jp.lang.php @@ -0,0 +1,21 @@ + 翻訳:RisaPapa + * @brief ウィジウィグエディターモジュール > urllink コンポネント言語パッケージ + **/ + + $lang->urllink_title = "タイトル"; + $lang->urllink_url = "URL"; + $lang->urllink_open_window = "新しい窓で開く"; + $lang->urllink_bold = "太字にする"; + + $lang->urllink_color = "リンクカラー "; + $lang->urllink_color_blue = "青"; + $lang->urllink_color_red = "赤"; + $lang->urllink_color_yellow = "黄"; + $lang->urllink_color_green = "緑"; + + $lang->about_url_link_open_window = "チェックするとリンクをクリックした時に、新しいウィンドウで開きます。"; + $lang->about_url_link_bold = "チェックするとリンクの文字列が太字で表示されます。"; +?> diff --git a/modules/editor/components/url_link/lang/ko.lang.php b/modules/editor/components/url_link/lang/ko.lang.php new file mode 100644 index 000000000..be1b1b390 --- /dev/null +++ b/modules/editor/components/url_link/lang/ko.lang.php @@ -0,0 +1,21 @@ + + * @brief 위지윅에디터(editor) 모듈 > urllink 컴포넌트의 언어팩 + **/ + + $lang->urllink_title = "제목"; + $lang->urllink_url = "URL"; + $lang->urllink_open_window = "새창열기"; + $lang->urllink_bold = "글자 굵게"; + + $lang->urllink_color = "링크 색상 "; + $lang->urllink_color_blue = "파란색"; + $lang->urllink_color_red = "붉은색"; + $lang->urllink_color_yellow = "노란색"; + $lang->urllink_color_green = "녹색"; + + $lang->about_url_link_open_window = "선택하시면 링크 선택시 새창으로 열립니다"; + $lang->about_url_link_bold = "선택하시면 링크의 글자가 굵게 표시됩니다"; +?> diff --git a/modules/editor/components/url_link/lang/zh-CN.lang.php b/modules/editor/components/url_link/lang/zh-CN.lang.php new file mode 100644 index 000000000..f3c72f135 --- /dev/null +++ b/modules/editor/components/url_link/lang/zh-CN.lang.php @@ -0,0 +1,21 @@ + + * @brief 网页编辑器(editor) 模块 > urllink组建语言包 + **/ + + $lang->urllink_title = "文本"; + $lang->urllink_url = "URL"; + $lang->urllink_open_window = "新窗口"; + $lang->urllink_bold = "粗体"; + + $lang->urllink_color = "链接颜色 "; + $lang->urllink_color_blue = "蓝色"; + $lang->urllink_color_red = "红色"; + $lang->urllink_color_yellow = "黄色"; + $lang->urllink_color_green = "绿色"; + + $lang->about_url_link_open_window = "将在新窗口中打开链接。"; + $lang->about_url_link_bold = "用粗体显示文本。"; +?> diff --git a/modules/editor/components/url_link/tpl/popup.css b/modules/editor/components/url_link/tpl/popup.css new file mode 100644 index 000000000..c69878329 --- /dev/null +++ b/modules/editor/components/url_link/tpl/popup.css @@ -0,0 +1,4 @@ +@charset "utf-8"; +@import url(../../../../../../modules/admin/tpl/css/admin.css); + +.link_color { float:left; margin-right:2em; } diff --git a/modules/editor/components/url_link/tpl/popup.html b/modules/editor/components/url_link/tpl/popup.html new file mode 100644 index 000000000..5392d94cc --- /dev/null +++ b/modules/editor/components/url_link/tpl/popup.html @@ -0,0 +1,65 @@ + + + + +
+

{$component_info->title} ver. {$component_info->version}

+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
{$lang->urllink_title}
{$lang->urllink_url}
{$lang->urllink_open_window}
{$lang->urllink_bold}
{$lang->urllink_color} + + + + + +
+
+ + + diff --git a/modules/editor/components/url_link/tpl/popup.js b/modules/editor/components/url_link/tpl/popup.js new file mode 100644 index 000000000..cd9e62c9c --- /dev/null +++ b/modules/editor/components/url_link/tpl/popup.js @@ -0,0 +1,108 @@ +/** + * popup으로 열렸을 경우 부모창의 위지윅에디터에 select된 block이 있는지 체크하여 + * 있으면 가져와서 원하는 곳에 삽입 + **/ +function getText() { + var node = opener.editorPrevNode; + if(!node) { + var fo_obj = xGetElementById("fo_component"); + var text = opener.editorGetSelectedHtml(opener.editorPrevSrl); + if(text==undefined) text = ""; + text = text.replace(/<([^>]*)>/ig,'').replace(/</ig,'<').replace(/>/ig,'>').replace(/&/ig,'&'); + fo_obj.text.value = text; + return; + } + + if(node.nodeName == "A") { + var url = node.getAttribute("HREF"); + var text = node.text.replace(/</ig,'<').replace(/>/ig,'>').replace(/&/ig,'&'); + + var open_window = false; + var bold = false; + var color = ""; + var className = node.className; + + var selectedHtml = opener.editorGetSelectedHtml(opener.editorPrevSrl); + if(selectedHtml.indexOf("window.open")>0) open_window = true; + + if(className) { + if(className.indexOf("bold")>-1) bold = true; + + if(className.indexOf("blue")>0) color = "color_blue"; + else if(className.indexOf("red")>0) color = "color_red"; + else if(className.indexOf("yellow")>0) color = "color_yellow"; + else if(className.indexOf("green")>0) color = "color_green"; + } + + var fo_obj = xGetElementById("fo_component"); + + fo_obj.text.value = text; + fo_obj.url.value = url.replace('&','&'); + if(open_window) fo_obj.open_window.checked = true; + if(bold) fo_obj.bold.checked = true; + if(color) xGetElementById(color).checked = true; + + return; + } else if(node.nodeName == "IMG") { + alert(1); + } else { + var fo_obj = xGetElementById("fo_component"); + fo_obj.text.value = text.replace(/<([^>]*)>/ig,'').replace(/</ig,'<').replace(/>/ig,'>').replace(/&/ig,'&'); + } +} + +/** + * 부모창의 위지윅에디터에 데이터를 삽입 + **/ +function setText() { + if(typeof(opener)=="undefined") return; + + var fo_obj = xGetElementById("fo_component"); + + var text = fo_obj.text.value; + text.replace(/&/ig,'&').replace(//ig,'>'); + var url = fo_obj.url.value; + url = url.replace(/&/ig,'&'); + var open_window = false; + var bold = false; + var link_class = ""; + var link = ""; + + if(!text) { + window.close(); + return; + } + + if(url) { + + if(fo_obj.open_window.checked) open_window = true; + if(fo_obj.bold.checked) bold= true; + if(xGetElementById("color_blue").checked) link_class = "editor_blue_text"; + else if(xGetElementById("color_red").checked) link_class = "editor_red_text"; + else if(xGetElementById("color_yellow").checked) link_class = "editor_yellow_text"; + else if(xGetElementById("color_green").checked) link_class = "editor_green_text"; + else link_class = ""; + + link = ""; + } else { + link = text; + } + + var iframe_obj = opener.editorGetIFrame(opener.editorPrevSrl) + opener.editorReplaceHTML(iframe_obj, link); + + opener.focus(); + window.close(); +} + +xAddEventListener(window, "load", getText); diff --git a/modules/editor/components/url_link/url_link.class.php b/modules/editor/components/url_link/url_link.class.php new file mode 100644 index 000000000..2f8fc7211 --- /dev/null +++ b/modules/editor/components/url_link/url_link.class.php @@ -0,0 +1,35 @@ +upload_target_srl = $upload_target_srl; + $this->component_path = $component_path; + } + + /** + * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 + **/ + function getPopupContent() { + // 템플릿을 미리 컴파일해서 컴파일된 소스를 return + $tpl_path = $this->component_path.'tpl'; + $tpl_file = 'popup.html'; + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + } +?> diff --git a/modules/editor/conf/info.xml b/modules/editor/conf/info.xml new file mode 100644 index 000000000..7afe58926 --- /dev/null +++ b/modules/editor/conf/info.xml @@ -0,0 +1,20 @@ + + + 위지윅 에디터 + WYSIWYG Editor + Editor WYSIWYG + 网页编辑器 + エディター + + 제로 + Zero + zero + zero + Zero + 위지윅 에디터를 출력하거나 에디터 컴포넌트들을 관리/중계하는 모듈입니다. + Module for displaying WYSIWYG editor and managing/relaying editor components. + Manejar/ transmitir módulo de componentes editores o muestra WYSIWYG editores. + 显示网页编辑器或管理/传递编辑器组件的模块。 + ウィジウィグエディター を出力したり、エディターのコンポネントを管理中継するモジュールです。 + + diff --git a/modules/editor/conf/module.xml b/modules/editor/conf/module.xml new file mode 100644 index 000000000..675fe2d18 --- /dev/null +++ b/modules/editor/conf/module.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/modules/editor/editor.admin.controller.php b/modules/editor/editor.admin.controller.php new file mode 100644 index 000000000..d67fe3179 --- /dev/null +++ b/modules/editor/editor.admin.controller.php @@ -0,0 +1,118 @@ +component_name = Context::get('component_name'); + $args->enabled = 'Y'; + $output = executeQuery('editor.updateComponent', $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_updated'); + } + + /** + * @brief 컴포넌트의 비활성화 + **/ + function procEditorAdminDisableComponent() { + $args->component_name = Context::get('component_name'); + $args->enabled = 'N'; + $output = executeQuery('editor.updateComponent', $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_updated'); + } + + /** + * @brief 컴포넌트의 위치 변경 + **/ + function procEditorAdminMoveListOrder() { + $args->component_name = Context::get('component_name'); + $mode = Context::get('mode'); + + // DB에서 전체 목록 가져옴 + $output = executeQuery('editor.getComponentList', $args); + $db_list = $output->data; + foreach($db_list as $key => $val) { + if($val->component_name == $args->component_name) break; + } + + if($mode=="up") { + if($key == 2) return new Object(-1,'msg_component_is_first_order'); + + $prev_args->component_name = $db_list[$key-1]->component_name; + $prev_args->list_order = $db_list[$key]->list_order; + executeQuery('editor.updateComponent', $prev_args); + + $cur_args->component_name = $db_list[$key]->component_name; + $cur_args->list_order = $db_list[$key-1]->list_order; + executeQuery('editor.updateComponent', $cur_args); + } else { + if($key == count($db_list)-1) return new Object(-1,'msg_component_is_last_order'); + + $next_args->component_name = $db_list[$key+1]->component_name; + $next_args->list_order = $db_list[$key]->list_order; + executeQuery('editor.updateComponent', $next_args); + + $cur_args->component_name = $db_list[$key]->component_name; + $cur_args->list_order = $db_list[$key+1]->list_order; + executeQuery('editor.updateComponent', $cur_args); + } + + $this->setMessage('success_updated'); + } + + /** + * @brief 컴포넌트 설정 + **/ + function procEditorAdminSetupComponent() { + $component_name = Context::get('component_name'); + $extra_vars = Context::getRequestVars(); + unset($extra_vars->component_name); + unset($extra_vars->module); + unset($extra_vars->act); + + $args->component_name = $component_name; + $args->extra_vars = serialize($extra_vars); + + $output = executeQuery('editor.updateComponent', $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_updated'); + } + + /** + * @brief 컴포넌트를 DB에 추가 + **/ + function insertComponent($component_name, $enabled = false) { + if($enabled) $enabled = 'Y'; + else $enabled = 'N'; + + $args->component_name = $component_name; + $args->enabled = $enabled; + + // 컴포넌트가 있는지 확인 + $output = executeQuery('editor.isComponentInserted', $args); + if($output->data->count) return new Object(-1, 'msg_component_is_not_founded'); + + // 입력 + $args->list_order = getNextSequence(); + $output = executeQuery('editor.insertComponent', $args); + return $output; + } + } +?> diff --git a/modules/editor/editor.admin.view.php b/modules/editor/editor.admin.view.php new file mode 100644 index 000000000..9333dc4d0 --- /dev/null +++ b/modules/editor/editor.admin.view.php @@ -0,0 +1,47 @@ +getComponentList(false); + + Context::set('component_list', $component_list); + + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('admin_index'); + } + + /** + * @brief 컴퍼넌트 setup + **/ + function dispEditorAdminSetupComponent() { + $component_name = Context::get('component_name'); + + $oEditorModel = &getModel('editor'); + $component = $oEditorModel->getComponent($component_name); + Context::set('component', $component); + + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('setup_component'); + $this->setLayoutFile("popup_layout"); + } + + } +?> diff --git a/modules/editor/editor.class.php b/modules/editor/editor.class.php new file mode 100644 index 000000000..8289183f5 --- /dev/null +++ b/modules/editor/editor.class.php @@ -0,0 +1,52 @@ +insertActionForward('editor', 'view', 'dispEditorAdminIndex'); + $oModuleController->insertActionForward('editor', 'view', 'dispEditorAdminSetupComponent'); + + // 기본 에디터 컴포넌트를 추가 + $oEditorController = &getAdminController('editor'); + $oEditorController->insertComponent('colorpicker_text',true); + $oEditorController->insertComponent('colorpicker_bg',true); + $oEditorController->insertComponent('emoticon',true); + $oEditorController->insertComponent('url_link',true); + $oEditorController->insertComponent('image_link',true); + $oEditorController->insertComponent('multimedia_link',true); + $oEditorController->insertComponent('quotation',true); + $oEditorController->insertComponent('table_maker',true); + $oEditorController->insertComponent('poll_maker',true); + $oEditorController->insertComponent('image_gallery',true); + + // 에디터 모듈에서 사용할 디렉토리 생성 + FileHandler::makeDir('./files/cache/editor'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + } +?> diff --git a/modules/editor/editor.controller.php b/modules/editor/editor.controller.php new file mode 100644 index 000000000..151f0ba8d --- /dev/null +++ b/modules/editor/editor.controller.php @@ -0,0 +1,94 @@ +deleteSavedDoc(); + + $args->document_srl = Context::get('document_srl'); + $args->content = Context::get('content'); + $args->title = Context::get('title'); + + if(Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + $args->member_srl = $logged_info->member_srl; + } else { + $args->ipaddress = $_SERVER['REMOTE_ADDR']; + } + + // 필요한 데이터가 없으면 pass + if(!$args->document_srl || (!$args->title && !$args->content)) return new Object(0,''); + + // 저장 + $output = executeQuery('editor.insertSavedDoc', $args); + + $this->setMessage('msg_auto_saved'); + } + + /** + * @brief 자동저장된 문서 삭제 + **/ + function procEditorRemoveSavedDoc() { + $oEditorController = &getController('editor'); + $oEditorController->deleteSavedDoc(); + } + + /** + * @brief 컴포넌트에서 ajax요청시 해당 컴포넌트의 method를 실행 + **/ + function procEditorCall() { + $component = Context::get('component'); + $method = Context::get('method'); + if(!$component) return new Object(-1, sprintf(Context::getLang('msg_component_is_not_founded'), $component)); + + $oEditorModel = &getModel('editor'); + $oComponent = &$oEditorModel->getComponentObject($component); + if(!$oComponent->toBool()) return $oComponent; + + if(!method_exists($oComponent, $method)) return new Object(-1, sprintf(Context::getLang('msg_component_is_not_founded'), $component)); + + //$output = call_user_method($method, $oComponent); + $output = call_user_func(array($oComponent, $method)); + if((is_a($output, 'Object') || is_subclass_of($output, 'Object')) && !$output->toBool()) return $output; + + $this->setError($oComponent->getError()); + $this->setMessage($oComponent->getMessage()); + + $vars = $oComponent->getVariables(); + if(count($vars)) { + foreach($vars as $key=>$val) $this->add($key, $val); + } + } + + /** + * @brief 자동 저장된 글을 삭제 + * 현재 접속한 사용자를 기준 + **/ + function deleteSavedDoc() { + if(Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + $args->member_srl = $logged_info->member_srl; + } else { + $args->ipaddress = $_SERVER['REMOTE_ADDR']; + } + + // 일단 이전 저장본 삭제 + executeQuery('editor.deleteSavedDoc', $args); + } + } +?> diff --git a/modules/editor/editor.model.php b/modules/editor/editor.model.php new file mode 100644 index 000000000..429b9219a --- /dev/null +++ b/modules/editor/editor.model.php @@ -0,0 +1,298 @@ +allow_fileupload) $allow_fileupload = false; + else $allow_fileupload = true; + + if(!$option->enable_autosave) $enable_autosave = false; + else $enable_autosave = true; + + if(!$option->enable_default_component) $enable_default_component = false; + else $enable_default_component = true; + + if(!$option->enable_component) $enable_component = false; + else $enable_component = true; + + if(!$option->resizable) $resizable = 'false'; + else $resizable = 'true'; + + if(!$option->height) $editor_height = 400; + else $editor_height = $option->height; + + // 대상 문서 번호 설정 + Context::set('upload_target_srl', $upload_target_srl); + + // 업로드 가능 변수 설정 + if($allow_fileupload) { + // 첨부파일 모듈의 정보를 구함 + $logged_info = Context::get('logged_info'); + if($logged_info->member_srl && $logged_info->is_admin == 'Y') { + $file_config->allowed_filesize = 1024*1024*1024; + $file_config->allowed_attach_size = 1024*1024*1024; + $file_config->allowed_filetypes = '*.*'; + } else { + $oModuleModel = &getModel('module'); + $file_config = $oModuleModel->getModuleConfig('file'); + $file_config->allowed_filesize = $file_config->allowed_filesize * 1024; + $file_config->allowed_attach_size = $file_config->allowed_attach_size * 1024; + } + Context::set('file_config',$file_config); + } + Context::set('allow_fileupload', $allow_fileupload); + + // 자동백업 기능 체크 + if($enable_autosave) { + $saved_doc = $this->getSavedDoc($upload_target_srl); + Context::set('saved_doc', $saved_doc); + } + Context::set('enable_autosave', $enable_autosave); + + // 에디터 컴포넌트 체크 + if($enable_component) { + if(!Context::get('component_list')) { + $component_list = $this->getComponentList(); + Context::set('component_list', $component_list); + } + } + Context::set('enable_component', $enable_component); + Context::set('enable_default_component', $enable_default_component); + + // resizable 가능한지 변수 설정 + Context::set('enable_resizable', $resizable); + + // 에디터 크기 설정 + Context::set('editor_height', $editor_height); + + // 템플릿을 미리 컴파일해서 컴파일된 소스를 return + $tpl_path = $this->module_path.'tpl'; + $tpl_file = 'editor.html'; + + // editor_path를 지정 + Context::set('editor_path', $tpl_path); + + // 만약 allow_fileupload == true 이면 upload_target_srl에 upload가능하다고 설정 + if($allow_fileupload) { + $oFileController = &getController('file'); + $oFileController->setUploadEnable($upload_target_srl); + } + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + /** + * @brief 자동저장되어 있는 정보를 가져옴 + **/ + function getSavedDoc($upload_target_srl) { + // 로그인 회원이면 member_srl, 아니면 ipaddress로 저장되어 있는 문서를 찾음 + if(Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + $auto_save_args->member_srl = $logged_info->member_srl; + } else { + $auto_save_args->ipaddress = $_SERVER['REMOTE_ADDR']; + } + + $output = executeQuery('editor.getSavedDocument', $auto_save_args); + $saved_doc = $output->data; + if(!$saved_doc) return; + + // 원본 글이 저장되어 있지 않은 글일 경우 첨부된 파일이 있으면 현재 글 번호로 옮김 + $oDocumentModel = &getModel('document'); + $document = $oDocumentModel->getDocument($saved_doc->document_srl); + if($document->document_srl != $saved_doc->document_srl) { + $module_srl = Context::get('module_srl'); + $oFileController = &getController('file'); + $oFileController->moveFile($saved_doc->document_srl, $module_srl, $upload_target_srl); + } + + return $saved_doc; + } + + /** + * @brief component의 객체 생성 + **/ + function getComponentObject($component, $upload_target_srl = 0) { + if(!$this->loaded_component_list[$component][$upload_target_srl]) { + // 해당 컴포넌트의 객체를 생성해서 실행 + $class_path = sprintf('%s/components/%s/', $this->module_path, $component); + $class_file = sprintf('%s%s.class.php', $class_path, $component); + if(!file_exists($class_file)) return new Object(-1, sprintf(Context::getLang('msg_component_is_not_founded'), $component)); + + // 클래스 파일을 읽은 후 객체 생성 + require_once($class_file); + $eval_str = sprintf('$oComponent = new %s("%s","%s");', $component, $upload_target_srl, $class_path); + @eval($eval_str); + if(!$oComponent) return new Object(-1, sprintf(Context::getLang('msg_component_is_not_founded'), $component)); + + // 설정 정보를 추가 + $component_info = $this->getComponent($component); + $oComponent->setInfo($component_info); + $this->loaded_component_list[$component][$upload_target_srl] = $oComponent; + } + + return $this->loaded_component_list[$component][$upload_target_srl]; + } + + /** + * @brief component 목록을 return (DB정보 보함) + **/ + function getComponentList($filter_enabled = true) { + if($filter_enabled) $args->enabled = "Y"; + + $output = executeQuery('editor.getComponentList', $args); + $db_list = $output->data; + + // 파일목록을 구함 + $downloaded_list = FileHandler::readDir($this->module_path.'components'); + + // DB 목록을 loop돌면서 xml정보까지 구함 + if(!is_array($db_list)) $db_list = array($db_list); + foreach($db_list as $component) { + if(in_array($component->component_name, array('colorpicker_text','colorpicker_bg'))) continue; + if(!$component->component_name) continue; + + $component_name = $component->component_name; + + unset($xml_info); + $xml_info = $this->getComponentXmlInfo($component_name); + $xml_info->enabled = $component->enabled; + + if($component->extra_vars && $xml_info->extra_vars) { + $extra_vars = unserialize($component->extra_vars); + foreach($xml_info->extra_vars as $key => $val) { + $xml_info->extra_vars->{$key}->value = $extra_vars->{$key}; + } + } + + $component_list->{$component_name} = $xml_info; + } + + // enabled만 체크하도록 하였으면 그냥 return + if($filter_enabled) return $component_list; + + // 다운로드된 목록의 xml_info를 마저 구함 + foreach($downloaded_list as $component_name) { + if(in_array($component_name, array('colorpicker_text','colorpicker_bg'))) continue; + + // 설정된 것이라면 패스 + if($component_list->{$component_name}) continue; + + // DB에 입력 + $oEditorController = &getAdminController('editor'); + $oEditorController->insertComponent($component_name, false); + + // component_list에 추가 + unset($xml_info); + $xml_info = $this->getComponentXmlInfo($component_name); + $xml_info->enabled = 'N'; + + $component_list->{$component_name} = $xml_info; + } + + return $component_list; + } + + /** + * @brief compnent의 xml+db정보를 구함 + **/ + function getComponent($component_name) { + $args->component_name = $component_name; + + $output = executeQuery('editor.getComponent', $args); + $component = $output->data; + + $component_name = $component->component_name; + + unset($xml_info); + $xml_info = $this->getComponentXmlInfo($component_name); + $xml_info->enabled = $component->enabled; + + if($component->extra_vars) { + $extra_vars = unserialize($component->extra_vars); + foreach($xml_info->extra_vars as $key => $val) { + $xml_info->extra_vars->{$key}->value = $extra_vars->{$key}; + } + } + + return $xml_info; + } + + /** + * @brief component의 xml정보를 읽음 + **/ + function getComponentXmlInfo($component) { + $lang_type = Context::getLangType(); + + // 요청된 컴포넌트의 xml파일 위치를 구함 + $component_path = sprintf('%s/components/%s/', $this->module_path, $component); + + $xml_file = sprintf('%sinfo.xml', $component_path); + $cache_file = sprintf('./files/cache/editor/%s.%s.php', $component, $lang_type); + + // 캐시된 xml파일이 있으면 include 후 정보 return + if(file_exists($cache_file) && file_exists($xml_file) && filectime($cache_file) > filectime($xml_file)) { + include($cache_file); + return $xml_info; + } + + // 캐시된 파일이 없으면 파싱후 캐싱 후 return + $oParser = new XmlParser(); + $xml_doc = $oParser->loadXmlFile($xml_file); + + // 정보 정리 + $xml_info->component_name = $component; + $xml_info->version = $xml_doc->component->attrs->version; + $xml_info->title = $xml_doc->component->title->body; + $xml_info->author->name = $xml_doc->component->author->name->body; + $xml_info->author->email_address = $xml_doc->component->author->attrs->email_address; + $xml_info->author->link = $xml_doc->component->author->attrs->link; + $xml_info->author->date = $xml_doc->component->author->attrs->date; + $xml_info->description = str_replace('\n', "\n", $xml_doc->component->author->description->body); + + $buff = 'component_name = "%s";', $component); + $buff .= sprintf('$xml_info->version = "%s";', $xml_info->version); + $buff .= sprintf('$xml_info->title = "%s";', $xml_info->title); + $buff .= sprintf('$xml_info->author->name = "%s";', $xml_info->author->name); + $buff .= sprintf('$xml_info->author->email_address = "%s";', $xml_info->author->email_address); + $buff .= sprintf('$xml_info->author->link = "%s";', $xml_info->author->link); + $buff .= sprintf('$xml_info->author->date = "%s";', $xml_info->author->date); + $buff .= sprintf('$xml_info->description = "%s";', $xml_info->description); + + // 추가 변수 정리 (에디터 컴포넌트에서는 text형만 가능) + $extra_vars = $xml_doc->component->extra_vars->var; + if($extra_vars) { + if(!is_array($extra_vars)) $extra_vars = array($extra_vars); + foreach($extra_vars as $key => $val) { + unset($obj); + $key = $val->attrs->name; + $title = $val->title->body; + $description = $val->description->body; + $xml_info->extra_vars->{$key}->title = $title; + $xml_info->extra_vars->{$key}->description = $description; + + $buff .= sprintf('$xml_info->extra_vars->%s->%s = "%s";', $key, 'title', $title); + $buff .= sprintf('$xml_info->extra_vars->%s->%s = "%s";', $key, 'description', $description); + } + } + + $buff .= ' ?>'; + + FileHandler::writeFile($cache_file, $buff, "w"); + + return $xml_info; + } + } +?> diff --git a/modules/editor/editor.view.php b/modules/editor/editor.view.php new file mode 100644 index 000000000..e2c7807c8 --- /dev/null +++ b/modules/editor/editor.view.php @@ -0,0 +1,64 @@ +module_path."tpl/css/editor.css"); + + // 변수 정리 + $upload_target_srl = Context::get('upload_target_srl'); + $component = Context::get('component'); + + // component 객체를 받음 + $oEditorModel = &getModel('editor'); + $oComponent = &$oEditorModel->getComponentObject($component, $upload_target_srl); + if(!$oComponent->toBool()) { + Context::set('message', sprintf(Context::getLang('msg_component_is_not_founded'), $component)); + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('component_not_founded'); + } else { + + // 컴포넌트의 popup url을 출력하는 method실행후 결과를 받음 + $popup_content = $oComponent->getPopupContent(); + Context::set('popup_content', $popup_content); + + // 레이아웃을 popup_layout으로 설정 + $this->setLayoutFile('popup_layout'); + + // 템플릿 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('popup'); + } + } + + /** + * @brief 컴퍼넌트 정보 보기 + **/ + function dispEditorComponentInfo() { + $component_name = Context::get('component_name'); + + $oEditorModel = &getModel('editor'); + $component = $oEditorModel->getComponent($component_name); + Context::set('component', $component); + + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('view_component'); + $this->setLayoutFile("popup_layout"); + } + } +?> diff --git a/modules/editor/lang/en.lang.php b/modules/editor/lang/en.lang.php new file mode 100644 index 000000000..4535798d4 --- /dev/null +++ b/modules/editor/lang/en.lang.php @@ -0,0 +1,30 @@ + + * @brief WYSIWYG Editor module's basic language pack + **/ + + $lang->editor = "WYSIWYG Editor"; + $lang->component_name = "Component"; + $lang->component_version = "Version"; + $lang->component_author = "Developer"; + $lang->component_link = "Link"; + $lang->component_date = "Date"; + $lang->component_description = "Description"; + $lang->component_extra_vars = "Option Variable"; + $lang->component_grant = "Permission Setting"; + + $lang->about_component = "About component"; + $lang->about_component_grant = "Only selected groups are allowed to use. (Everyone can use it when mode is disabled)"; + + $lang->msg_component_is_not_founded = 'Unabled to find editor component %s'; + $lang->msg_component_is_inserted = 'Selected component is already inputted'; + $lang->msg_component_is_first_order = 'Selected component is located at the first position'; + $lang->msg_component_is_last_order = 'Selected component is located at the last position'; + $lang->msg_load_saved_doc = "There is an automatically saved article. Do you wish to recover it?\nThe auto-saved draft will be discarded after saving current article"; + $lang->msg_auto_saved = "Automatically Saved"; + + $lang->cmd_disable = "Inactive"; + $lang->cmd_enable = "Active"; +?> diff --git a/modules/editor/lang/es.lang.php b/modules/editor/lang/es.lang.php new file mode 100644 index 000000000..06db5344d --- /dev/null +++ b/modules/editor/lang/es.lang.php @@ -0,0 +1,30 @@ + + * @brief Paquete lingual de editor WYSIWYG + **/ + + $lang->editor = "Editor WYSIWYG"; + $lang->component_name = "Componente"; + $lang->component_version = "Versin"; + $lang->component_author = "Autor"; + $lang->component_link = "Enlace"; + $lang->component_date = "Fecha"; + $lang->component_description = "Descripcin"; + $lang->component_extra_vars = "Varibles Extras"; + $lang->component_grant = "Autoridad"; + + $lang->about_component = "Sobre Componente"; + $lang->about_component_grant = "Puede usar el funcion solo grupos selecinado"; + + $lang->msg_component_is_not_founded = 'No puede buscar componente editor %s'; + $lang->msg_component_is_inserted = 'Ya habia insertado el componente'; + $lang->msg_component_is_first_order = 'Componente selecinado esta ordenado en primero lugar'; + $lang->msg_component_is_last_order = 'Componente selecinado esta ordenado en ultimo lugar'; + $lang->msg_load_saved_doc = "Hay documento guardado automaticamente. Desea recuperarlo?\nDespues de guardar el documento temporal van a eliminado."; + $lang->msg_auto_saved = "Documento guardado automaticamente"; + + $lang->cmd_disable = "Activado"; + $lang->cmd_enable = "Desactivado"; +?> diff --git a/modules/editor/lang/jp.lang.php b/modules/editor/lang/jp.lang.php new file mode 100644 index 000000000..76c2f7b29 --- /dev/null +++ b/modules/editor/lang/jp.lang.php @@ -0,0 +1,30 @@ + 翻訳:RisaPapa + * @brief ウィジウィグエディター(editor)モジュールの基本言語パッケージ + **/ + + $lang->editor = "ウィジウィグエディター"; + $lang->component_name = "コンポネント"; + $lang->component_version = "バージョン"; + $lang->component_author = "作者"; + $lang->component_link = "リンク"; + $lang->component_date = "作成日"; + $lang->component_description = "説明"; + $lang->component_extra_vars = "設定変数"; + $lang->component_grant = "権限設定"; + + $lang->about_component = "コンポネント情報"; + $lang->about_component_grant = "選択されたグループでのみ使用できます(すべて解除時はすべて使用可能)。"; + + $lang->msg_component_is_not_founded = '%s エディターのコンポネントが見つかりません。'; + $lang->msg_component_is_inserted = '選択されたコンポネントは既に入力されています。'; + $lang->msg_component_is_first_order = '選択されたコンポネントは最初に位置しています。'; + $lang->msg_component_is_last_order = '選択されたコンポネントは最後に位置しています。'; + $lang->msg_load_saved_doc = "自動保存された書き込みがあります。復旧しますか?\n書き終わってから保存すると自動保存データは削除されます。"; + $lang->msg_auto_saved = "自動保存されました。"; + + $lang->cmd_disable = "未使用"; + $lang->cmd_enable = "使用"; +?> diff --git a/modules/editor/lang/ko.lang.php b/modules/editor/lang/ko.lang.php new file mode 100644 index 000000000..d8dc7bf10 --- /dev/null +++ b/modules/editor/lang/ko.lang.php @@ -0,0 +1,30 @@ + + * @brief 위지윅에디터(editor) 모듈의 기본 언어팩 + **/ + + $lang->editor = "위지윅 에디터"; + $lang->component_name = "컴포넌트"; + $lang->component_version = "버전"; + $lang->component_author = "제작자 "; + $lang->component_link = "링크"; + $lang->component_date = "제작일"; + $lang->component_description = "설명"; + $lang->component_extra_vars = "설정 변수"; + $lang->component_grant = "권한설정"; + + $lang->about_component = "컴포넌트 소개"; + $lang->about_component_grant = "선택된 그룹만 사용 가능합니다. (모드 해제시 모두 사용 가능)"; + + $lang->msg_component_is_not_founded = '%s 에디터 컴포넌트를 찾을 수 없습니다'; + $lang->msg_component_is_inserted = '선택하신 컴포넌트는 이미 입력되어 있습니다'; + $lang->msg_component_is_first_order = '선택하신 컴포넌트는 첫번째에 위치하고 있습니다'; + $lang->msg_component_is_last_order = '선택하신 컴포넌트는 마지막에 위치하고 있습니다'; + $lang->msg_load_saved_doc = "자동저장된 글이 있습니다. 복구하시겠습니까?\n글을 다 쓰신 후 저장하시면 자동저장본은 사라집니다"; + $lang->msg_auto_saved = "자동 저장되었습니다"; + + $lang->cmd_disable = "비활성"; + $lang->cmd_enable = "활성"; +?> diff --git a/modules/editor/lang/zh-CN.lang.php b/modules/editor/lang/zh-CN.lang.php new file mode 100644 index 000000000..adf188945 --- /dev/null +++ b/modules/editor/lang/zh-CN.lang.php @@ -0,0 +1,30 @@ + + * @brief 网页编辑器(editor) 模块语言包 + **/ + + $lang->editor = "网页编辑器"; + $lang->component_name = "组件"; + $lang->component_version = "版本"; + $lang->component_author = "作者"; + $lang->component_link = "链接"; + $lang->component_date = "编写日期"; + $lang->component_description = "说明"; + $lang->component_extra_vars = "变数设置"; + $lang->component_grant = "权限设置"; + + $lang->about_component = "组件简介"; + $lang->about_component_grant = "指定的用户群才可以使用。 (解除时所有用户群都可以使用)"; + + $lang->msg_component_is_not_founded = '找不到%s 组件说明!'; + $lang->msg_component_is_inserted = '您选择的组件已插入!'; + $lang->msg_component_is_first_order = '您选择的组件已到最上端位置!'; + $lang->msg_component_is_last_order = '您选择的组件已到最下端位置!'; + $lang->msg_load_saved_doc = "有自动保存的内容, 确定要恢复吗?\n保存内容后,自动保存的文本将会被删除。"; + $lang->msg_auto_saved = "已自动保存!"; + + $lang->cmd_disable = "非激活"; + $lang->cmd_enable = "激活"; +?> diff --git a/modules/editor/queries/deleteSavedDoc.xml b/modules/editor/queries/deleteSavedDoc.xml new file mode 100644 index 000000000..0f1dae294 --- /dev/null +++ b/modules/editor/queries/deleteSavedDoc.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/modules/editor/queries/getComponent.xml b/modules/editor/queries/getComponent.xml new file mode 100644 index 000000000..0f7f5be5e --- /dev/null +++ b/modules/editor/queries/getComponent.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/editor/queries/getComponentList.xml b/modules/editor/queries/getComponentList.xml new file mode 100644 index 000000000..11d3adc06 --- /dev/null +++ b/modules/editor/queries/getComponentList.xml @@ -0,0 +1,14 @@ + + +
+ + + + + + + + + + + diff --git a/modules/editor/queries/getSavedDocument.xml b/modules/editor/queries/getSavedDocument.xml new file mode 100644 index 000000000..e2f53e4f3 --- /dev/null +++ b/modules/editor/queries/getSavedDocument.xml @@ -0,0 +1,10 @@ + + +
+ + + + + + + diff --git a/modules/editor/queries/insertComponent.xml b/modules/editor/queries/insertComponent.xml new file mode 100644 index 000000000..43c0baa31 --- /dev/null +++ b/modules/editor/queries/insertComponent.xml @@ -0,0 +1,10 @@ + + +
+ + + + + + + diff --git a/modules/editor/queries/insertSavedDoc.xml b/modules/editor/queries/insertSavedDoc.xml new file mode 100644 index 000000000..63d6b54b3 --- /dev/null +++ b/modules/editor/queries/insertSavedDoc.xml @@ -0,0 +1,13 @@ + + +
+ + + + + + + + + + diff --git a/modules/editor/queries/isComponentInserted.xml b/modules/editor/queries/isComponentInserted.xml new file mode 100644 index 000000000..938460ebf --- /dev/null +++ b/modules/editor/queries/isComponentInserted.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/editor/queries/updateComponent.xml b/modules/editor/queries/updateComponent.xml new file mode 100644 index 000000000..732f7fd7a --- /dev/null +++ b/modules/editor/queries/updateComponent.xml @@ -0,0 +1,13 @@ + + +
+ + + + + + + + + + diff --git a/modules/editor/schemas/editor_autosave.xml b/modules/editor/schemas/editor_autosave.xml new file mode 100644 index 000000000..3327cf9f5 --- /dev/null +++ b/modules/editor/schemas/editor_autosave.xml @@ -0,0 +1,8 @@ +
+ + + + + + +
diff --git a/modules/editor/schemas/editor_components.xml b/modules/editor/schemas/editor_components.xml new file mode 100644 index 000000000..f10c288ee --- /dev/null +++ b/modules/editor/schemas/editor_components.xml @@ -0,0 +1,6 @@ + + + + + +
diff --git a/modules/editor/tpl/admin_index.html b/modules/editor/tpl/admin_index.html new file mode 100644 index 000000000..fe78076c7 --- /dev/null +++ b/modules/editor/tpl/admin_index.html @@ -0,0 +1,52 @@ + + +

{$lang->editor} {$lang->cmd_management}

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->component_name}{$lang->component_version}{$lang->component_author}{$lang->component_link}{$lang->component_date}{$lang->cmd_setup}{$lang->use}{$lang->cmd_move}
{$xml_info->title}
({$component_name})
{$xml_info->version}{$xml_info->author->name}{$xml_info->author->link}{$xml_info->author->date} + + {$lang->cmd_setup} + +   + + + + {$lang->cmd_enable} + + {$lang->cmd_disable} + + + {$lang->cmd_move_up} + {$lang->cmd_move_down} +
+ {nl2br($xml_info->description)} +
diff --git a/modules/editor/tpl/component_not_founded.html b/modules/editor/tpl/component_not_founded.html new file mode 100644 index 000000000..87b25dd0f --- /dev/null +++ b/modules/editor/tpl/component_not_founded.html @@ -0,0 +1,4 @@ + diff --git a/modules/editor/tpl/css/editor.css b/modules/editor/tpl/css/editor.css new file mode 100644 index 000000000..f25c0d957 --- /dev/null +++ b/modules/editor/tpl/css/editor.css @@ -0,0 +1,50 @@ +@charset "utf-8"; + +.xeEditor { } +.xeEditor .optionABC { clear:both; width:100%; border-bottom:1px solid #c2c2c2; overflow:hidden; background:#ffffff url(../images/bgBoardEditorOption.gif) no-repeat -3px bottom;} +.xeEditor .optionABC .selectGroup { white-space:nowrap; display:block; height:21px; margin:0 .5em 0 0; padding-left:1em; float:left;} +.xeEditor .optionABC .buttonGroup { white-space:nowrap; position:relative; display:block; margin:0 .5em 0 0; float:left; height:21px; overflow:hidden; padding-left:2px;} +.xeEditor .optionABC .buttonGroup img { float:left; display:block; margin-left:-1px; cursor:pointer;} +.xeEditor .optionA, +.xeEditor .optionB, +.xeEditor .optionC { float:left; background:#ffffff url(../images/bgBoardEditorOption.gif) no-repeat left bottom; padding:.5em 0 .5em .7em; overflow:hidden;} +.xeEditor .optionA *, +.xeEditor .optionB *, +.xeEditor .optionC * { vertical-align:middle;} +.xeEditor .optionA { background-position:-3px bottom; padding-left:0;} +.xeEditor .optionA select option { font-size:.9em; } +.xeEditor .optionDE { width:100%; clear:both; overflow:hidden; background:#f8f8f8; border-bottom:1px solid #e1e1e1; height:29px;} +.xeEditor .optionDE .buttonGroup { white-space:nowrap; position:relative; display:block; float:left; height:21px; overflow:hidden; padding-left:2px;} +.xeEditor .optionDE img { float:left; display:block; margin-right:.5em; cursor:pointer;} +.xeEditor .optionD { padding:.5em 0 .5em .8em; overflow:hidden; float:left; border-right:1px solid #e0e0e0;} +.xeEditor .optionE { padding:4px 0 0 8px; overflow:hidden; border-left:1px solid #ffffff; float:left;} + +.xeEditor .editorInfo { background:#fbfbfb; padding:.5em; border:1px solid #e1e1dd; color:#999999; position:relative; margin:5px 20px 0 20px;} +.xeEditor .close { cursor:pointer; position:absolute; top:3px; right:3px; _top:3px; _right:25px;} +.xeEditor .editor_iframe_box { background:#ffffff; clear:both; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:.5em; margin:0 20px 0 20px; } + +.xeEditor .textAreaDragIndicator { text-align:center; background:url(../images/lineTextAreaDrag.gif) repeat-x left center; padding:5px 0 5px 0; } +.xeEditor .textAreaDragIndicatorBar { background:url(../images/buttonTextAreaDrag.gif) no-repeat center; cursor:move;height:14px;} + +.xeEditor .editor_info { clear:both; padding:5px 20px 5px 20px; overflow:hidden;} +.xeEditor .editor_info .editor_option { float:left; color:#888888; } +.xeEditor .editor_info .editor_autosaved_message { color:#888888; float:right; } + +.xeEditor .inputTypeTextArea { background:#fbfbfb; padding:1em; width:94%;} +.xeEditor #textAreaDrag {} +.xeEditor .fileAttach { padding:0 1em .5em 1em;} +.xeEditor .fileAttach .preview { padding:5px; width:110px; height:110px; border:1px solid #e1e1dd; background:#fbfbfb; float:left; margin-right:.5em;} +.xeEditor .fileAttach .preview img { width:110px; height:110px; float:left; display:block;} +.xeEditor .fileAttach .fileListArea { float:left; width:50%; margin-right:.7em; padding-bottom:.5em; margin-bottom:1em} +.xeEditor .fileAttach .fileListArea .fileList { overflow:auto; width:100%; height:auto; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; margin-bottom:.3em; font-size:11px;} +.xeEditor .fileAttach .fileListArea .fileList option { line-height:100%; padding-left:.5em;} +.xeEditor .fileAttach .fileListArea span.file_attach_info { color:#3f4040; font-size:11px; text-align:left;} +.xeEditor .fileAttach .fileListArea span.file_attach_info strong { color:#ff6600; font-size:11px; font-weight:bold; } +.xeEditor .fileAttach .fileUploadControl { margin-bottom:5px; } + +.xeEditor .fileAttach .fileUploadControl .uploaderButton { display:block; cursor:pointer; background:url(../images/buttonTypeBCenter.gif) repeat-x left center; line-height:100%; overflow:visible; color:#3f4040; margin:0 1px; font-size:.9em; white-space:nowrap;} +.xeEditor .fileAttach .fileUploadControl .uploaderButton:hover { text-decoration:none;} +.xeEditor .fileAttach .fileUploadControl .uploaderButton img { vertical-align:middle;} +.xeEditor .fileAttach .fileUploadControl .uploaderButton .leftCap { width:2px; height:21px; background:url(../images/buttonTypeBLeft.gif) no-repeat; margin:0 .3em 0 0; position:relative; left:-1px;} +.xeEditor .fileAttach .fileUploadControl .uploaderButton .rightCap { width:2px; height:21px; background:url(../images/buttonTypeBRight.gif) no-repeat; margin:0 -1px 0 .4em;} +.xeEditor .fileAttach .fileUploadControl .uploaderButton .icon { margin:0 .2em;} diff --git a/modules/editor/tpl/editor.html b/modules/editor/tpl/editor.html new file mode 100644 index 000000000..0251f9aa0 --- /dev/null +++ b/modules/editor/tpl/editor.html @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + +
+ + diff --git a/modules/editor/tpl/filter/setup_component.xml b/modules/editor/tpl/filter/setup_component.xml new file mode 100644 index 000000000..c5408d9f7 --- /dev/null +++ b/modules/editor/tpl/filter/setup_component.xml @@ -0,0 +1,8 @@ + +
+ + + + + + diff --git a/modules/editor/tpl/images/SWFUpload.swf b/modules/editor/tpl/images/SWFUpload.swf new file mode 100644 index 000000000..c423737a5 Binary files /dev/null and b/modules/editor/tpl/images/SWFUpload.swf differ diff --git a/modules/editor/tpl/images/bgBoardEditorOption.gif b/modules/editor/tpl/images/bgBoardEditorOption.gif new file mode 100644 index 000000000..559588af6 Binary files /dev/null and b/modules/editor/tpl/images/bgBoardEditorOption.gif differ diff --git a/modules/editor/tpl/images/blank.gif b/modules/editor/tpl/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/modules/editor/tpl/images/blank.gif differ diff --git a/modules/editor/tpl/images/buttonClose.gif b/modules/editor/tpl/images/buttonClose.gif new file mode 100644 index 000000000..12cd8aaa9 Binary files /dev/null and b/modules/editor/tpl/images/buttonClose.gif differ diff --git a/modules/editor/tpl/images/buttonTextAreaDrag.gif b/modules/editor/tpl/images/buttonTextAreaDrag.gif new file mode 100644 index 000000000..148e9ee10 Binary files /dev/null and b/modules/editor/tpl/images/buttonTextAreaDrag.gif differ diff --git a/modules/editor/tpl/images/buttonTypeBCenter.gif b/modules/editor/tpl/images/buttonTypeBCenter.gif new file mode 100644 index 000000000..8998cbae2 Binary files /dev/null and b/modules/editor/tpl/images/buttonTypeBCenter.gif differ diff --git a/modules/editor/tpl/images/buttonTypeBLeft.gif b/modules/editor/tpl/images/buttonTypeBLeft.gif new file mode 100644 index 000000000..378be04ed Binary files /dev/null and b/modules/editor/tpl/images/buttonTypeBLeft.gif differ diff --git a/modules/editor/tpl/images/buttonTypeBRight.gif b/modules/editor/tpl/images/buttonTypeBRight.gif new file mode 100644 index 000000000..4a85fd289 Binary files /dev/null and b/modules/editor/tpl/images/buttonTypeBRight.gif differ diff --git a/modules/editor/tpl/images/editor_btn_ac.gif b/modules/editor/tpl/images/editor_btn_ac.gif new file mode 100644 index 000000000..e19fbbe86 Binary files /dev/null and b/modules/editor/tpl/images/editor_btn_ac.gif differ diff --git a/modules/editor/tpl/images/editor_btn_aj.gif b/modules/editor/tpl/images/editor_btn_aj.gif new file mode 100644 index 000000000..a4cc61176 Binary files /dev/null and b/modules/editor/tpl/images/editor_btn_aj.gif differ diff --git a/modules/editor/tpl/images/editor_btn_al.gif b/modules/editor/tpl/images/editor_btn_al.gif new file mode 100644 index 000000000..efb06184e Binary files /dev/null and b/modules/editor/tpl/images/editor_btn_al.gif differ diff --git a/modules/editor/tpl/images/editor_btn_ar.gif b/modules/editor/tpl/images/editor_btn_ar.gif new file mode 100644 index 000000000..ea27284f6 Binary files /dev/null and b/modules/editor/tpl/images/editor_btn_ar.gif differ diff --git a/modules/editor/tpl/images/editor_btn_b.gif b/modules/editor/tpl/images/editor_btn_b.gif new file mode 100644 index 000000000..ea3ec1e6d Binary files /dev/null and b/modules/editor/tpl/images/editor_btn_b.gif differ diff --git a/modules/editor/tpl/images/editor_btn_bg.gif b/modules/editor/tpl/images/editor_btn_bg.gif new file mode 100644 index 000000000..37ca8c1c8 Binary files /dev/null and b/modules/editor/tpl/images/editor_btn_bg.gif differ diff --git a/modules/editor/tpl/images/editor_btn_c.gif b/modules/editor/tpl/images/editor_btn_c.gif new file mode 100644 index 000000000..010a75aa7 Binary files /dev/null and b/modules/editor/tpl/images/editor_btn_c.gif differ diff --git a/modules/editor/tpl/images/editor_btn_i.gif b/modules/editor/tpl/images/editor_btn_i.gif new file mode 100644 index 000000000..98ca8e271 Binary files /dev/null and b/modules/editor/tpl/images/editor_btn_i.gif differ diff --git a/modules/editor/tpl/images/editor_btn_id.gif b/modules/editor/tpl/images/editor_btn_id.gif new file mode 100644 index 000000000..efbe8ed2e Binary files /dev/null and b/modules/editor/tpl/images/editor_btn_id.gif differ diff --git a/modules/editor/tpl/images/editor_btn_lh.gif b/modules/editor/tpl/images/editor_btn_lh.gif new file mode 100644 index 000000000..b07bb8370 Binary files /dev/null and b/modules/editor/tpl/images/editor_btn_lh.gif differ diff --git a/modules/editor/tpl/images/editor_btn_od.gif b/modules/editor/tpl/images/editor_btn_od.gif new file mode 100644 index 000000000..3222a806d Binary files /dev/null and b/modules/editor/tpl/images/editor_btn_od.gif differ diff --git a/modules/editor/tpl/images/editor_btn_ol.gif b/modules/editor/tpl/images/editor_btn_ol.gif new file mode 100644 index 000000000..205fb9fb7 Binary files /dev/null and b/modules/editor/tpl/images/editor_btn_ol.gif differ diff --git a/modules/editor/tpl/images/editor_btn_tag.gif b/modules/editor/tpl/images/editor_btn_tag.gif new file mode 100644 index 000000000..df52b8ca9 Binary files /dev/null and b/modules/editor/tpl/images/editor_btn_tag.gif differ diff --git a/modules/editor/tpl/images/editor_btn_u.gif b/modules/editor/tpl/images/editor_btn_u.gif new file mode 100644 index 000000000..f506d767e Binary files /dev/null and b/modules/editor/tpl/images/editor_btn_u.gif differ diff --git a/modules/editor/tpl/images/editor_btn_ul.gif b/modules/editor/tpl/images/editor_btn_ul.gif new file mode 100644 index 000000000..bad97cf24 Binary files /dev/null and b/modules/editor/tpl/images/editor_btn_ul.gif differ diff --git a/modules/editor/tpl/images/lineTextAreaDrag.gif b/modules/editor/tpl/images/lineTextAreaDrag.gif new file mode 100644 index 000000000..3df035047 Binary files /dev/null and b/modules/editor/tpl/images/lineTextAreaDrag.gif differ diff --git a/modules/editor/tpl/js/editor.js b/modules/editor/tpl/js/editor.js new file mode 100755 index 000000000..fde8e8b2d --- /dev/null +++ b/modules/editor/tpl/js/editor.js @@ -0,0 +1,711 @@ +/** + * @author zero (zero@nzeo.com) + * @version 0.1 + * @brief 에디터 관련 스크립트 + **/ + +// iframe의 id prefix +var iframe_id = 'editor_iframe_'; + +// upload_target_srl에 대한 form문을 객체로 보관함 +var editor_form_list = new Array(); + +// 편집 상태에 대한 체크 +var editor_mode = new Array(); + +// upload_target_srl값에 해당하는 iframe의 object를 return +function editorGetIFrame(upload_target_srl) { + var obj_id = iframe_id+upload_target_srl; + return xGetElementById(obj_id); +} + +// editor 초기화를 onload이벤트 후에 시작시킴 +function editorInit(upload_target_srl, resizable, height) { + xAddEventListener(window, 'load', function() { editorStart(upload_target_srl, resizable, height); }); +} + +// editor 시작 (upload_target_srl로 iframe객체를 얻어서 쓰기 모드로 전환) +function editorStart(upload_target_srl, resizable, height) { + if(typeof(height)=="undefined"||!height) height = 350; + if(typeof(resizable)=="undefined"||!resizable) resizable = false; + else resizable = true; + + // iframe_area를 찾음 + var iframe_area = xGetElementById("editor_iframe_area_"+upload_target_srl); + //xHeight(iframe_area, height+10); + xInnerHtml(iframe_area, ''); + + // iframe obj를 찾음 + var iframe_obj = editorGetIFrame(upload_target_srl); + if(!iframe_obj) return; + + // 현 에디터를 감싸고 있는 form문을 찾아서 content object를 찾아서 내용 sync + var fo_obj = iframe_obj.parentNode; + while(fo_obj.nodeName != 'FORM') { fo_obj = fo_obj.parentNode; } + // saved document에 대한 체크 + if(typeof(fo_obj._saved_doc_title)!="undefined" ) { + var saved_title = fo_obj._saved_doc_title.value; + var saved_content = fo_obj._saved_doc_content.value; + if(saved_title || saved_content) { + if(confirm(fo_obj._saved_doc_message.value)) { + fo_obj.title.value = saved_title; + fo_obj.content.value = saved_content; + } else { + editorRemoveSavedDoc(); + } + } + } + + // 구해진 form 객체를 저장 + editor_form_list[upload_target_srl] = fo_obj; + + // 대상 form의 content object에서 데이터를 구함 + var content = fo_obj.content.value; + + // iframe내의 document object + var contentDocument = iframe_obj.contentWindow.document; + + // editing가능하도록 설정 시작 + + // 기본 내용 작성 + var contentHtml = ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + content+ + ''+ + ''; + contentDocument.designMode = 'on'; + try { + contentDocument.execCommand("undo", false, null); + } catch (e) { + } + contentDocument.open("text/html","replace"); + contentDocument.write(contentHtml); + contentDocument.close(); + + // 작성시 필요한 이벤트 체크 + if(xIE4Up) xAddEventListener(contentDocument, 'keydown',editorKeyPress); + else xAddEventListener(contentDocument, 'keypress',editorKeyPress); + xAddEventListener(contentDocument,'mousedown',editorHideObject); + + // 위젯 감시를 위한 더블클릭 이벤트 걸기 (오페라에 대한 처리는 차후에.. 뭔가 이상함) + xAddEventListener(contentDocument,'dblclick',editorSearchComponent); + xAddEventListener(document,'dblclick',editorSearchComponent); + + xAddEventListener(document,'mouseup',editorEventCheck); + xAddEventListener(document,'mousedown',editorHideObject); + + if(xIE4Up && xGetElementById('for_ie_help_'+upload_target_srl)) { + xGetElementById('for_ie_help_'+upload_target_srl).style.display = "block"; + } + + // 에디터의 내용을 지속적으로 fo_obj.content.value에 입력 + editorSyncContent(fo_obj.content, upload_target_srl); + + if(typeof(fo_obj._saved_doc_title)!="undefined" ) editorEnableAutoSave(fo_obj, upload_target_srl); + + // 크기 변경 불가일 경우 드래그바 숨김 + if(resizable == false) xGetElementById("editor_drag_bar_"+upload_target_srl).style.display = "none"; + + if(typeof(fixAdminLayoutFooter)=='function') fixAdminLayoutFooter(height); +} + +// 여러개의 편집기를 예상하여 전역 배열 변수에 form, iframe의 정보를 넣음 +var _editorSyncList = new Array(); +function editorSyncContent(obj, upload_target_srl) { + _editorSyncList[_editorSyncList.length] = {field:obj, upload_target_srl:upload_target_srl} +} + +// 편집기와 폼의 정보를 주기적으로 동기화 시킴 +function _editorSync() { + for(var i=0;i<_editorSyncList.length;i++) { + var field = _editorSyncList[i].field; + var upload_target_srl = _editorSyncList[i].upload_target_srl; + var content = editorGetContent(upload_target_srl); + if(typeof(content)=='undefined'||!content) continue; + field.value = content; + } + setTimeout(_editorSync, 1000); +} +xAddEventListener(window, 'load', _editorSync); + +// 자동 저장 기능 +var _autoSaveObj = {fo_obj:null, upload_target_srl:0, title:'', content:''} +function editorEnableAutoSave(fo_obj, upload_target_srl) { + var title = fo_obj.title.value; + var content = fo_obj.content.value; + _autoSaveObj = {"fo_obj":fo_obj, "upload_target_srl":upload_target_srl, "title":title, "content":content}; + setTimeout(_editorAutoSave, 5000); +} + +function _editorAutoSave() { + var fo_obj = _autoSaveObj.fo_obj; + var upload_target_srl = _autoSaveObj.upload_target_srl; + + if(fo_obj && upload_target_srl) { + var title = fo_obj.title.value; + var content = editorGetContent(upload_target_srl); + if((fo_obj.title && title.trim() != _autoSaveObj.title.trim()) || content.trim() != _autoSaveObj.content.trim()) { + var params = new Array(); + params["document_srl"] = upload_target_srl; + params["title"] = title; + params["content"] = content; + + _autoSaveObj.title = title; + _autoSaveObj.content = content; + + var obj = xGetElementById("editor_autosaved_message_"+upload_target_srl); + var oDate = new Date(); + html = oDate.getHours()+':'+oDate.getMinutes()+' '+auto_saved_msg; + xInnerHtml(obj, html); + obj.style.display = "block"; + + show_waiting_message = false; + exec_xml("editor","procEditorSaveDoc", params, _editorAutoSaved); + show_waiting_message = true; + return; + } + } + + setTimeout(_editorAutoSave, 15000); +} + +function _editorAutoSaved(ret_obj) { + setTimeout(_editorAutoSave, 15000); + return null; +} + +function editorRemoveSavedDoc() { + exec_xml("editor","procEditorRemoveSavedDoc"); +} + +// 에디터의 전체 내용 return +function editorGetContent(upload_target_srl) { + var iframe_obj = editorGetIFrame(upload_target_srl); + if(!iframe_obj) return null; + + var html = null; + if(editor_mode[upload_target_srl]=='html') { + var contentDocument = iframe_obj.contentWindow.document; + var html = contentDocument.body.innerHTML; + html = html.replace(/&/ig, '&').replace(/</ig,'<').replace(/>/ig,'>'); + } else { + html = xInnerHtml(iframe_obj.contentWindow.document.body); + } + if(html) html = html.replace(/^
$/i,''); + return html; +} + +// 에디터 내의 선택된 부분의 html 코드를 return +function editorGetSelectedHtml(upload_target_srl) { + var iframe_obj = editorGetIFrame(upload_target_srl); + if(xIE4Up) { + var range = iframe_obj.contentWindow.document.selection.createRange(); + var html = range.htmlText; + //range.select(); + return html; + } else { + var range = iframe_obj.contentWindow.getSelection().getRangeAt(0); + var dummy = xCreateElement('div'); + dummy.appendChild(range.cloneContents()); + var html = xInnerHtml(dummy); + return html; + } +} + +// 에디터 내의 선택된 부분의 NODE를 return +function editorGetSelectedNode(upload_target_srl) { + var iframe_obj = editorGetIFrame(upload_target_srl); + if(xIE4Up) { + var range = iframe_obj.contentWindow.document.selection.createRange(); + var div = xCreateElement('div'); + xInnerHtml(div, range.htmlText); + var node = div.firstChild; + return node; + } else { + var range = iframe_obj.contentWindow.getSelection().getRangeAt(0); + var node = xCreateElement('div'); + node.appendChild(range.cloneContents()); + return node.firstChild; + } +} + +// 에디터 내의 선택된 부분의 html코드를 변경 +function editorReplaceHTML(iframe_obj, html) { + iframe_obj.contentWindow.focus(); + if(xIE4Up) { + var range = iframe_obj.contentWindow.document.selection.createRange(); + if(range.pasteHTML) { + range.pasteHTML(html); + } else if(editorPrevNode) { + editorPrevNode.outerHTML = html; + } + } else { + if(iframe_obj.contentWindow.getSelection().focusNode.tagName == "HTML") { + var range = iframe_obj.contentDocument.createRange(); + range.setStart(iframe_obj.contentDocument.body,0); + range.setEnd(iframe_obj.contentDocument.body,0); + range.insertNode(range.createContextualFragment(html)); + } else { + var range = iframe_obj.contentWindow.getSelection().getRangeAt(0); + range.deleteContents(); + range.insertNode(range.createContextualFragment(html)); + } + } +} + +// 에디터에 포커스를 줌 +function editorFocus(upload_target_srl) { + var iframe_obj = editorGetIFrame(upload_target_srl); + iframe_obj.contentWindow.focus(); +} + +// 입력 키에 대한 이벤트 체크 +function editorKeyPress(evt) { + var e = new xEvent(evt); + + var obj = e.target; + var body_obj = null; + if(obj.nodeName == "BODY") body_obj = obj; + else body_obj = obj.firstChild.nextSibling; + if(!body_obj) return; + + var upload_target_srl = body_obj.getAttribute("upload_target_srl"); + if(!upload_target_srl) return; + + // IE에서 enter키를 눌렀을때 P 태그 대신 BR 태그 입력 + if (xIE4Up && !e.ctrlKey && !e.shiftKey && e.keyCode == 13 && editor_mode[upload_target_srl]!='html') { + var iframe_obj = editorGetIFrame(upload_target_srl); + if(!iframe_obj) return; + var contentDocument = iframe_obj.contentWindow.document; + + var obj = contentDocument.selection.createRange(); + obj.pasteHTML('
'); + obj.select(); + evt.cancelBubble = true; + evt.returnValue = false; + return; + } + + // ctrl-S, alt-S 클릭시 submit하기 + if( e.keyCode == 115 && (e.altKey || e.ctrlKey) ) { + var iframe_obj = editorGetIFrame(upload_target_srl); + if(!iframe_obj) return; + var contentDocument = iframe_obj.contentWindow.document; + + var fo_obj = iframe_obj.parentNode; + while(fo_obj.nodeName != 'FORM') { fo_obj = fo_obj.parentNode; } + if(fo_obj.onsubmit) fo_obj.onsubmit(); + + evt.cancelBubble = true; + evt.returnValue = false; + xPreventDefault(evt); + xStopPropagation(evt); + return; + } + + // ctrl-b, i, u, s 키에 대한 처리 (파이어폭스에서도 에디터 상태에서 단축키 쓰도록) + if (e.ctrlKey) { + var iframe_obj = editorGetIFrame(upload_target_srl); + if(!iframe_obj) return; + var contentDocument = iframe_obj.contentWindow.document; + + // html 에디터 모드일 경우 이벤트 취소 시킴 + if(editor_mode[upload_target_srl]=='html') { + evt.cancelBubble = true; + evt.returnValue = false; + xPreventDefault(evt); + xStopPropagation(evt); + return; + } + + switch(e.keyCode) { + // ctrl+1~6 + case 49 : + case 50 : + case 51 : + case 52 : + case 53 : + case 54 : + editorDo('formatblock',"",e.target); + xPreventDefault(evt); + xStopPropagation(evt); + break; + // ctrl+7 + case 55 : + editorDo('formatblock',"

",e.target); + xPreventDefault(evt); + xStopPropagation(evt); + break; + // ie에서 ctrlKey + enter일 경우 P 태그 입력 + case 13 : + if(xIE4Up) { + if(e.target.parentElement.document.designMode!="On") return; + var obj = e.target.parentElement.document.selection.createRange(); + obj.pasteHTML('

'); + obj.select(); + evt.cancelBubble = true; + evt.returnValue = false; + return; + } + // bold + case 98 : + editorDo('Bold',null,e.target); + xPreventDefault(evt); + xStopPropagation(evt); + break; + // italic + case 105 : + editorDo('Italic',null,e.target); + xPreventDefault(evt); + xStopPropagation(evt); + break; + // underline + case 117 : + editorDo('Underline',null,e.target); + xPreventDefault(evt); + xStopPropagation(evt); + break; + // strike + /* + case 83 : + case 115 : + editorDo('StrikeThrough',null,e.target); + xPreventDefault(evt); + xStopPropagation(evt); + break; + */ + } + } +} + +// 에디터 상단의 버튼 클릭시 action 처리 (마우스다운 이벤트 발생시마다 요청이 됨) +var editorPrevObj = null; +var editorPrevSrl = null; +function editorEventCheck(evt) { + editorPrevNode = null; + + // 이벤트가 발생한 object의 ID를 구함 + var e = new xEvent(evt); + var target_id = e.target.id; + if(!target_id) return; + + // upload_target_srl와 component name을 구함 (id가 포맷과 다르면 return) + var info = target_id.split('_'); + if(info[0]!="component") return; + var upload_target_srl = info[1]; + var component_name = target_id.replace(/^component_([0-9]+)_/,''); + if(!upload_target_srl || !component_name) return; + + if(editor_mode[upload_target_srl]=='html') return; + + switch(component_name) { + + // 기본 기능에 대한 동작 (바로 실행) + case 'Bold' : + case 'Italic' : + case 'Underline' : + case 'StrikeThrough' : + case 'undo' : + case 'redo' : + case 'justifyleft' : + case 'justifycenter' : + case 'justifyright' : + case 'indent' : + case 'outdent' : + case 'insertorderedlist' : + case 'insertunorderedlist' : + editorDo(component_name, '', upload_target_srl); + break; + + // 추가 컴포넌트의 경우 서버에 요청을 시도 + default : + openComponent(component_name, upload_target_srl); + break; + } + + return; +} + +// 컴포넌트 팝업 열기 +function openComponent(component_name, upload_target_srl, manual_url) { + editorPrevSrl = upload_target_srl; + if(editor_mode[upload_target_srl]=='html') return; + + var popup_url = request_uri+"?module=editor&act=dispEditorPopup&upload_target_srl="+upload_target_srl+"&component="+component_name; + if(typeof(manual_url)!="undefined" && manual_url) popup_url += "&manual_url="+escape(manual_url); + + popopen(popup_url, 'editorComponent'); +} + +// 더블클릭 이벤트 발생시에 본문내에 포함된 컴포넌트를 찾는 함수 +var editorPrevNode = null; +function editorSearchComponent(evt) { + var e = new xEvent(evt); + + editorPrevNode = null; + var obj = e.target; + + // 위젯인지 일단 체크 + if(obj.getAttribute("widget")) { + // upload_target_srl을 찾음 + var tobj = obj; + while(tobj && tobj.nodeName != "BODY") { + tobj = xParent(tobj); + } + if(!tobj || tobj.nodeName != "BODY" || !tobj.getAttribute("upload_target_srl")) { + editorPrevNode = null; + return; + } + var upload_target_srl = tobj.getAttribute("upload_target_srl"); + var widget = obj.getAttribute("widget"); + editorPrevNode = obj; + + if(editor_mode[upload_target_srl]=='html') return; + popopen(request_uri+"?module=widget&act=dispWidgetGenerateCodeInPage&selected_widget="+widget+"&module_srl="+upload_target_srl,'GenerateCodeInPage'); + return; + } + + // 선택되어진 object부터 상단으로 이동하면서 editor_component attribute가 있는지 검사 + if(!obj.getAttribute("editor_component")) { + while(obj && !obj.getAttribute("editor_component")) { + if(obj.parentElement) obj = obj.parentElement; + else obj = xParent(obj); + } + } + + if(!obj) obj = e.target; + + var editor_component = obj.getAttribute("editor_component"); + + // editor_component를 찾지 못했을 경우에 이미지/텍스트/링크의 경우 기본 컴포넌트와 연결 + if(!editor_component) { + // 이미지일 경우 + if(obj.nodeName == "IMG") { + editor_component = "image_link"; + editorPrevNode = obj; + + // 테이블의 td일 경우 + } else if(obj.nodeName == "TD") { + editor_component = "table_maker"; + editorPrevNode = obj; + + // 링크거나 텍스트인 경우 + } else if(obj.nodeName == "A" || obj.nodeName == "BODY" || obj.nodeName.indexOf("H")==0 || obj.nodeName == "LI" || obj.nodeName == "P") { + editor_component = "url_link"; + editorPrevNode = obj; + } + } else { + editorPrevNode = obj; + } + + // 아무런 editor_component가 없다면 return + if(!editor_component) { + editorPrevNode = null; + return; + } + + // upload_target_srl을 찾음 + var tobj = obj; + while(tobj && tobj.nodeName != "BODY") { + tobj = xParent(tobj); + } + if(!tobj || tobj.nodeName != "BODY" || !tobj.getAttribute("upload_target_srl")) { + editorPrevNode = null; + return; + } + var upload_target_srl = tobj.getAttribute("upload_target_srl"); + + // 해당 컴포넌트를 찾아서 실행 + openComponent(editor_component, upload_target_srl); +} + +// 마우스 클릭시 이전 object정보를 숨김 +function editorHideObject(evt) { + if(!editorPrevObj) return; + var e = new xEvent(evt); + var tobj = e.target; + while(tobj) { + if(tobj.id == editorPrevObj.id) { + return; + } + tobj = xParent(tobj); + } + editorPrevObj.style.visibility = 'hidden'; + editorPrevObj = null; + return; +} + +/** + * HTML 편집 기능 + **/ +function editorChangeMode(obj, upload_target_srl) { + var iframe_obj = editorGetIFrame(upload_target_srl); + if(!iframe_obj) return; + + var contentDocument = iframe_obj.contentWindow.document; + + // html 편집 사용시 + if(obj.checked) { + xGetElementById('xeEditorOption_'+upload_target_srl).style.display = "none"; + + var html = contentDocument.body.innerHTML; + html = html.replace(/&/ig, '&').replace(//ig,'>'); + contentDocument.body.innerHTML = html; + + editor_mode[upload_target_srl] = 'html'; + + // 위지윅 모드 사용시 + } else { + xGetElementById('xeEditorOption_'+upload_target_srl).style.display = "block"; + + var html = contentDocument.body.innerHTML; + html = html.replace(/&/ig, '&').replace(/</ig,'<').replace(/>/ig,'>'); + contentDocument.body.innerHTML = html; + + editor_mode[upload_target_srl] = null; + } +} + +/** + * 편집기능 실행 + */ + +// 편집 기능 실행 +function editorDo(command, value, target) { + + var doc = null; + + // target이 object인지 upload_target_srl인지에 따라 document를 구함 + if(typeof(target)=="object") { + if(xIE4Up) doc = target.parentElement.document; + else doc = target.parentNode; + } else { + var iframe_obj = editorGetIFrame(target); + doc = iframe_obj.contentWindow.document; + } + + var upload_target_srl = doc.body.getAttribute('upload_target_srl'); + if(editor_mode[upload_target_srl]=='html') return; + + // 포커스 + if(typeof(target)=="object") target.focus(); + else editorFocus(target); + + // 실행 + doc.execCommand(command, false, value); + + // 포커스 + if(typeof(target)=="object") target.focus(); + else editorFocus(target); +} + +// 폰트를 변경 +function editorChangeFontName(obj,srl) { + var value = obj.options[obj.selectedIndex].value; + if(!value) return; + editorDo('FontName',value,srl); + obj.selectedIndex = 0; +} + +function editorChangeFontSize(obj,srl) { + var value = obj.options[obj.selectedIndex].value; + if(!value) return; + editorDo('FontSize',value,srl); + obj.selectedIndex = 0; +} + +function editorChangeHeader(obj,srl) { + var value = obj.options[obj.selectedIndex].value; + if(!value) return; + value = "<"+value+">"; + editorDo('formatblock',value,srl); + obj.selectedIndex = 0; +} + +/** + * iframe 세로 크기 조절 드래그 관련 + **/ +var editorDragObj = {isDrag:false, y:0, obj:null, id:'', det:0, source_height:0} +xAddEventListener(document, 'mousedown', editorDragStart); +xAddEventListener(document, 'mouseup', editorDragStop); +function editorDragStart(evt) { + var e = new xEvent(evt); + var obj = e.target; + if(typeof(obj.id)=='undefined'||!obj.id) return; + + var id = obj.id; + if(id.indexOf('editor_drag_bar_')!=0) return; + + editorDragObj.isDrag = true; + editorDragObj.y = e.pageY; + editorDragObj.obj = e.target; + editorDragObj.id = id.substr('editor_drag_bar_'.length); + + var iframe_obj = editorGetIFrame(editorDragObj.id); + + editorDragObj.source_height = xHeight(iframe_obj); + + xAddEventListener(document, 'mousemove', editorDragMove, false); + xAddEventListener(editorDragObj.obj, 'mousemove', editorDragMove, false); +} + +function editorDragMove(evt) { + if(!editorDragObj.isDrag) return; + + var e = new xEvent(evt); + var h = e.pageY - editorDragObj.y; + + editorDragObj.isDrag = true; + editorDragObj.y = e.pageY; + editorDragObj.obj = e.target; + + var iframe_obj = editorGetIFrame(editorDragObj.id); + xHeight(iframe_obj, xHeight(iframe_obj)+h); + xHeight(iframe_obj.parentNode, xHeight(iframe_obj)+10); +} + +function editorDragStop(evt) { + if(!editorDragObj.isDrag) return; + + xRemoveEventListener(document, 'mousemove', editorDragMove, false); + xRemoveEventListener(editorDragObj.obj, 'mousemove', editorDragMove, false); + + var iframe_obj = editorGetIFrame(editorDragObj.id); + if(typeof(fixAdminLayoutFooter)=='function') fixAdminLayoutFooter(xHeight(iframe_obj)-editorDragObj.source_height); + + editorDragObj.isDrag = false; + editorDragObj.y = 0; + editorDragObj.obj = null; + editorDragObj.id = ''; +} + +// Editor Option Button +function eOptionOver(obj) { + obj.style.marginTop='-21px'; + obj.style.zIndex='99'; +} +function eOptionOut(obj) { + obj.style.marginTop='0'; + obj.style.zIndex='1'; +} +function eOptionClick(obj) { + obj.style.marginTop='-42px'; + obj.style.zIndex='99'; +} + +// Editor Info Close +function closeEditorInfo() { + xGetElementById('editorInfo').style.display='none'; + var expire = new Date(); + expire.setTime(expire.getTime()+ (7000 * 24 * 3600000)); + xSetCookie('EditorInfo', '1', expire); +} + diff --git a/modules/editor/tpl/js/editor_admin.js b/modules/editor/tpl/js/editor_admin.js new file mode 100644 index 000000000..9f0279e70 --- /dev/null +++ b/modules/editor/tpl/js/editor_admin.js @@ -0,0 +1,36 @@ +/** + * @author zero (zero@nzeo.com) + * @version 0.1 + * @brief 에디터 관리자 페이지용 스크립트 + **/ + +function doEnableComponent(component_name) { + var params = new Array(); + params['component_name'] = component_name; + + exec_xml('editor', 'procEditorAdminEnableComponent', params, completeUpdate); +} + +function doDisableComponent(component_name) { + var params = new Array(); + params['component_name'] = component_name; + + exec_xml('editor', 'procEditorAdminDisableComponent', params, completeUpdate); +} + +function doMoveListOrder(component_name, mode) { + var params = new Array(); + params['component_name'] = component_name; + params['mode'] = mode; + + exec_xml('editor', 'procEditorAdminMoveListOrder', params, completeUpdate); +} + +function completeUpdate(ret_obj) { + alert(ret_obj['message']); + location.href = location.href; +} + +function doSetupComponent(component_name) { + popopen("./?module=editor&act=dispEditorAdminSetupComponent&component_name="+component_name, "SetupComponent"); +} diff --git a/modules/editor/tpl/js/uploader.js b/modules/editor/tpl/js/uploader.js new file mode 100755 index 000000000..32bd31490 --- /dev/null +++ b/modules/editor/tpl/js/uploader.js @@ -0,0 +1,275 @@ +/** + * @author zero (zero@nzeo.com) + * @version 0.1 + * @brief 파일 업로드 관련 + * + *********************************************************************************************************************************************** + * 제로보드XE의 게시물 파일업로드 컴포넌트는 "mmSWFUpload 1.0: Flash upload dialog - http://swfupload.mammon.se/" 를 사용합니다. + * - SWFUpload is (c) 2006 Lars Huring and Mammon Media and is released under the MIT License:http://www.opensource.org/licenses/mit-license.php + *********************************************************************************************************************************************** + * 감사합니다. + **/ +var uploading_file = false; +var uploaded_files = new Array(); + +// 업로드를 하기 위한 준비 시작 +function editor_upload_init(upload_target_srl) { + xAddEventListener(window,'load',function() {editor_upload_form_set(upload_target_srl);} ); +} + +// upload_target_srl에 해당하는 form의 action을 iframe으로 변경 +function editor_upload_form_set(upload_target_srl) { + try { + document.execCommand('BackgroundImageCache',false,true); + } catch(e) { } + + // SWFUploader load + var uploader_name = "swf_uploader_"+upload_target_srl; + var embed_html = ""; + var flashVars = 'uploadProgressCallback=editor_upload_progress&uploadFileErrorCallback=editor_upload_error_handle&allowedFiletypesDescription='+uploader_setting["allowed_filetypes_description"]+'&autoUpload=true&allowedFiletypes='+uploader_setting["allowed_filetypes"]+'&maximumFilesize='+uploader_setting["allowed_filesize"]+'&uploadQueueCompleteCallback=editor_display_uploaded_file&uploadScript='+escape(request_uri+'?mid='+current_url.getQuery('mid')+'&act=procFileUpload&upload_target_srl='+upload_target_srl+'&PHPSESSID='+xGetCookie(zbxe_session_name)); + + if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length) { + embed_html = ''; + } else { + embed_html = ''; + } + + if(xIE4Up) { + window.document.body.insertAdjacentHTML("afterEnd", "

"+embed_html+"
"); + } else { + var dummy = xCreateElement("div"); + dummy.style.width = "1px"; + dummy.style.height = "1px"; + dummy.style.position="absolute"; + dummy.style.top="0px"; + dummy.style.left="0px"; + xInnerHtml(dummy, embed_html); + window.document.body.appendChild(dummy); + } + + // 임시 iframe을 생성 + if(!xGetElementById('tmp_upload_iframe')) { + if(xIE4Up) { + window.document.body.insertAdjacentHTML("afterEnd", ""); + } else { + var obj_iframe = xCreateElement('IFRAME'); + obj_iframe.name = obj_iframe.id = 'tmp_upload_iframe'; + obj_iframe.style.display = 'none'; + obj_iframe.style.width = '1px'; + obj_iframe.style.height = '1px'; + obj_iframe.style.position = 'absolute'; + obj_iframe.style.top = '-10px'; + obj_iframe.style.left = '-10px'; + window.document.body.appendChild(obj_iframe); + } + } + + // form의 action 을 변경 + var field_obj = xGetElementById("uploaded_file_list_"+upload_target_srl); + if(!field_obj) return; + + var fo_obj = field_obj.parentNode; + while(fo_obj.nodeName != 'FORM') { fo_obj = fo_obj.parentNode; } + fo_obj.target = 'tmp_upload_iframe'; + + // upload_target_srl에 해당하는 첨부파일 목록을 로드 (procDeleteFile에 file_srl을 보내주지 않으면 삭제시도는 없이 목록만 갱신할 수 있음) + var module = ""; + if(fo_obj["module"]) module = fo_obj.module.value; + var mid = ""; + if(fo_obj["mid"]) mid = fo_obj.mid.value; + var document_srl = ""; + if(fo_obj["document_srl"]) document_srl = fo_obj.document_srl.value; + + // 기 등록된 파일 표시 + editor_display_uploaded_file(upload_target_srl); +} + +// upload_target_srl에 등록된 파일 표시 +var _prev_upload_target_srl = 0; +function editor_display_uploaded_file(upload_target_srl) { + if(typeof(upload_target_srl)=='undefined'||!upload_target_srl) { + if(_prev_upload_target_srl) { + upload_target_srl = _prev_upload_target_srl; + _prev_upload_target_srl = 0; + } else return; + } + var url = "./?act=procFileDelete&upload_target_srl="+upload_target_srl+"&mid="+current_url.getQuery('mid'); + + // iframe에 url을 보내버림 + var iframe_obj = xGetElementById('tmp_upload_iframe'); + if(!iframe_obj) return; + iframe_obj.contentWindow.document.location.href=url; +} + +// 파일 업로드 에러 핸들링 +function editor_upload_error_handle(errcode,file,msg) { + switch(errcode) { + case -10 : + alert("- Error Code: HTTP Error\n- File name: "+file.name+"\n- Message: "+msg); + break; + case -20 : + alert("- Error Code: No upload script\n- File name: "+file.name+"\n- Message: "+msg); + break; + case -30 : + alert("- Error Code: IO Error\n- File name: "+file.name+"\n- Message: "+msg); + break; + case -40 : + alert("- Error Code: Security Error\n- File name: "+file.name+"\n- Message: "+msg); + break; + case -50 : + alert("- Error Code: Filesize exceeds limit\n- File name: "+file.name+"\n- File size: "+file.size+"\n- Message: "+msg); + break; + } +} + +// 파일 업로드 +function editor_upload_file(upload_target_srl) { + var swf_uploader = xGetElementById("swf_uploader_"+upload_target_srl); + if(!swf_uploader) return; + swf_uploader.browse(); + _prev_upload_target_srl = upload_target_srl; +} + +// 업로드 진행상태 표시 +var _progress_start = false; +function editor_upload_progress(file, bytesLoaded) { + var obj = xGetElementById('uploaded_file_list_'+_prev_upload_target_srl); + if(!_progress_start) { + while(obj.options.length) { + obj.remove(0); + } + _progress_start = true; + } + + var percent = Math.ceil((bytesLoaded / file.size) * 100); + var filename = file.name; + if(filename.length>15) filename = filename.substr(0,15)+'...'; + + var text = filename + ' ('+percent+'%)'; + if(!obj.options.length || obj.options[obj.options.length-1].value != file.id) { + var opt_obj = new Option(text, file.id, true, true); + obj.options[obj.options.length] = opt_obj; + } else { + obj.options[obj.options.length-1].text = text; + } +} + +// 업로드된 파일 목록 비움 +function editor_upload_clear_list(upload_target_srl) { + var obj = xGetElementById('uploaded_file_list_'+upload_target_srl); + while(obj.options.length) { + obj.remove(0); + } + var preview_obj = xGetElementById('uploaded_file_preview_box_'+upload_target_srl); + xInnerHtml(preview_obj,'') +} + +// 업로드된 파일 정보를 목록에 추가 +function editor_insert_uploaded_file(upload_target_srl, file_srl, filename, file_size, disp_file_size, uploaded_filename, sid) { + var obj = xGetElementById('uploaded_file_list_'+upload_target_srl); + if(filename.length>15) filename = filename.substr(0,15)+'...'; + var text = filename+' ('+disp_file_size+')'; + var opt_obj = new Option(text, file_srl, true, true); + obj.options[obj.options.length] = opt_obj; + + var file_obj = {file_srl:file_srl, filename:filename, file_size:file_size, uploaded_filename:uploaded_filename, sid:sid} + uploaded_files[file_srl] = file_obj; + + editor_preview(obj, upload_target_srl); + _progress_start = false; +} + +// 파일 목록창에서 클릭 되었을 경우 미리 보기 +function editor_preview(sel_obj, upload_target_srl) { + var preview_obj = xGetElementById('preview_uploaded_'+upload_target_srl); + if(!sel_obj.options.length) { + xInnerHtml(preview_obj, ''); + return; + } + + var file_srl = sel_obj.options[sel_obj.selectedIndex].value; + var obj = uploaded_files[file_srl]; + if(typeof(obj)=='undefined'||!obj) return; + var uploaded_filename = obj.uploaded_filename; + + if(!uploaded_filename) { + xInnerHtml(preview_obj, ''); + return; + } + + var html = ""; + + // 플래쉬 동영상의 경우 + if(/\.flv$/i.test(uploaded_filename)) { + html = ""; + + // 플래쉬 파일의 경우 + } else if(/\.swf$/i.test(uploaded_filename)) { + html = ""; + + // wmv, avi, mpg, mpeg등의 동영상 파일의 경우 + } else if(/\.(wmv|avi|mpg|mpeg|asx|asf|mp3)$/i.test(uploaded_filename)) { + html = ""; + + // 이미지 파일의 경우 + } else if(/\.(jpg|jpeg|png|gif)$/i.test(uploaded_filename)) { + html = ""; + + } + xInnerHtml(preview_obj, html); +} + +// 업로드된 파일 삭제 +function editor_remove_file(upload_target_srl) { + var obj = xGetElementById('uploaded_file_list_'+upload_target_srl); + if(obj.options.length<1) return; + var file_srl = obj.options[obj.selectedIndex].value; + if(!file_srl) return; + + // 삭제하려는 파일의 정보를 챙김;; + var fo_obj = obj; + while(fo_obj.nodeName != 'FORM') { fo_obj = fo_obj.parentNode; } + var mid = fo_obj.mid.value; + var url = "./?act=procFileDelete&upload_target_srl="+upload_target_srl+"&file_srl="+file_srl+"&mid="+current_url.getQuery('mid'); + + // iframe에 url을 보내버림 + var iframe_obj = xGetElementById('tmp_upload_iframe'); + if(!iframe_obj) return; + + iframe_obj.contentWindow.document.location.href=url; + + var preview_obj = xGetElementById('uploaded_file_preview_box_'+upload_target_srl); + xInnerHtml(preview_obj, ""); +} + +// 업로드 목록의 선택된 파일을 내용에 추가 +function editor_insert_file(upload_target_srl) { + var obj = xGetElementById('uploaded_file_list_'+upload_target_srl); + if(obj.options.length<1) return; + var file_srl = obj.options[obj.selectedIndex].value; + if(!file_srl) return; + var file_obj = uploaded_files[file_srl]; + var filename = file_obj.filename; + var sid = file_obj.sid; + var uploaded_filename = file_obj.uploaded_filename; + + // 바로 링크 가능한 파일의 경우 (이미지, 플래쉬, 동영상 등..) + if(uploaded_filename.indexOf("binaries")==-1) { + // 이미지 파일의 경우 image_link 컴포넌트 열결 + if(/\.(jpg|jpeg|png|gif)$/i.test(uploaded_filename)) { + openComponent("image_link", upload_target_srl, uploaded_filename); + + // 이미지외의 경우는 multimedia_link 컴포넌트 연결 + } else { + openComponent("multimedia_link", upload_target_srl, uploaded_filename); + } + + // binary파일의 경우 url_link 컴포넌트 연결 + } else { + var fo_obj = obj; + while(fo_obj.nodeName != 'FORM') { fo_obj = fo_obj.parentNode; } + var mid = fo_obj.mid.value; + var url = "./?module=file&act=procFileDownload&file_srl="+file_srl+"&sid="+sid; + openComponent("url_link", upload_target_srl, url); + } +} diff --git a/modules/editor/tpl/lang/en.lang.php b/modules/editor/tpl/lang/en.lang.php new file mode 100644 index 000000000..9ac34d1ef --- /dev/null +++ b/modules/editor/tpl/lang/en.lang.php @@ -0,0 +1,62 @@ + + * @brief English Language Pack (Basic Things) + **/ + + $lang->edit->fontname = 'Font'; + $lang->edit->fontsize = 'Size'; + $lang->edit->use_paragraph = 'Paragraph Function'; + $lang->edit->fontlist = array( + "Gulim", + "Dodum", + "Batang", + "Goongseo", + "times", + "Courier", + "Tahoma", + "Arial", + ); + + $lang->edit->header = "Style"; + $lang->edit->header_list = array( + "h1" => "Subject 1", + "h2" => "Subject 2", + "h3" => "Subject 3", + "h4" => "Subject 4", + "h5" => "Subject 5", + "h6" => "Subject 6", + ); + + $lang->edit->submit = 'Submit'; + + $lang->edit->help_fontcolor = "Select font color"; + $lang->edit->help_fontbgcolor = "Select background color of font"; + $lang->edit->help_bold = "Make font bold"; + $lang->edit->help_italic = "Make italic font"; + $lang->edit->help_underline = "Underline font"; + $lang->edit->help_strike = "Strike font"; + $lang->edit->help_redo = "Redo"; + $lang->edit->help_undo = "Undo"; + $lang->edit->help_align_left = "Align left"; + $lang->edit->help_align_center = "Align center"; + $lang->edit->help_align_right = "Align right"; + $lang->edit->help_add_indent = "Add indent"; + $lang->edit->help_remove_indent = "Remove indent"; + $lang->edit->help_list_number = "Apply number list"; + $lang->edit->help_list_bullet = "Apply bullet list"; + $lang->edit->help_use_paragrapth = "Press Ctrl+Enter to use paragraph. (Press Alt+S to save)"; + + $lang->edit->upload = 'Attachment'; + $lang->edit->upload_file = 'Attach'; + $lang->edit->link_file = 'Insert to Content'; + $lang->edit->delete_selected = 'Delete Selected'; + + $lang->edit->icon_align_article = 'Occupy a paragraph'; + $lang->edit->icon_align_left = 'Align Left'; + $lang->edit->icon_align_middle = 'Align Center'; + $lang->edit->icon_align_right = 'Align Right'; + + $lang->about_dblclick_in_editor = 'You are able to set detail component configure by double-clicking on background, text, images, or quotations'; +?> diff --git a/modules/editor/tpl/lang/jp.lang.php b/modules/editor/tpl/lang/jp.lang.php new file mode 100644 index 000000000..ccccecc1f --- /dev/null +++ b/modules/editor/tpl/lang/jp.lang.php @@ -0,0 +1,62 @@ + 翻訳:RisaPapa + * @brief 日本語言語パッケージ(基本的な内容のみ) + **/ + + $lang->edit->fontname = 'フォント'; + $lang->edit->fontsize = 'サイズ'; + $lang->edit->use_paragraph = '段落機能'; + $lang->edit->fontlist = array( + "MS Pゴシック", + "MS P明朝", + "Osaka-等幅", + "ヒラギノ角ゴ Pro W3", + "times", + "Courier", + "Tahoma", + "Arial", + ); + + $lang->edit->header = "見出し"; + $lang->edit->header_list = array( + "h1" => "見出し1", + "h2" => "見出し2", + "h3" => "見出し3", + "h4" => "見出し4", + "h5" => "見出し5", + "h6" => "見出し6", + ); + + $lang->edit->submit = '送信'; + + $lang->edit->help_fontcolor = "テキストの色を指定します。"; + $lang->edit->help_fontbgcolor = "テキストの背景色を指定します。"; + $lang->edit->help_bold = "テキストを太字に指定します。"; + $lang->edit->help_italic = "テキストを斜体にします。"; + $lang->edit->help_underline = "テキストに下線(アンダーライン)を引きます。"; + $lang->edit->help_strike = "打ち消し線を引きます。"; + $lang->edit->help_redo = "直前に取り消した処理をもう一度繰り返して実行します。"; + $lang->edit->help_undo = "直前に行った操作や処理を取り消し元に戻します。"; + $lang->edit->help_align_left = "テキストを左揃えで表示します。"; + $lang->edit->help_align_center = "テキストを中央揃えで表示します。"; + $lang->edit->help_align_right = "テキストを右揃えで表示します。"; + $lang->edit->help_add_indent = "テキストの行頭の位置を右に寄せます。"; + $lang->edit->help_remove_indent = "インデント(字下げ)を除去します。"; + $lang->edit->help_list_number = "リスト項目に数字で順序を付けます。"; + $lang->edit->help_list_bullet = "記号でリスト項目を記述します。"; + $lang->edit->help_use_paragrapth = "段落機能を使用する場合は、「Ctrl+Enter」を押します(書き終わった後、「Alt+S」を押すと保存されます)。"; + + $lang->edit->upload = '添付'; + $lang->edit->upload_file = 'ファイル添付'; + $lang->edit->link_file = 'テキスト挿入'; + $lang->edit->delete_selected = '選択リスト削除'; + + $lang->edit->icon_align_article = '一段落'; + $lang->edit->icon_align_left = '左揃え'; + $lang->edit->icon_align_middle = '中央揃え'; + $lang->edit->icon_align_right = '右揃え'; + + $lang->about_dblclick_in_editor = '背景、文字、イメージ、引用文の上にカーソルを合わせ,ダブルクリックすると詳細設定できるコンポーネントを表示します。'; +?> diff --git a/modules/editor/tpl/lang/ko.lang.php b/modules/editor/tpl/lang/ko.lang.php new file mode 100644 index 000000000..0d462a2db --- /dev/null +++ b/modules/editor/tpl/lang/ko.lang.php @@ -0,0 +1,62 @@ + + * @brief 한국어 언어팩 (기본적인 내용만 수록) + **/ + + $lang->edit->fontname = '글꼴'; + $lang->edit->fontsize = '크기'; + $lang->edit->use_paragraph = '문단기능'; + $lang->edit->fontlist = array( + "굴림", + "돋움", + "바탕", + "궁서", + "times", + "Courier", + "Tahoma", + "Arial", + ); + + $lang->edit->header = "형식"; + $lang->edit->header_list = array( + "h1" => "제목 1", + "h2" => "제목 2", + "h3" => "제목 3", + "h4" => "제목 4", + "h5" => "제목 5", + "h6" => "제목 6", + ); + + $lang->edit->submit = '확인'; + + $lang->edit->help_fontcolor = "글자의 색상을 지정합니다"; + $lang->edit->help_fontbgcolor = "글자의 배경색상을 지정합니다"; + $lang->edit->help_bold = "글자를 진하게 합니다"; + $lang->edit->help_italic = "글자를 기울이게 합니다"; + $lang->edit->help_underline = "밑줄을 긋습니다"; + $lang->edit->help_strike = "취소선을 긋습니다"; + $lang->edit->help_redo = "다음 동작으로 돌아갑니다"; + $lang->edit->help_undo = "이전 동작으로 돌아갑니다"; + $lang->edit->help_align_left = "왼쪽 정렬을 합니다"; + $lang->edit->help_align_center = "가운데 정렬을 합니다"; + $lang->edit->help_align_right = "오른쪽 정렬을 합니다"; + $lang->edit->help_add_indent = "들여쓰기를 합니다"; + $lang->edit->help_remove_indent = "들여쓰기를 제거합니다"; + $lang->edit->help_list_number = "숫자로된 목록을 적용합니다"; + $lang->edit->help_list_bullet = "기호로된 목록을 적용합니다"; + $lang->edit->help_use_paragrapth = "문단 나누기를 하시려면 ctrl-엔터를 누르시면 됩니다. (글 작성완료후 alt-S를 누르면 저장이 됩니다)"; + + $lang->edit->upload = '첨부'; + $lang->edit->upload_file = '파일 첨부'; + $lang->edit->link_file = '본문 삽입'; + $lang->edit->delete_selected = '선택 삭제'; + + $lang->edit->icon_align_article = '한 문단을 차지'; + $lang->edit->icon_align_left = '글의 왼쪽으로'; + $lang->edit->icon_align_middle = '가운데 정렬'; + $lang->edit->icon_align_right = '글의 우측으로'; + + $lang->about_dblclick_in_editor = '배경, 글자, 이미지, 인용문등에서 더블클릭을 하시면 상세한 컴포넌트 설정이 가능합니다'; +?> diff --git a/modules/editor/tpl/lang/zh-CN.lang.php b/modules/editor/tpl/lang/zh-CN.lang.php new file mode 100644 index 000000000..2c5dd200a --- /dev/null +++ b/modules/editor/tpl/lang/zh-CN.lang.php @@ -0,0 +1,62 @@ + + * @brief 简体中文语言包 (只收录基本内容) + **/ + + $lang->edit->fontname = '字体'; + $lang->edit->fontsize = '大小'; + $lang->edit->use_paragraph = '段落功能'; + $lang->edit->fontlist = array( + "仿宋_GB2312", + "黑体", + "楷体_GB2312", + "宋体", + "times", + "Courier", + "Tahoma", + "Arial", + ); + + $lang->edit->header = "样式"; + $lang->edit->header_list = array( + "h1" => "标题 1", + "h2" => "标题 2", + "h3" => "标题 3", + "h4" => "标题 4", + "h5" => "标题 5", + "h6" => "标题 6", + ); + + $lang->edit->submit = '确认'; + + $lang->edit->help_fontcolor = "文本颜色"; + $lang->edit->help_fontbgcolor = "背景颜色"; + $lang->edit->help_bold = "粗体"; + $lang->edit->help_italic = "斜体"; + $lang->edit->help_underline = "下划线"; + $lang->edit->help_strike = "取消线"; + $lang->edit->help_redo = "重新操作"; + $lang->edit->help_undo = "返回操作"; + $lang->edit->help_align_left = "左对齐"; + $lang->edit->help_align_center = "居中对齐"; + $lang->edit->help_align_right = "右对齐"; + $lang->edit->help_add_indent = "缩进"; + $lang->edit->help_remove_indent = "清除缩进"; + $lang->edit->help_list_number = "有序列表"; + $lang->edit->help_list_bullet = "无序列表"; + $lang->edit->help_use_paragrapth = "分段请按 ctrl+回车. (发表主题快捷键:alt+S)"; + + $lang->edit->upload = '上传'; + $lang->edit->upload_file = '上传附件'; + $lang->edit->link_file = '插入内容'; + $lang->edit->delete_selected = '删除所选'; + + $lang->edit->icon_align_article = '占一个段落'; + $lang->edit->icon_align_left = '文本左侧'; + $lang->edit->icon_align_middle = '居中对齐'; + $lang->edit->icon_align_right = '文本右侧'; + + $lang->about_dblclick_in_editor = '双击背景, 文本, 图片, 引用即可对其相关组件进行详细设置。'; +?> diff --git a/modules/editor/tpl/popup.html b/modules/editor/tpl/popup.html new file mode 100644 index 000000000..0354d1709 --- /dev/null +++ b/modules/editor/tpl/popup.html @@ -0,0 +1 @@ +{$popup_content} diff --git a/modules/editor/tpl/setup_component.html b/modules/editor/tpl/setup_component.html new file mode 100644 index 000000000..076db8d39 --- /dev/null +++ b/modules/editor/tpl/setup_component.html @@ -0,0 +1,45 @@ + + + +
+

{$lang->cmd_setup}

+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
{$lang->component_name}{$component->component_name} ver. {$component->version}
{$lang->component_author}{$component->author->name}
{$lang->component_link}{$component->author->link}
{$val->title} + +

{$val->description}

+
+
+ + + + diff --git a/modules/editor/tpl/view_component.html b/modules/editor/tpl/view_component.html new file mode 100644 index 000000000..5261cd6a8 --- /dev/null +++ b/modules/editor/tpl/view_component.html @@ -0,0 +1,29 @@ + + + +
+

{$component->title} ver. {$component->version}

+
+ +
+ + + + + + + + + + + + + + + +
{$lang->component_author}{$component->author->name}
{$lang->component_link}{$component->author->link}
{$lang->component_description}{nl2br($component->description)}
+
+ + diff --git a/modules/file/conf/info.xml b/modules/file/conf/info.xml new file mode 100644 index 000000000..15ab90f7b --- /dev/null +++ b/modules/file/conf/info.xml @@ -0,0 +1,20 @@ + + + 첨부파일 + 上传附件 + Attachment + Ajuntar archivo + 添付ファイル + + 제로 + zero + Zero + zero + Zero + 첨부 파일 관리하는 모듈입니다. + 管理附件的模块。 + Module for managing attachments. + Es el módulo maneja archivo ajuntado. + 添付ファイルを管理するモジュールです。 + + diff --git a/modules/file/conf/module.xml b/modules/file/conf/module.xml new file mode 100644 index 000000000..2a2f53113 --- /dev/null +++ b/modules/file/conf/module.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/modules/file/file.admin.controller.php b/modules/file/file.admin.controller.php new file mode 100644 index 000000000..03ec70282 --- /dev/null +++ b/modules/file/file.admin.controller.php @@ -0,0 +1,71 @@ +module_srl = $module_srl; + $output = executeQuery('file.deleteModuleFiles', $args); + if(!$output->toBool()) return $output; + + // 실제 파일 삭제 + $path[0] = sprintf("./files/attach/images/%s/", $module_srl); + $path[1] = sprintf("./files/attach/binaries/%s/", $module_srl); + FileHandler::removeDir($path[0]); + FileHandler::removeDir($path[1]); + + return $output; + } + + /** + * @brief 관리자 페이지에서 선택된 파일들을 삭제 + **/ + function procFileAdminDeleteChecked() { + // 선택된 글이 없으면 오류 표시 + $cart = Context::get('cart'); + if(!$cart) return $this->stop('msg_cart_is_null'); + $file_srl_list= explode('|@|', $cart); + $file_count = count($file_srl_list); + if(!$file_count) return $this->stop('msg_cart_is_null'); + + $oFileController = &getController('file'); + + // 글삭제 + for($i=0;$i<$file_count;$i++) { + $file_srl = trim($file_srl_list[$i]); + if(!$file_srl) continue; + + $oFileController->deleteFile($file_srl); + } + + $this->setMessage( sprintf(Context::getLang('msg_checked_file_is_deleted'), $file_count) ); + } + + /** + * @brief 파일 기본 정보의 추가 + **/ + function procFileAdminInsertConfig() { + // 기본 정보를 받음 + $args = Context::gets('allowed_filesize','allowed_attach_size','allowed_filetypes'); + + // module Controller 객체 생성하여 입력 + $oModuleController = &getController('module'); + $output = $oModuleController->insertModuleConfig('file',$args); + return $output; + } + + } +?> diff --git a/modules/file/file.admin.model.php b/modules/file/file.admin.model.php new file mode 100644 index 000000000..882baf4ce --- /dev/null +++ b/modules/file/file.admin.model.php @@ -0,0 +1,73 @@ +s_filename = $search_keyword; + break; + case 'filesize' : + $args->s_filesize = (int)$search_keyword; + break; + case 'download_count' : + $args->s_download_count = (int)$search_keyword; + break; + case 'regdate' : + $args->s_regdate = $search_keyword; + break; + case 'ipaddress' : + $args->s_ipaddress= $search_keyword; + break; + } + } + + // 유효/대기 상태 설정 + if($obj->isvalid == 'Y') $args->isvalid = 'Y'; + elseif($obj->isvalid == 'N') $args->isvalid = 'N'; + + // 변수 설정 + $args->sort_index = $obj->sort_index; + $args->page = $obj->page?$obj->page:1; + $args->list_count = $obj->list_count?$obj->list_count:20; + $args->page_count = $obj->page_count?$obj->page_count:10; + $args->s_module_srl = $obj->module_srl; + + // file.getFileList쿼리 실행 + $output = executeQuery('file.getFileList', $args); + + // 결과가 없거나 오류 발생시 그냥 return + if(!$output->toBool()||!count($output->data)) return $output; + + $oFileModel = &getModel('file'); + + foreach($output->data as $key => $file) { + $file->download_url = $oFileModel->getDownloadUrl($file->file_srl, $file->sid); + $output->data[$key] = $file; + } + + return $output; + } + + } +?> diff --git a/modules/file/file.admin.view.php b/modules/file/file.admin.view.php new file mode 100644 index 000000000..47de2c004 --- /dev/null +++ b/modules/file/file.admin.view.php @@ -0,0 +1,83 @@ +page = Context::get('page'); ///< 페이지 + $args->list_count = 50; ///< 한페이지에 보여줄 글 수 + $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 + + $args->sort_index = 'file_srl'; ///< 소팅 값 + $args->isvalid = Context::get('isvalid'); + $args->module_srl = Context::get('module_srl'); + + // 목록 구함 + $oFileModel = &getAdminModel('file'); + $output = $oFileModel->getFileList($args); + + // mid목록을 구함 + $oModuleModel = &getModel('module'); + $mid_list = $oModuleModel->getMidList(); + Context::set('mid_list', $mid_list); + + // 목록의 loop를 돌면서 mid를 구하기 위한 module_srl값을 구함 + $file_count = count($output->data); + if($file_count) { + $module_srl_list = array(); + foreach($output->data as $key => $val) { + $module_srl = $val->module_srl; + if(!in_array($module_srl, $module_srl_list)) $module_srl_list[] = $module_srl; + } + if(count($module_srl_list)) { + $args->module_srls = implode(',',$module_srl_list); + $mid_output = executeQuery('module.getModuleInfoByModuleSrl', $args); + if($mid_output->data && !is_array($mid_output->data)) $mid_output->data = array($mid_output->data); + for($i=0;$idata);$i++) { + $mid_info = $mid_output->data[$i]; + $module_list[$mid_info->module_srl] = $mid_info; + } + } + } + + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('file_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + Context::set('module_list', $module_list); + + // 템플릿 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('file_list'); + } + + /** + * @brief 첨부파일 정보 설정 (관리자용) + **/ + function dispFileAdminConfig() { + $oFileModel = &getModel('file'); + $config = $oFileModel->getFileConfig(); + Context::set('config',$config); + + // 템플릿 파일 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('file_config'); + } + + } +?> diff --git a/modules/file/file.class.php b/modules/file/file.class.php new file mode 100644 index 000000000..135bb4c1a --- /dev/null +++ b/modules/file/file.class.php @@ -0,0 +1,49 @@ +insertActionForward('file', 'view', 'dispFileAdminList'); + $oModuleController->insertActionForward('file', 'view', 'dispFileAdminConfig'); + $oModuleController->insertActionForward('file', 'controller', 'procFileUpload'); + $oModuleController->insertActionForward('file', 'controller', 'procFileDelete'); + $oModuleController->insertActionForward('file', 'controller', 'procFileDownload'); + + // 첨부파일의 기본 설정 저장 + $config->allowed_filesize = '2'; + $config->allowed_attach_size = '2'; + $config->allowed_filetypes = '*.*'; + $oModuleController->insertModuleConfig('file', $config); + + // file 모듈에서 사용할 디렉토리 생성 + FileHandler::makeDir('./files/attach/images'); + FileHandler::makeDir('./files/attach/binaries'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + } +?> diff --git a/modules/file/file.controller.php b/modules/file/file.controller.php new file mode 100644 index 000000000..e4e63045b --- /dev/null +++ b/modules/file/file.controller.php @@ -0,0 +1,330 @@ +module_srl; + + // 업로드 권한이 없거나 정보가 없을시 종료 + if(!$_SESSION['upload_enable'][$upload_target_srl]) exit(); + + $file_info = Context::get('Filedata'); + + // 정상적으로 업로드된 파일이 아니면 오류 출력 + if(!is_uploaded_file($file_info['tmp_name'])) return false; + + return $this->insertFile($file_info, $module_srl, $upload_target_srl); + } + + + /** + * @brief 에디터에서 첨부 파일 삭제 + **/ + function procFileDelete() { + // 기본적으로 필요한 변수인 upload_target_srl, module_srl을 설정 + $upload_target_srl = Context::get('upload_target_srl'); + $file_srl = Context::get('file_srl'); + + // 업로드 권한이 없거나 정보가 없을시 종료 + if(!$_SESSION['upload_enable'][$upload_target_srl]) exit(); + + if($file_srl) $output = $this->deleteFile($file_srl); + + // 첨부파일의 목록을 java script로 출력 + $this->printUploadedFileList($upload_target_srl); + } + + /** + * @brief 업로드 가능하다고 세팅 + **/ + function setUploadEnable($upload_target_srl) { + $_SESSION['upload_enable'][$upload_target_srl] = true; + } + + /** + * @brief 첨부파일 추가 + **/ + function insertFile($file_info, $module_srl, $upload_target_srl, $download_count = 0, $manual_insert = false) { + if(!$manual_insert) { + // 첨부파일 설정 가져옴 + $logged_info = Context::get('logged_info'); + if($logged_info->is_admin != 'Y') { + $oFileModel = &getModel('file'); + $config = $oFileModel->getFileConfig(); + $allowed_attach_size = $config->allowed_attach_size * 1024 * 1024; + + // 해당 문서에 첨부된 모든 파일의 용량을 가져옴 (DB에서 가져옴) + $size_args->upload_target_srl = $upload_target_srl; + $output = executeQuery('file.getAttachedFileSize', $size_args); + $attached_size = (int)$output->data->attached_size + filesize($file_info['tmp_name']); + if($attached_size > $allowed_attach_size) return new Object(-1, 'msg_exceeds_limit_size'); + } + } + + // 이미지인지 기타 파일인지 체크하여 upload path 지정 + if(eregi("\.(jpg|jpeg|gif|png|wmv|mpg|mpeg|avi|swf|flv|mp3|asaf|wav|asx|midi)$", $file_info['name'])) { + $path = sprintf("./files/attach/images/%s/%s/", $module_srl,$upload_target_srl); + $filename = $path.$file_info['name']; + $direct_download = 'Y'; + } else { + $path = sprintf("./files/attach/binaries/%s/%s/", $module_srl, $upload_target_srl); + $filename = $path.md5(crypt(rand(1000000,900000), rand(0,100))); + $direct_download = 'N'; + } + + // 디렉토리 생성 + if(!FileHandler::makeDir($path)) return false; + + // 파일 이동 + if(!$manual_insert&&!move_uploaded_file($file_info['tmp_name'], $filename)) return false; + elseif($manual_insert) @rename($file_info['tmp_name'], $filename); + + // 사용자 정보를 구함 + $oMemberModel = &getModel('member'); + $member_srl = $oMemberModel->getLoggedMemberSrl(); + + // 파일 정보를 정리 + $args->file_srl = getNextSequence(); + $args->upload_target_srl = $upload_target_srl; + $args->module_srl = $module_srl; + $args->direct_download = $direct_download; + $args->source_filename = $file_info['name']; + $args->uploaded_filename = $filename; + $args->download_count = $download_count; + $args->file_size = filesize($filename); + $args->comment = NULL; + $args->member_srl = $member_srl; + $args->sid = md5(rand(rand(1111111,4444444),rand(4444445,9999999))); + + $output = executeQuery('file.insertFile', $args); + if(!$output->toBool()) return $output; + + $output->add('file_srl', $args->file_srl); + $output->add('file_size', $args->file_size); + $output->add('source_filename', $args->source_filename); + return $output; + } + + /** + * @brief 특정 upload_target_srl의 첨부파일들의 상태를 유효로 변경 + * 글이 등록될때 글에 첨부된 파일들의 상태를 유효상태로 변경함으로서 관리시 불필요 파일로 인식되지 않도록 함 + **/ + function setFilesValid($upload_target_srl) { + $args->upload_target_srl = $upload_target_srl; + return executeQuery('file.updateFileValid', $args); + } + + /** + * @brief 첨부파일 삭제 + **/ + function deleteFile($file_srl) { + // 파일 정보를 가져옴 + $args->file_srl = $file_srl; + $output = executeQuery('file.getFile', $args); + if(!$output->toBool()) return $output; + $file_info = $output->data; + if(!$file_info) return new Object(-1, 'file_not_founded'); + + $source_filename = $output->data->source_filename; + $uploaded_filename = $output->data->uploaded_filename; + + // DB에서 삭제 + $output = executeQuery('file.deleteFile', $args); + if(!$output->toBool()) return $output; + + // 삭제 성공하면 파일 삭제 + unlink($uploaded_filename); + + return $output; + } + + /** + * @brief 특정 문서의 첨부파일을 모두 삭제 + **/ + function deleteFiles($upload_target_srl) { + // 첨부파일 목록을 받음 + $oFileModel = &getModel('file'); + $file_list = $oFileModel->getFiles($upload_target_srl); + + // 첨부파일이 없으면 성공 return + if(!is_array($file_list)||!count($file_list)) return new Object(); + + // DB에서 삭제 + $args->upload_target_srl = $upload_target_srl; + $output = executeQuery('file.deleteFiles', $args); + if(!$output->toBool()) return $output; + + // 실제 파일 삭제 + $file_count = count($file_list); + for($i=0;$imodule_srl; + $path[0] = sprintf("./files/attach/images/%s/%s/", $module_srl, $upload_target_srl); + $path[1] = sprintf("./files/attach/binaries/%s/%s/", $module_srl, $upload_target_srl); + + FileHandler::removeDir($path[0]); + FileHandler::removeDir($path[1]); + } + + return $output; + } + + /** + * @brief 특정 글의 첨부파일을 다른 글로 이동 + **/ + function moveFile($source_srl, $target_module_srl, $target_srl) { + if($source_srl == $target_srl) return; + + $oFileModel = &getModel('file'); + $file_list = $oFileModel->getFiles($source_srl); + if(!$file_list) return; + + $file_count = count($file_list); + + for($i=0;$i<$file_count;$i++) { + + unset($file_info); + $file_info = $file_list[$i]; + $old_file = $file_info->uploaded_filename; + + // 이미지인지 기타 파일인지 체크하여 이동할 위치 정함 + if(eregi("\.(jpg|jpeg|gif|png|wmv|mpg|mpeg|avi|swf|flv|mp3|asaf|wav|asx|midi)$", $file_info->source_filename)) { + $path = sprintf("./files/attach/images/%s/%s/", $target_module_srl,$target_srl); + $new_file = $path.$file_info->source_filename; + } else { + $path = sprintf("./files/attach/binaries/%s/%s/", $target_module_srl, $target_srl); + $new_file = $path.md5(crypt(rand(1000000,900000), rand(0,100))); + } + + // 디렉토리 생성 + FileHandler::makeDir($path); + + // 파일 이동 + @rename($old_file, $new_file); + + // DB 정보도 수정 + unset($args); + $args->file_srl = $file_info->file_srl; + $args->uploaded_filename = $new_file; + $args->module_srl = $file_info->module_srl; + $args->upload_target_srl = $target_srl; + executeQuery('file.updateFile', $args); + } + } + + /** + * @brief upload_target_srl을 키로 하는 첨부파일을 찾아서 java script 코드로 return + **/ + function printUploadedFileList($upload_target_srl) { + // file의 Model객체 생성 + $oFileModel = &getModel('file'); + + // 첨부파일 목록을 구함 + $tmp_file_list = $oFileModel->getFiles($upload_target_srl); + $file_count = count($tmp_file_list); + + $logged_info = Context::get('logged_info'); + if($logged_info->is_admin == 'Y') { + //$file_config->allowed_filesize = 1024; + //$file_config->allowed_attach_size = 1024; + $file_config->allowed_filesize = ini_get('upload_max_filesize'); + $file_config->allowed_attach_size = ini_get('upload_max_filesize'); + $file_config->allowed_filetypes = '*.*'; + } else { + $file_config = $oFileModel->getFileConfig(); + } + + // 루프를 돌면서 $buff 변수에 java script 코드를 생성 + $buff = ""; + for($i=0;$i<$file_count;$i++) { + $file_info = $tmp_file_list[$i]; + if(!$file_info->file_srl) continue; + if($file_info->direct_download == 'Y') $file_info->uploaded_filename = sprintf('%s%s', Context::getRequestUri(), str_replace('./', '', $file_info->uploaded_filename)); + $file_list[] = $file_info; + $attached_size += $file_info->file_size; + } + + // 업로드 상태 표시 작성 + $upload_status = sprintf( + '%s : %s/ %s
%s : %s (%s : %s)', + Context::getLang('allowed_attach_size'), + FileHandler::filesize($attached_size), + FileHandler::filesize($file_config->allowed_attach_size*1024*1024), + Context::getLang('allowed_filesize'), + FileHandler::filesize($file_config->allowed_filesize*1024*1024), + Context::getLang('allowed_filetypes'), + $file_config->allowed_filetypes + ); + + Context::set('upload_target_srl', $upload_target_srl); + Context::set('file_list', $file_list); + Context::set('upload_status', $upload_status); + + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('print_uploaded_file_list'); + } + + /** + * @brief 첨부파일 다운로드 + * 직접 요청을 받음 + * file_srl : 파일의 sequence + * sid : db에 저장된 비교 값, 틀리면 다운로드 하지 낳음 + **/ + function procFileDownload() { + $file_srl = Context::get('file_srl'); + $sid = Context::get('sid'); + + // 파일의 정보를 DB에서 받아옴 + $oFileModel = &getModel('file'); + $file_obj = $oFileModel->getFile($file_srl); + if($file_obj->file_srl!=$file_srl||$file_obj->sid!=$sid) exit(); + + // 이상이 없으면 download_count 증가 + $args->file_srl = $file_srl; + executeQuery('file.updateFileDownloadCount', $args); + + // 파일 출력 + $filename = $file_obj->source_filename; + + if(strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) { + $filename = urlencode($filename); + $filename = preg_replace('/\./', '%2e', $filename, substr_count($filename, '.') - 1); + } + + $uploaded_filename = $file_obj->uploaded_filename; + if(!file_exists($uploaded_filename)) exit(); + + $fp = fopen($uploaded_filename, 'rb'); + if(!$fp) exit(); + + header("Cache-Control: "); + header("Pragma: "); + header("Content-Type: application/octet-stream"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + + header("Content-Length: " .(string)($file_obj->file_size)); + header('Content-Disposition: attachment; filename="'.$filename.'"'); + header("Content-Transfer-Encoding: binary\n"); + + fpassthru($fp); + + exit(); + } + + } +?> diff --git a/modules/file/file.model.php b/modules/file/file.model.php new file mode 100644 index 000000000..4aa6a62b3 --- /dev/null +++ b/modules/file/file.model.php @@ -0,0 +1,83 @@ +upload_target_srl = $upload_target_srl; + $output = executeQuery('file.getFilesCount', $args); + return (int)$output->data->count; + } + + /** + * @brief 다운로드 경로를 구함 + **/ + function getDownloadUrl($file_srl, $sid) { + return getUrl('','module','file','act','procFileDownload','file_srl',$file_srl,'sid',$sid); + } + + /** + * @brief 파일 설정 정보를 구함 + **/ + function getFileConfig() { + // 설정 정보를 받아옴 (module model 객체를 이용) + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('file'); + + if(!$config->allowed_filesize) $config->allowed_filesize = '2'; + if(!$config->allowed_attach_size) $config->allowed_attach_size = '3'; + if(!$config->allowed_filetypes) $config->allowed_filetypes = '*.*'; + return $config; + } + + /** + * @brief 파일 정보를 구함 + **/ + function getFile($file_srl) { + $args->file_srl = $file_srl; + $output = executeQuery('file.getFile', $args); + if(!$output->toBool()) return $output; + + $file = $output->data; + $file->download_url = $this->getDownloadUrl($file->file_srl, $file->sid); + + return $file; + } + + /** + * @brief 특정 문서에 속한 파일을 모두 return + **/ + function getFiles($upload_target_srl) { + $args->upload_target_srl = $upload_target_srl; + $args->sort_index = 'file_srl'; + $output = executeQuery('file.getFiles', $args); + if(!$output->data) return; + + $file_list = $output->data; + + if($file_list && !is_array($file_list)) $file_list = array($file_list); + + $file_count = count($file_list); + for($i=0;$i<$file_count;$i++) { + $file = $file_list[$i]; + $file->download_url = $this->getDownloadUrl($file->file_srl, $file->sid); + $file_list[$i] = $file; + } + + return $file_list; + } + } +?> diff --git a/modules/file/lang/en.lang.php b/modules/file/lang/en.lang.php new file mode 100644 index 000000000..8fdab64cf --- /dev/null +++ b/modules/file/lang/en.lang.php @@ -0,0 +1,39 @@ + + * @brief Attachment module's basic language pack + **/ + + $lang->file = 'Attachment'; + $lang->file_name = 'File name'; + $lang->file_size = 'File size'; + $lang->download_count = 'Number of downloads'; + $lang->status = 'Status'; + $lang->is_valid = 'Valid'; + $lang->is_stand_by = 'Stand by'; + $lang->file_list = 'Attachments list'; + $lang->allowed_filesize = 'File size limit'; + $lang->allowed_attach_size = 'Total size limit'; + $lang->allowed_filetypes = 'Allowed extensions'; + + $lang->about_allowed_filesize = 'You can assign file size limit for each file. (Excluding administrators)'; + $lang->about_allowed_attach_size = 'You can assign file size limit for each document. (Excluding administrators)'; + $lang->about_allowed_filetypes = 'Only allowed extentsions can be attached. To allow an extention, use "*.extention". To allow multiple extentions, use ";" between each extentions.
ex) *.* or *.jpg;*.gif;
(Excludes Administrators)'; + + $lang->cmd_delete_checked_file = 'Delete Selected'; + $lang->cmd_move_to_document = 'Move to document'; + $lang->cmd_download = 'Download'; + + $lang->msg_cart_is_null = 'Select the file you wish to delete'; + $lang->msg_checked_file_is_deleted = 'Total of %d attachments has been deleted'; + $lang->msg_exceeds_limit_size = 'Attachment faild; exceeded the file size limit'; + + $lang->search_target_list = array( + 'filename' => 'File name', + 'filesize' => 'File size (byte, Above)', + 'download_count' => 'Downloads (Above)', + 'regdate' => 'Date', + 'ipaddress' => 'IP Address', + ); +?> diff --git a/modules/file/lang/es.lang.php b/modules/file/lang/es.lang.php new file mode 100644 index 000000000..5cba586a4 --- /dev/null +++ b/modules/file/lang/es.lang.php @@ -0,0 +1,39 @@ + + * @brief Paquete lingual de archivo ajuntado + **/ + + $lang->file = 'Ajuntar Archivo'; + $lang->file_name = 'Nombre de Archivo'; + $lang->file_size = 'Tamaño'; + $lang->download_count = 'Bajado'; + $lang->status = 'Estado'; + $lang->is_valid = 'Valido'; + $lang->is_stand_by = 'Preparado'; + $lang->file_list = 'Lista de archivo'; + $lang->allowed_filesize = 'Tamaño maximo de archivo'; + $lang->allowed_attach_size = 'Tamaño maximo en total por documento'; + $lang->allowed_filetypes = 'Tipo de Archivos'; + + $lang->about_allowed_filesize = 'Puede especificar el limite de archivos incluidos. (excepto administrador)'; + $lang->about_allowed_attach_size = 'Pueude especificar el limite de archivos incluidos en documento. (excepto administrador)'; + $lang->about_allowed_filetypes = 'Puede subir archivo solo extenciónes definido. Puede definir en la forma como: "*.extensión", y puede usar ";" para muliples.
ej) *.* o *.jpg;*.gif;
(excepto administrador)'; + + $lang->cmd_delete_checked_file = 'eliminar la selección'; + $lang->cmd_move_to_document = 'mover a documento'; + $lang->cmd_download = 'bajar'; + + $lang->msg_cart_is_null = 'Por favor seleccióne archivo'; + $lang->msg_checked_file_is_deleted = 'Ha eliminado %d archivos'; + $lang->msg_exceeds_limit_size = 'Ha excedido del limite de incluidos'; + + $lang->search_target_list = array( + 'filename' => 'Nombre', + 'filesize' => 'Tamaño (byte)', + 'download_count' => 'Bajado (más)', + 'regdate' => 'Registrado', + 'ipaddress' => 'Dirección IP', + ); +?> diff --git a/modules/file/lang/jp.lang.php b/modules/file/lang/jp.lang.php new file mode 100644 index 000000000..b70658ba3 --- /dev/null +++ b/modules/file/lang/jp.lang.php @@ -0,0 +1,39 @@ + 翻訳:RisaPapa + * @brief 添付ファイル(file)モジュールの基本言語パッケージ + **/ + + $lang->file = '添付ファイル'; + $lang->file_name = 'ファイル名'; + $lang->file_size = 'ファイルサイズ'; + $lang->download_count = 'ダウンロード数'; + $lang->status = '状態'; + $lang->is_valid = '有効'; + $lang->is_stand_by = '待機'; + $lang->file_list = '添付ファイルリスト'; + $lang->allowed_filesize = 'ファイルサイズ制限'; + $lang->allowed_attach_size = '書き込みへの添付制限'; + $lang->allowed_filetypes = '添付可能な拡張子'; + + $lang->about_allowed_filesize = '一つのファイルに対して、アップロードできるファイルの最大サイズを指定します(管理者除外)。'; + $lang->about_allowed_attach_size = '一つの書き込みに対して、添付できる最大サイズを指定します(管理者除外)。'; + $lang->about_allowed_filetypes = 'アップロードできるように設定されたファイルのみが添付できます。"*.拡張子"で指定し、 ";"で区切って任意の拡張子を追加して指定できます(管理者除外)。
ex) *.* or *.jpg;*.gif;
'; + + $lang->cmd_delete_checked_file = '選択リスト削除'; + $lang->cmd_move_to_document = '書き込みに移動する'; + $lang->cmd_download = 'ダウンロード'; + + $lang->msg_cart_is_null = '削除するファイルを選択してください'; + $lang->msg_checked_file_is_deleted = '%d個の添付ファイルを削除しました'; + $lang->msg_exceeds_limit_size = 'ファイルサイズの制限を超えたため、添付できません。'; + + $lang->search_target_list = array( + 'filename' => 'ファイル名', + 'filesize' => 'ファイルサイズ((Byte以上)', + 'download_count' => 'ダウンロード数(以上)', + 'regdate' => '登録日', + 'ipaddress' => 'IPアドレス', + ); +?> diff --git a/modules/file/lang/ko.lang.php b/modules/file/lang/ko.lang.php new file mode 100644 index 000000000..8b469a8bf --- /dev/null +++ b/modules/file/lang/ko.lang.php @@ -0,0 +1,39 @@ + + * @brief 첨부파일(file) 모듈의 기본 언어팩 + **/ + + $lang->file = '첨부파일'; + $lang->file_name = '파일이름'; + $lang->file_size = '파일크기'; + $lang->download_count = '다운로드 받은 수'; + $lang->status = '상태'; + $lang->is_valid = '유효'; + $lang->is_stand_by = '대기'; + $lang->file_list = '첨부 파일 목록'; + $lang->allowed_filesize = '파일 제한 크기'; + $lang->allowed_attach_size = '문서 첨부 제한'; + $lang->allowed_filetypes = '허용 확장자'; + + $lang->about_allowed_filesize = '하나의 파일에 대해 최고 용량을 지정할 수 있습니다. (관리자는 제외)'; + $lang->about_allowed_attach_size = '하나의 문서에 첨부할 수 있는 최고 용량을 지정할 수 있습니다. (관리자는 제외)'; + $lang->about_allowed_filetypes = '허용한 확장자만 첨부할 수 있습니다. "*.확장자"로 지정할 수 있고 ";" 으로 여러개 지정이 가능합니다.
ex) *.* or *.jpg;*.gif;
(관리자는 제외)'; + + $lang->cmd_delete_checked_file = '선택항목 삭제'; + $lang->cmd_move_to_document = '문서로 이동'; + $lang->cmd_download = '다운로드'; + + $lang->msg_cart_is_null = '삭제할 파일을 선택해주세요'; + $lang->msg_checked_file_is_deleted = '%d개의 첨부파일이 삭제되었습니다'; + $lang->msg_exceeds_limit_size = '허용된 용량을 초과하여 첨부가 되지 않았습니다'; + + $lang->search_target_list = array( + 'filename' => '파일이름', + 'filesize' => '파일크기 (byte, 이상)', + 'download_count' => '다운로드 회수 (이상)', + 'regdate' => '등록일', + 'ipaddress' => 'IP 주소', + ); +?> diff --git a/modules/file/lang/zh-CN.lang.php b/modules/file/lang/zh-CN.lang.php new file mode 100644 index 000000000..4c2bf3c68 --- /dev/null +++ b/modules/file/lang/zh-CN.lang.php @@ -0,0 +1,39 @@ + + * @brief 附件(file) 模块语言包 + **/ + + $lang->file = '附件'; + $lang->file_name = '文件名'; + $lang->file_size = '文件大小'; + $lang->download_count = '下载次数'; + $lang->status = '状态'; + $lang->is_valid = '有效'; + $lang->is_stand_by = '等待'; + $lang->file_list = '附件目录'; + $lang->allowed_filesize = '文件大小限制'; + $lang->allowed_attach_size = '上传限制'; + $lang->allowed_filetypes = '可用扩展名'; + + $lang->about_allowed_filesize = '最大单个上传文件大小(管理员不受此限制)。'; + $lang->about_allowed_attach_size = '每个主题最大上传文件大小(管理员不受此限制)。'; + $lang->about_allowed_filetypes = '只允许上传指定的扩展名。 可以用"*.扩展名"来指定或用 ";"来 区分多个扩展名
例) *.* or *.jpg;*.gif;
(管理员不受此限制)'; + + $lang->cmd_delete_checked_file = '删除所选项目'; + $lang->cmd_move_to_document = '查看源主题'; + $lang->cmd_download = '下载'; + + $lang->msg_cart_is_null = ' 请选择要删除的文件。'; + $lang->msg_checked_file_is_deleted = '已删除%d个文件!'; + $lang->msg_exceeds_limit_size = '已超过系统指定的上传文件大小!'; + + $lang->search_target_list = array( + 'filename' => '文件名', + 'filesize' => '文件大小 (byte, 以上)', + 'download_count' => '下载次数 (以上)', + 'regdate' => '登录日期', + 'ipaddress' => 'IP地址', + ); +?> diff --git a/modules/file/queries/deleteFile.xml b/modules/file/queries/deleteFile.xml new file mode 100644 index 000000000..b22194d02 --- /dev/null +++ b/modules/file/queries/deleteFile.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/file/queries/deleteFiles.xml b/modules/file/queries/deleteFiles.xml new file mode 100644 index 000000000..0009c60e0 --- /dev/null +++ b/modules/file/queries/deleteFiles.xml @@ -0,0 +1,8 @@ + + +
+ + + + + diff --git a/modules/file/queries/deleteModuleFiles.xml b/modules/file/queries/deleteModuleFiles.xml new file mode 100644 index 000000000..51db94553 --- /dev/null +++ b/modules/file/queries/deleteModuleFiles.xml @@ -0,0 +1,8 @@ + + +
+ + + + + diff --git a/modules/file/queries/getAttachedFileSize.xml b/modules/file/queries/getAttachedFileSize.xml new file mode 100644 index 000000000..24db91bb6 --- /dev/null +++ b/modules/file/queries/getAttachedFileSize.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/file/queries/getFile.xml b/modules/file/queries/getFile.xml new file mode 100644 index 000000000..b8a93ca07 --- /dev/null +++ b/modules/file/queries/getFile.xml @@ -0,0 +1,8 @@ + + +
+ + + + + diff --git a/modules/file/queries/getFileList.xml b/modules/file/queries/getFileList.xml new file mode 100644 index 000000000..fc58f0e21 --- /dev/null +++ b/modules/file/queries/getFileList.xml @@ -0,0 +1,25 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/file/queries/getFiles.xml b/modules/file/queries/getFiles.xml new file mode 100644 index 000000000..66ef5e905 --- /dev/null +++ b/modules/file/queries/getFiles.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/file/queries/getFilesCount.xml b/modules/file/queries/getFilesCount.xml new file mode 100644 index 000000000..89b9cd674 --- /dev/null +++ b/modules/file/queries/getFilesCount.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/file/queries/getOneFileInDocument.xml b/modules/file/queries/getOneFileInDocument.xml new file mode 100644 index 000000000..9423538d9 --- /dev/null +++ b/modules/file/queries/getOneFileInDocument.xml @@ -0,0 +1,20 @@ + + +
+ + + + + + + + + + + + + + + + + diff --git a/modules/file/queries/insertFile.xml b/modules/file/queries/insertFile.xml new file mode 100644 index 000000000..9d846a3e3 --- /dev/null +++ b/modules/file/queries/insertFile.xml @@ -0,0 +1,20 @@ + + +
+ + + + + + + + + + + + + + + + + diff --git a/modules/file/queries/updateFile.xml b/modules/file/queries/updateFile.xml new file mode 100644 index 000000000..a52a3cad5 --- /dev/null +++ b/modules/file/queries/updateFile.xml @@ -0,0 +1,15 @@ + + +
+ + + + + + + + + + + + diff --git a/modules/file/queries/updateFileDownloadCount.xml b/modules/file/queries/updateFileDownloadCount.xml new file mode 100644 index 000000000..ba8c82a23 --- /dev/null +++ b/modules/file/queries/updateFileDownloadCount.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/file/queries/updateFileValid.xml b/modules/file/queries/updateFileValid.xml new file mode 100644 index 000000000..86bcddff6 --- /dev/null +++ b/modules/file/queries/updateFileValid.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/file/schemas/files.xml b/modules/file/schemas/files.xml new file mode 100644 index 000000000..252b8931f --- /dev/null +++ b/modules/file/schemas/files.xml @@ -0,0 +1,16 @@ +
+ + + + + + + + + + + + + + +
diff --git a/modules/file/tpl/file_config.html b/modules/file/tpl/file_config.html new file mode 100644 index 000000000..18e592da6 --- /dev/null +++ b/modules/file/tpl/file_config.html @@ -0,0 +1,34 @@ + + + +
+ + + + + + + + + + + + + +
{$lang->allowed_filesize} + MB +

{$lang->about_allowed_filesize}

+
{$lang->allowed_attach_size} + MB + / {ini_get('upload_max_filesize')} +

{$lang->about_allowed_attach_size}

+
{$lang->allowed_filetypes} + +

{$lang->about_allowed_filetypes}

+
+ + +
+ +
+
diff --git a/modules/file/tpl/file_list.html b/modules/file/tpl/file_list.html new file mode 100644 index 000000000..99eb52f79 --- /dev/null +++ b/modules/file/tpl/file_list.html @@ -0,0 +1,104 @@ + + + + +
+ Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)} +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->no} +
+ GO +
+
{$lang->file_name}{$lang->file_size}{$lang->is_valid}{$lang->download_count}{$lang->date}{$lang->ipaddress}{$lang->cmd_move_to_document}
{$no}{$module_list[$val->module_srl]->browser_title}{htmlspecialchars($val->source_filename)}{$val->file_size} + + {$lang->is_valid} + + {$lang->is_stand_by} + + {$val->download_count}{zdate($val->regdate,"Y-m-d")}{$val->ipaddress}{$lang->cmd_move}
+ + +
+ +
+ +
+ + + + + +
+ + + + +
+ + + + + + {$lang->cmd_cancel} +
+
diff --git a/modules/file/tpl/filter/delete_checked.xml b/modules/file/tpl/filter/delete_checked.xml new file mode 100644 index 000000000..a962e5994 --- /dev/null +++ b/modules/file/tpl/filter/delete_checked.xml @@ -0,0 +1,12 @@ + +
+ + + + + + + + + +
diff --git a/modules/file/tpl/filter/insert_config.xml b/modules/file/tpl/filter/insert_config.xml new file mode 100644 index 000000000..205c29d4f --- /dev/null +++ b/modules/file/tpl/filter/insert_config.xml @@ -0,0 +1,7 @@ + +
+ + + + + diff --git a/modules/file/tpl/header.html b/modules/file/tpl/header.html new file mode 100644 index 000000000..edc39244a --- /dev/null +++ b/modules/file/tpl/header.html @@ -0,0 +1,10 @@ + + +

{$lang->file} {$lang->cmd_management}

+ +
+ +
diff --git a/modules/file/tpl/js/file_admin.js b/modules/file/tpl/js/file_admin.js new file mode 100644 index 000000000..92eff1785 --- /dev/null +++ b/modules/file/tpl/js/file_admin.js @@ -0,0 +1,6 @@ +function doCheckAll() { + var fo_obj = xGetElementById('fo_list'); + for(var i=0;i + parent.editor_upload_clear_list("{$upload_target_srl}"); + + + parent.editor_insert_uploaded_file({$upload_target_srl}, {$file_info->file_srl}, "{$file_info->source_filename}", "{$file_info->file_size}", "{FileHandler::filesize($file_info->file_size)}", "{$file_info->uploaded_filename}", "{$file_info->sid}"); + + + parent.xInnerHtml("uploader_status_{$upload_target_srl}", '{$upload_status}'); + diff --git a/modules/guestbook/conf/info.xml b/modules/guestbook/conf/info.xml new file mode 100644 index 000000000..4a788496b --- /dev/null +++ b/modules/guestbook/conf/info.xml @@ -0,0 +1,17 @@ + + + 방명록 + ゲストブック + Guest Book + 留言本 + + 제로 + Zero + zero + zero + 모듈 제작을 위해 sample로 제작된 모듈입니다. + モジュール作成のためのサンプルで作成されたモジュールです。 + This is a sample module for creating modules. + 留言本sample模块。 + + diff --git a/modules/guestbook/conf/module.xml b/modules/guestbook/conf/module.xml new file mode 100644 index 000000000..7d9c6d15a --- /dev/null +++ b/modules/guestbook/conf/module.xml @@ -0,0 +1,47 @@ + + + + + 글 작성 + 发表新帖 + 書き込み作成 + + + 댓글 작성 + 发表评论 + コメント作成 + + + 관리 + 管理 + 管理 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/guestbook/guestbook.admin.controller.php b/modules/guestbook/guestbook.admin.controller.php new file mode 100644 index 000000000..780558fc7 --- /dev/null +++ b/modules/guestbook/guestbook.admin.controller.php @@ -0,0 +1,247 @@ +module = 'guestbook'; + + // mid값을 직접 받지 않고 guestbook_name으로 받는 이유는 mid는 특별히 약속된 변수명이라 오동작이 발생할 수 있어서 다른 이름으로 전달을 받은후 다시 바꾸어준다. + $args->mid = $args->guestbook_name; + unset($args->guestbook_name); + + // is_default일 경우 별다른 요청이 없는 index페이지의 경우 바로 호출이 되는데 이 값을 설정을 하게 된다. + if($args->is_default!='Y') $args->is_default = 'N'; + + // 기본 값외의 것들을 정리 + $extra_var = delObjectVars(Context::getRequestVars(), $args); + unset($extra_var->act); + unset($extra_var->page); + unset($extra_var->guestbook_name); + + // module_srl이 넘어오면 원 모듈이 있는지 확인 + if($args->module_srl) { + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl); + + // 만약 원래 모듈이 없으면 새로 입력하기 위한 처리 + if($module_info->module_srl != $args->module_srl) unset($args->module_srl); + } + + // $extra_var를 serialize + $args->extra_vars = serialize($extra_var); + + // module 모듈의 controller 객체 생성 + $oModuleController = &getController('module'); + + // is_default=='Y' 이면 + if($args->is_default=='Y') $oModuleController->clearDefaultModule(); + + /** + * module_srl값이 없다면 신규 등록으로 처리를 한다. + **/ + if(!$args->module_srl) { + // module controller를 이용하여 모듈을 생성한다. + $output = $oModuleController->insertModule($args); + $msg_code = 'success_registed'; + + // 권한의 경우 기본으로 설정을 해주는 것이 좋으며 방명록 모듈의 경우 manager권한을 관리 그룹으로 설정을 한다. + if($output->toBool()) { + // 관리그룹을 member model객체에서 구할 수 있다. + $oMemberModel = &getModel('member'); + $admin_group = $oMemberModel->getAdminGroup(); + $admin_group_srl = $admin_group->group_srl; + + $module_srl = $output->get('module_srl'); + $grants = serialize(array('manager'=>array($admin_group_srl))); + + // module controller의 module 권한 설정 method를 이용하여 기본 권한을 적용한다. + $oModuleController->updateModuleGrant($module_srl, $grants); + } + /** + * module_srl이 있다면 모듈의 정보를 수정한다 + **/ + } else { + $output = $oModuleController->updateModule($args); + $msg_code = 'success_updated'; + } + + // 결과값에 오류가 있을 경우 그대로 객체 리턴. + if(!$output->toBool()) return $output; + + // 등록후 페이지 이동을 위해 변수 설정 및 메세지를 설정한다. + $this->add('page',Context::get('page')); + $this->add('module_srl',$output->get('module_srl')); + $this->setMessage($msg_code); + } + + /** + * @brief 방명록 삭제 + **/ + function procGuestbookAdminDeleteGuestbook() { + // 삭제할 대상 방명록의 module_srl을 구한다. + $module_srl = Context::get('module_srl'); + + // 원본을 구해온다 + $oModuleController = &getController('module'); + $output = $oModuleController->deleteModule($module_srl); + + // 삭제 처리시 오류가 발생하면 결과 객체를 바로 리턴한다. + if(!$output->toBool()) return $output; + + // 등록후 페이지 이동을 위해 변수 설정 및 메세지를 설정한다. + $this->add('module','guestbook'); + $this->add('page',Context::get('page')); + $this->setMessage('success_deleted'); + } + + /** + * @brief 권한 설정 + * 생성된 방명록에 ./conf/module.xml에 정의된 권한과 관리자가 선택한 그룹의 값을 연동하여 권한을 설정하게 된다. + **/ + function procGuestbookAdminInsertGrant() { + // 대상 방명록(모듈)의 고유값인 module_srl을 체크한다. + $module_srl = Context::get('module_srl'); + + /** + * 현 모듈의 권한 목록을 가져옴 + * xml_info 는 guestbook모듈이 요청되었다고 판단될때 ModuleObject에서 이미 세팅해 놓은 상태이다. + **/ + $grant_list = $this->xml_info->grant; + + /** + * 권한의 목록을 loop로 돌면서 권한 설정을 한다. + * zbxe의 경우 가능한 간단한 xmlrpc사용을 위해서 배열의 경우 |@|를 pipe로 하여 하나의 string으로 전달한다. + * 요청받은 권한의 대상 그룹과 권한을 배열로 한 후 serialize하여 modules테이블에 module_srl을 키로 한 rows에 데이터를 적용한다. + **/ + if(count($grant_list)) { + foreach($grant_list as $key => $val) { + $group_srls = Context::get($key); + if($group_srls) $arr_grant[$key] = explode('|@|',$group_srls); + } + $grants = serialize($arr_grant); + } + + // 권한 설정은 모듈 공통이라 module 모듈의 controller을 생성하여 저장하도록 한다. + $oModuleController = &getController('module'); + $oModuleController->updateModuleGrant($module_srl, $grants); + + // 권한 설정후 돌아갈 페이지를 위하여 module_srl값을 세팅하고 성공 메세지 역시 세팅한다. + $this->add('module_srl',Context::get('module_srl')); + $this->setMessage('success_registed'); + } + + /** + * @brief 스킨 정보 업데이트 + * 스킨 정보는 skin.xml파일의 extra_vars와 입력된 변수값을 조합하여 serialize하여 modules 테이블에 module_srl을 키로 하여 저장을 하게 된다. + **/ + function procGuestbookAdminUpdateSkinInfo() { + // module_srl에 해당하는 정보들을 가져오기 + $module_srl = Context::get('module_srl'); + + // 어떤 스킨이 사용중인지 확인하기 위해서 module_srl을 이용하여 모듈의 정보를 구하고 스킨을 구한다. + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + $skin = $module_info->skin; + + // 스킨의 정보르 구해옴 (extra_vars를 체크하기 위해서) + $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin); + + // 입력받은 변수들을 체크 (mo, act, module_srl, page등 기본적인 변수들 없앰) + $obj = Context::getRequestVars(); + unset($obj->act); + unset($obj->module_srl); + unset($obj->page); + + // 원 skin_info에서 extra_vars의 type이 image일 경우 별도 처리를 해줌 + if($skin_info->extra_vars) { + foreach($skin_info->extra_vars as $vars) { + if($vars->type!='image') continue; + + $image_obj = $obj->{$vars->name}; + + // 삭제 요청에 대한 변수를 구함 + $del_var = $obj->{"del_".$vars->name}; + unset($obj->{"del_".$vars->name}); + if($del_var == 'Y') { + @unlink($module_info->{$vars->name}); + continue; + } + + // 업로드 되지 않았다면 이전 데이터를 그대로 사용 + if(!$image_obj['tmp_name']) { + $obj->{$vars->name} = $module_info->{$vars->name}; + continue; + } + + // 정상적으로 업로드된 파일이 아니면 무시 + if(!is_uploaded_file($image_obj['tmp_name'])) { + unset($obj->{$vars->name}); + continue; + } + + // 이미지 파일이 아니어도 무시 + if(!eregi("\.(jpg|jpeg|gif|png)$", $image_obj['name'])) { + unset($obj->{$vars->name}); + continue; + } + + // 경로를 정해서 업로드 + $path = sprintf("./files/attach/images/%s/", $module_srl); + + // 디렉토리 생성 + if(!FileHandler::makeDir($path)) return false; + + $filename = $path.$image_obj['name']; + + // 파일 이동 + if(!move_uploaded_file($image_obj['tmp_name'], $filename)) { + unset($obj->{$vars->name}); + continue; + } + + // 변수를 바꿈 + unset($obj->{$vars->name}); + $obj->{$vars->name} = $filename; + } + } + + // serialize하여 저장 + $skin_vars = serialize($obj); + + // module controller객체를 생성하여 module_srl을 키로 한 rows에 serialize한 스킨 정보를 적용한다. + $oModuleController = &getController('module'); + $oModuleController->updateModuleSkinVars($module_srl, $skin_vars); + + /** + * 스킨 정보는 첨부파일때문에 xml로 전달이 되지 않고 POST로 전송이 되어 왔으므로 템플릿을 이용하여 프레임을 refresh시키도록 한다. + * 스킨 정보를 수정할때 숨어 있는 iframe을 target으로 삼기에 기본 레이아웃을 이용하면 되므로 직접 레이아웃 경로와 파일을 기본으로 지정한다. + **/ + $this->setLayoutPath('./common/tpl'); + $this->setLayoutFile('default_layout.html'); + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile("top_refresh.html"); + } + } +?> diff --git a/modules/guestbook/guestbook.admin.view.php b/modules/guestbook/guestbook.admin.view.php new file mode 100644 index 000000000..e39de281b --- /dev/null +++ b/modules/guestbook/guestbook.admin.view.php @@ -0,0 +1,185 @@ +module_srl) { + $module_srl = $this->module_srl; + Context::set('module_srl', $module_srl); + } + + // module info를 구하기 위해 module model 객체 생성 + $oModuleModel = &getModel('module'); + + // module_srl이 있다면 요청된 모듈의 정보를 미리 구해 놓음 + if($module_srl) { + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + if(!$module_info) { + Context::set('module_srl',''); + $this->act = 'list'; + } else { + $this->module_info = $module_info; + Context::set('module_info',$module_info); + } + } + + // 템플릿 경로 지정, 관리자 페이지를 위한 템플릿은 별도의 스킨 기능이 없이 ./modules/모듈/tpl/ 에 위치해 놓기에 바로 지정을 해 놓는다. + $template_path = sprintf("%stpl/",$this->module_path); + $this->setTemplatePath($template_path); + } + + /** + * @brief 생성된 방명록들의 목록을 보여줌 + * guestbook이라는 module명으로 등록된 모듈을 구하기 위해서 몇가지 설정을 한 후에 쿼리를 수행한다. + * 쿼리수행은 executeQuery(모듈명.쿼리아이디, 인자변수) 로 하게 되며 이 쿼리아이디에 해당하는 xml파일은 모듈의 queries디렉토리에 지정이 되어 있다. + * + * 이 특정 module의 목록은 module model객체에서 구할 수 있지만 검색등의 각 모듈마다 다른 조건 때문에 각 모듈별로 쿼리를 생성해 놓는다. + * 모든 모듈의 결과물(mid)는 modules 테이블에 저장이 된다. + **/ + function dispGuestbookAdminContent() { + $args->sort_index = "module_srl"; ///< 정렬 순서는 모듈의 sequence값으로 하고 정렬은 역순. 즉 생성된 순으로 한다. + $args->page = Context::get('page'); ///< 현재 페이지를 설정 + $args->list_count = 40; ///< 한페이지에 40개씩 보여주기로 고정. + $args->page_count = 10; ///< 페이지의 수는 10개로 제한. + $args->s_module_category_srl = Context::get('module_category_srl'); ///< 모듈분류값을 인자로 추가 + $output = executeQuery('guestbook.getGuestbookList', $args); ///< guestbook.getGuesbookList 쿼리 실행 (./modules/guestbook/query/getGuestbookList.xml) + + /** + * 템플릿에 쓰기 위해서 context::set + * xml query에 navigation이 있고 list_count가 정의되어 있으면 결과 변수에 아래 5가지의 값이 세팅이 된다. + **/ + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('guestbook_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + // 템플릿 파일 지정 (./modules/guestbook/tpl/index.html파일이 지정이 됨) + $this->setTemplateFile('index'); + } + + /** + * @brief 선택된 방명록의 정보 출력 + **/ + function dispGuestbookAdminGuestbookInfo() { + // module_srl 값이 없다면 그냥 index 페이지를 보여줌 + if(!Context::get('module_srl')) return $this->dispGuestbookAdminContent(); + + // 레이아웃이 정해져 있다면 레이아웃 정보를 추가해줌(layout_title, layout) + if($this->module_info->layout_srl) { + $oLayoutModel = &getModel('layout'); + $layout_info = $oLayoutModel->getLayout($this->module_info->layout_srl); + $this->module_info->layout = $layout_info->layout; + $this->module_info->layout_title = $layout_info->layout_title; + } + + // 정해진 스킨이 있으면 해당 스킨의 정보를 구함 + if($this->module_info->skin) { + $oModuleModel = &getModel('module'); + $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $this->module_info->skin); + $this->module_info->skin_title = $skin_info->title; + } + + // 템플릿 파일 지정 + $this->setTemplateFile('guestbook_info'); + } + + /** + * @brief 방명록 설정 폼 출력 + **/ + function dispGuestbookAdminInsertGuestbook() { + // 스킨 목록을 구해옴 + $oModuleModel = &getModel('module'); + $skin_list = $oModuleModel->getSkins($this->module_path); + Context::set('skin_list',$skin_list); + + // 레이아웃 목록을 구해옴 + $oLayoutMode = &getModel('layout'); + $layout_list = $oLayoutMode->getLayoutList(); + Context::set('layout_list', $layout_list); + + // 템플릿 파일 지정 + $this->setTemplateFile('guestbook_insert'); + } + + /** + * @brief 방명록 삭제 화면 출력 + **/ + function dispGuestbookAdminDeleteGuestbook() { + if(!Context::get('module_srl')) return $this->dispGuestbookAdminContent(); + + $module_info = Context::get('module_info'); + + // 해당 방명록에 입력된 전체 글의 갯수를 보여줌 (혹시 삭제 실수를 방지하기 위해서) + $oDocumentModel = &getModel('document'); + $document_count = $oDocumentModel->getDocumentCount($module_info->module_srl); + $module_info->document_count = $document_count; + + Context::set('module_info',$module_info); + + // 템플릿 파일 지정 + $this->setTemplateFile('guestbook_delete'); + } + + /** + * @brief 스킨 정보 보여줌 + **/ + function dispGuestbookAdminSkinInfo() { + + // 현재 선택된 모듈의 스킨의 정보 xml 파일을 읽음 + $module_info = Context::get('module_info'); + $skin = $module_info->skin; + + $oModuleModel = &getModel('module'); + $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin); + + // skin_info에 extra_vars 값을 지정 + if(count($skin_info->extra_vars)) { + foreach($skin_info->extra_vars as $key => $val) { + $name = $val->name; + $type = $val->type; + $value = $module_info->{$name}; + if($type=="checkbox"&&!$value) $value = array(); + $skin_info->extra_vars[$key]->value= $value; + } + } + + Context::set('skin_info', $skin_info); + $this->setTemplateFile('skin_info'); + } + + /** + * @brief 권한 목록 출력 + **/ + function dispGuestbookAdminGrantInfo() { + // module_srl을 구함 + $module_srl = Context::get('module_srl'); + + // module.xml에서 권한 관련 목록을 구해옴 + $grant_list = $this->xml_info->grant; + Context::set('grant_list', $grant_list); + + // 권한 그룹의 목록을 가져온다 + $oMemberModel = &getModel('member'); + $group_list = $oMemberModel->getGroups(); + Context::set('group_list', $group_list); + + $this->setTemplateFile('grant_list'); + } + } +?> diff --git a/modules/guestbook/guestbook.class.php b/modules/guestbook/guestbook.class.php new file mode 100644 index 000000000..2e0f47e7f --- /dev/null +++ b/modules/guestbook/guestbook.class.php @@ -0,0 +1,59 @@ +insertActionForward('guestbook', 'view', 'dispGuestbookAdminContent'); + $oModuleController->insertActionForward('guestbook', 'view', 'dispGuestbookAdminGuestbookInfo'); + $oModuleController->insertActionForward('guestbook', 'view', 'dispGuestbookAdminInsertGuestbook'); + $oModuleController->insertActionForward('guestbook', 'view', 'dispGuestbookAdminDeleteGuestbook'); + $oModuleController->insertActionForward('guestbook', 'view', 'dispGuestbookAdminSkinInfo'); + $oModuleController->insertActionForward('guestbook', 'view', 'dispGuestbookAdminGrantInfo'); + $oModuleController->insertActionForward('guestbook', 'controller', 'procGuestbookAdminUpdateSkinInfo'); + + + // Object 클래스의 객체는 기본적으로 성공(error=0)으로 되어 있고 이 값을 return함으로써 ModuleHandler등에서 오류 유무를 파악할 수 있다. + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + * 설치시 필수 체크 부분이 있다면 검토하는 코드를 추가할 수 있다. + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + * 설치시 이상이 있으면 이 moduleUpdate() 메쏘드를 이용하여 업데이트 구문을 실행할수 있다. + **/ + function moduleUpdate() { + return new Object(); + } + + } +?> diff --git a/modules/guestbook/guestbook.controller.php b/modules/guestbook/guestbook.controller.php new file mode 100644 index 000000000..8e6082d61 --- /dev/null +++ b/modules/guestbook/guestbook.controller.php @@ -0,0 +1,246 @@ +grant->write_document) return new Object(-1, 'msg_not_permitted'); + + /** + * 글작성시 필요한 변수를 세팅한다. + * 일단 Context::getReuqestVars()를 통해 모든 입력된 변수값을 가져온다. + * 글 작성은 document controller를 이용하여 정리된 변수를 넘겨줌으로서 동작이 된다. + **/ + $obj = Context::getRequestVars(); + + // 현재 방명록의 module_srl값을 구해와서 세팅한다. + $obj->module_srl = $this->module_srl; + + // 공지사항 지정 변수값인 is_notice가 Y가 아니거나 관리자가 아니라면 공지사항은 무조건 N로 세팅한다. + if($obj->is_notice!='Y'||!$this->grant->manager) $obj->is_notice = 'N'; + + /** + * 문서의 신규 입력인지 수정인지에 대한 체크를 하기 위해서 document model을 통해 원본 문서가 있는지 확인하는 절차를 거쳐야 한다. + **/ + $oDocumentModel = &getModel('document'); + + // document module의 controller 객체 생성 + $oDocumentController = &getController('document'); + + // 문서객체를 구해온다. + $oDocument = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager); + + /** + * 제목은 document모델에서는 필수 요건이다. + * 방명록에서는 제목이 필요 없어서 본문의 내용중 앞 10자리의 글자를 잘라서 제목으로 강제 적용한다. + **/ + $obj->title = cut_str($obj->content,10,'...'); + + /** + * 이미 존재하는 글일 경우 수정을 한다. + * 글 수정은 document controller의 updateDocument() method를 이용한다. + * 결과메세지를 일단 강제로 정의 해 놓는다. + **/ + if($oDocument->isExists() && $oDocument->document_srl == $obj->document_srl) { + $output = $oDocumentController->updateDocument($oDocument, $obj); + $msg_code = 'success_updated'; + + /** + * 존재하지 않는다고 판단이 되면 신규글 입력을 한다. + * 신규글 입력은 document controller의 inesrtDocument() method를 이용한다. + * 결과메세지를 일단 강제로 정의 해 놓는다. + **/ + } else { + $obj->document_srl = getNextSequence(); + $output = $oDocumentController->insertDocument($obj); + $msg_code = 'success_registed'; + } + + /** + * updateDocument(), insertDocument()에서 오류가 발생하였으면 리턴받은 객체 자체를 바로 돌려준다. + * 이 object객체는 error, message등의 내부 변수를 이용하여 에러 발생 유무와 에러 메세지를 가지고 있다. + **/ + if(!$output->toBool()) return $output; + + /** + * 결과를 리턴하기 위해서 mid, document_srl값을 세팅을 한다. + * controller의 경우 대부분 xml로 요청을 받고 xml로 return을 하게 된다. + * $this->add(key, value)로 세팅된 값들은 결과 xml에서 사용이 된다. + * 이 값들은 javascript에서 xml handler를 통해서 사용이 가능하게 되고 보통 url조합을 할때 사용이 된다. + **/ + $this->add('mid', Context::get('mid')); + $this->add('document_srl', $output->get('document_srl')); + + /** + * 성공 메세지 등록 + * setMessage($message)는 xml에 지정이 되고 이 message는 javascript에서 alert()를 시키게 된다. + **/ + $this->setMessage($msg_code); + } + + /** + * @brief 문서 삭제 + **/ + function procGuestbookDeleteDocument() { + // 문서 번호 확인 + $document_srl = Context::get('document_srl'); + + // 문서 번호가 없다면 오류 발생 + if(!$document_srl) return $this->doError('msg_invalid_document'); + + // document module model 객체 생성 + $oDocumentController = &getController('document'); + + // 삭제 시도 + $output = $oDocumentController->deleteDocument($document_srl, $this->grant->manager); + + // 삭제시 실패하였을 경우 리턴받은 객체를 그대로 리턴. + if(!$output->toBool()) return $output; + + // 성공 메세지 등록 + $this->add('mid', Context::get('mid')); + $this->add('page', $output->get('page')); + $this->setMessage('success_deleted'); + } + + /** + * @brief 댓글 추가 + **/ + function procGuestbookInsertComment() { + // 권한 체크 + if(!$this->grant->write_comment) return new Object(-1, 'msg_not_permitted'); + + // 댓글 입력에 필요한 데이터 추출 + $obj = Context::gets('document_srl','comment_srl','parent_srl','content','password','nick_name','nick_name','member_srl','email_address','homepage'); + $obj->module_srl = $this->module_srl; + + // comment 모듈의 model 객체 생성 + $oCommentModel = &getModel('comment'); + + // comment 모듈의 controller 객체 생성 + $oCommentController = &getController('comment'); + + /** + * 게시판이나 블로그와 달리 방명록의 댓글은 textarea를 그대로 사용한다. + * 따라서 줄바꾸임나 태그제거등의 작업을 해주어야 함 + **/ + $obj->content = nl2br(strip_tags($obj->content)); + + /** + * 존재하는 댓글인지를 확인하여 존재 하지 않는 댓글이라면 신규로 등록하기 위해서 comment_srl의 sequence값을 받는다 + **/ + if(!$obj->comment_srl) { + $obj->comment_srl = getNextSequence(); + } else { + $comment = $oCommentModel->getComment($obj->comment_srl, $this->grant->manager); + } + + // comment_srl이 없을 경우 신규 입력 + if($comment->comment_srl != $obj->comment_srl) { + + // parent_srl이 있으면 답변으로 + if($obj->parent_srl) { + $parent_comment = $oCommentModel->getComment($obj->parent_srl); + if(!$parent_comment->comment_srl) return new Object(-1, 'msg_invalid_request'); + + $output = $oCommentController->insertComment($obj); + + // 없으면 신규 + } else { + $output = $oCommentController->insertComment($obj); + } + + // comment_srl이 있으면 수정으로 + } else { + $obj->parent_srl = $comment->parent_srl; + $output = $oCommentController->updateComment($obj, $this->grant->manager); + $comment_srl = $obj->comment_srl; + } + + // 오류 발생시 객체 그대로 리턴. + if(!$output->toBool()) return $output; + + // 댓글 입력후 페이지 이동을 위한 변수 및 메세지를 설정한다. + $this->add('mid', Context::get('mid')); + $this->add('document_srl', $obj->document_srl); + $this->add('comment_srl', $obj->comment_srl); + + $this->setMessage('success_registed'); + } + + /** + * @brief 댓글 삭제 + **/ + function procGuestbookDeleteComment() { + // 댓글 번호 확인 + $comment_srl = Context::get('comment_srl'); + if(!$comment_srl) return $this->doError('msg_invalid_request'); + + // comment 모듈의 controller 객체 생성 + $oCommentController = &getController('comment'); + $output = $oCommentController->deleteComment($comment_srl, $this->grant->manager); + + // 오류 발생시 객체 그대로 리턴. + if(!$output->toBool()) return $output; + + // 댓글 입력후 페이지 이동을 위한 변수 및 메세지를 설정한다. + $this->setMessage('success_deleted'); + $this->add('mid', Context::get('mid')); + $this->add('page', Context::get('page')); + $this->add('document_srl', $output->get('document_srl')); + } + + /** + * @brief 문서와 댓글의 비밀번호를 확인 + * 비밀번호와 문서 혹은 댓글의 비밀번호를 비교하여 이상이 없다면 해당 문서 또는 댓글에 권한을 부여한다. + * 이 권한은 세션에 저장이 되어 차후 다시 수정등을 할 경우 비밀번호 검사를 하지 않게 된다. + **/ + function procGuestbookVerificationPassword() { + // 비밀번호와 문서 번호를 받음 + $password = md5(Context::get('password')); + + $document_srl = Context::get('document_srl'); + $comment_srl = Context::get('comment_srl'); + + // comment_srl이 있을 경우 댓글이 대상 + if($comment_srl) { + // 문서번호에 해당하는 글이 있는지 확인 + $oCommentModel = &getModel('comment'); + $data = $oCommentModel->getComment($comment_srl); + if(!$data) return new Object(-1, 'msg_invalid_request'); + + // 문서의 비밀번호와 입력한 비밀번호의 비교 + if($data->password != $password) return new Object(-1, 'msg_invalid_password'); + + $oCommentController = &getController('comment'); + $oCommentController->addGrant($comment_srl); + } else { + // 문서번호에 해당하는 글이 있는지 확인 + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + if(!$oDocument->isExists()) return new Object(-1, 'msg_invalid_request'); + + // 문서의 비밀번호와 입력한 비밀번호의 비교 + if($oDocument->get('password') != $password) return new Object(-1, 'msg_invalid_password'); + + $oDocument->setGrant(); + } + } + + } +?> diff --git a/modules/guestbook/guestbook.view.php b/modules/guestbook/guestbook.view.php new file mode 100644 index 000000000..f89565c4e --- /dev/null +++ b/modules/guestbook/guestbook.view.php @@ -0,0 +1,328 @@ +module_srl) Context::set('module_srl',$this->module_srl); + + /** + * 현재 방명록 모듈의 정보를 module_info라는 이름으로 템플릿에서 사용할 수 있게 하기 위해 세팅한다 + **/ + Context::set('module_info',$this->module_info); + + /** + * 스킨 정보에서 받는 목록수나 페이지수를 미리 선언해 놓는다 + **/ + $this->list_count = $this->module_info->list_count?$this->module_info->list_count:20; + $this->page_count = $this->module_info->page_count?$this->module_info->page_count:10; + + /** + * 모듈정보에서 넘어오는 skin값을 이용하여 최종 출력할 템플릿의 위치를 출력한다. + * $this->module_path는 ./modules/guestbook/의 값을 가지고 있다 + **/ + $template_path = sprintf("%sskins/%s/",$this->module_path, $this->module_info->skin); + $this->setTemplatePath($template_path); + + /** + * 방명록 모듈 생성 또는 정보 수정시 open_rss값의 세팅에 따라서 rss_url을 선언해 놓는다. + * 이 rss_url은 ./common/tpl/common_layout.html에서 application/rss+xml의 href로 지정된다 + **/ + if($this->module_info->open_rss != 'N') Context::set('rss_url', getUrl('','mid',$this->mid,'act','rss')); + } + + /** + * @brief 목록 및 입력항목 출력 + **/ + function dispGuestbookContent() { + /** + * 목록 구현에 필요한 변수들을 가져온다 + * 방명록은 기본적으로 page변수만 있으면 된다 + **/ + $page = Context::get('page'); + + $oDocumentModel = &getModel('document'); ///< getModel, getController, getView 함수를 통해서 간단히 원하는 객체를 생성할 수 있다. + + /** + * write_form.html을 목록에서도 include를 하게 되는데 write_form.html의 경우 $oDocument라는 선택된 문서의 객체가 필요하다. + * 목록에서는 수정이 아닌 입력만 있어서 이 $oDocument라는 object를 생성을 해 준다 + **/ + $oDocument = $oDocumentModel->getDocument(0, $this->grant->manager); + Context::set('oDocument', $oDocument); + + /** + * 글 작성 권한이 있다면 글쓰기 에디터를 세팅한다 + * write_document는 ./conf/module.xml에 정의되어 있고 관리페이지에서 권한 그룹을 설정한 값이다. + **/ + if($this->grant->write_document) { + /** + * 에디터에서 사용할 고유 문서 번호를 구해 온다. + * ZBXE에서는 모든 고유값을 getNextSequence() 로 구해 올 수 있고 글쓰기(editor) 모듈은 이 고유번호를 바탕으로 동작을 한다. + **/ + $document_srl = getNextSequence(); + + /** + * editor model객체의 getEditor method를 호출하여 세팅한다. + * 이 때 여러가지 옵션을 지정하여 다른 에디터 코드를 받을 수 있다. + **/ + $oEditorModel = &getModel('editor'); + $option->allow_fileupload = false; ///< 파일 업로드 기능을 제한 + $option->enable_autosave = true; ///< 자동 저장 기능을 활성화 + $option->enable_default_component = true; ///< 기본 에디터 컴포넌트의 활성화 + $option->enable_component = true; ///< 추가 에디터 컴포넌트의 활성화 + $option->resizable = false; ///< 글쓰기 폼의 상하 조절 가능하도록 설정 + $option->height = 200; ///< 에디터의 높이 지정 + $editor = $oEditorModel->getEditor($document_srl, $option); ///< 에디터코드를 받음 + Context::set('editor', $editor); ///< 에디터코드를 editor라는 이름으로 세팅. + } + + /** + * document 모듈을 이용해서 현재 방명록의 module_srl로 목록을 구한다. + * 목록을 구할때 필요한 변수를 $args에 세팅후 document.model객체를 생성하고 getDocumentList() method를 호출한다. + **/ + // 목록을 구하기 위한 옵션 + $args->module_srl = $this->module_srl; ///< 현재 모듈의 module_srl + $args->page = $page; ///< 페이지 + $args->list_count = $this->list_count; ///< 한페이지에 보여줄 글 수 + $args->page_count = $this->page_count; ///< 페이지 네비게이션에 나타날 페이지의 수 + $args->sort_index = 'list_order'; ///< 목록의 정렬 대상 (list_order, 즉 날짜의 역순을 정렬 대상으로 한다) + $args->order_type = 'asc'; ///< 정렬 순서 (list_order는 -1부터 -1되어서 저장되는 값이라 asc로 정렬 순서를 정하면 된다) + + /** + * document model객체를 생성하여 목록을 구한다. + **/ + $output = $oDocumentModel->getDocumentList($args); + + /** + * 템플릿에 쓰기 위해서 document_model::getDocumentList() 의 return object에 있는 값들을 세팅 + * ZBXE에서 목록의 경우 5가지의 값으로 결과를 받는다. + * total_count : 대상의 전체 글 수 + * total_page : 대상의 전체 페이지 수 (list_count, page_count로 계산되어진 값) + * page : 현재 페이지 + * data : 목록 배열 + * page_navigation : 페이지 네비게이션을 출력하기 위한 object + **/ + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('document_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + /** + * 템플릿 파일을 지정한다. + * 이미 template path는 init()에서 정의를 하였다. + **/ + $this->setTemplateFile('list'); + } + + /** + * @brief 글 수정 화면 출력 + **/ + function dispGuestbookModify() { + // 권한 체크 + if(!$this->grant->write_document) return $this->dispGuestbookMessage('msg_not_permitted'); + + // GET parameter에서 document_srl을 가져옴 + $document_srl = Context::get('document_srl'); + + // document 모듈 객체 생성 + $oDocumentModel = &getModel('document'); + + $oDocument = $oDocumentModel->getDocument(0, $this->grant->manager); + $oDocument->setDocument($document_srl); + + if(!$oDocument->isExists()) Context::set('document_srl',''); + + if(!$document_srl) $document_srl = getNextSequence(); + + // 글을 수정하려고 할 경우 권한이 없는 경우 비밀번호 입력화면으로 + if($oDocument->isExists()&&!$oDocument->isGranted()) return $this->setTemplateFile('input_password_form'); + + Context::set('document_srl',$document_srl); + Context::set('oDocument', $oDocument); + + // 에디터 모듈의 getEditor를 호출하여 세팅 + $oEditorModel = &getModel('editor'); + $option->allow_fileupload = $this->grant->fileupload; + $option->enable_autosave = true; + $option->enable_default_component = true; + $option->enable_component = true; + $option->resizable = true; + $option->height = 600; + $editor = $oEditorModel->getEditor($document_srl, $option); + Context::set('editor', $editor); + + $this->setTemplateFile('write_form'); + } + + + /** + * @brief 문서 삭제 화면 출력 + **/ + function dispGuestbookDelete() { + /** + * 권한 체크 + * 글쓰기 권한이 없다면 아예 접근이 불가능하도록 해 버린다. + **/ + if(!$this->grant->write_document) return $this->dispGuestbookMessage('msg_not_permitted'); + + /** + * 삭제할 문서번호를 가져온다 + * 이 문서 번호는 get parmameter에 저장되어 있고 Context 클래스에서 미리 세팅을 해 놓은 상태이다. + **/ + $document_srl = Context::get('document_srl'); + + /** + * 문서 번호가 없으면 잘못된 접근으로 에러 메세지를 출력한다. + **/ + if(!$document_srl) return $this->dispGuestbookMessage('msg_invalid_request'); + + /** + * 문서 번호로 문서객체를 구해온다 + **/ + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + + // 대상 문서가 없으면 에러 + if(!$oDocument->isExists()) return $this->dispGuestbookContent(); + + /** + * 권한을 체크한다. + * 권한 체크는 글쓴 사용자와 현재 로그인한 사용자의 정보가 같거나 최고관리자 일 경우 권한이 있다고 판단하고, + * 그렇지 않은 경우는 비밀번호 입력 폼을 출력한다. + **/ + if(!$oDocument->isGranted()) return $this->setTemplateFile('input_password_form'); + + // 구해진 문서를 context setting하고 delete_form.html 파일을 템플릿 파일로 지정하여 삭제 폼을 출력한다. + Context::set('oDocument',$oDocument); + + // delete_from.html 템플릿 파일의 지정 + $this->setTemplateFile('delete_form'); + } + + /** + * @brief 댓글의 답글 화면 출력 + **/ + function dispGuestbookReplyComment() { + // 댓글 작성 권한을 체크한다. + if(!$this->grant->write_comment) return $this->dispGuestbookMessage('msg_not_permitted'); + + // 댓글의 답글을 출력하기 위해서 문서와 원 댓글의 유효성을 검사하기 위해 변수를 가져온다. + $document_srl = Context::get('document_srl'); + $parent_srl = Context::get('comment_srl'); + + // 지정된 원 댓글이 없다면 오류 + if(!$parent_srl) return new Object(-1, 'msg_invalid_request'); + + // 해당 댓글를 찾아본다 + $oCommentModel = &getModel('comment'); + $source_comment = $oCommentModel->getComment($parent_srl, $this->grant->manager); + + // 댓글이 없다면 오류 + if(!$source_comment) return $this->dispGuestbookMessage('msg_invalid_request'); + + // 필요한 정보들 세팅 + Context::set('document_srl',$document_srl); + Context::set('parent_srl',$parent_srl); + Context::set('comment_srl',NULL); + Context::set('source_comment',$source_comment); + + /** + * comment_form.html 템플릿 파일을 출력할 파일로 지정 + **/ + $this->setTemplateFile('comment_form'); + } + + /** + * @brief 댓글 수정 폼 출력 + **/ + function dispGuestbookModifyComment() { + // 댓글 작성 권한을 체크한다. + if(!$this->grant->write_comment) return $this->dispGuestbookMessage('msg_not_permitted'); + + // 댓글을 수정하기 위하여 문서와 원 댓글의 유효성을 검사하기 위해 변수를 가져온다. + $document_srl = Context::get('document_srl'); + $comment_srl = Context::get('comment_srl'); + + // 지정된 댓글이 없다면 오류 + if(!$comment_srl) return new Object(-1, 'msg_invalid_request'); + + // 해당 댓글를 찾아본다 + $oCommentModel = &getModel('comment'); + $comment = $oCommentModel->getComment($comment_srl, $this->grant->manager); + + // 댓글이 없다면 오류 + if(!$comment) return $this->dispGuestbookMessage('msg_invalid_request'); + + // 문서번호를 context setting한다 + Context::set('document_srl',$comment->document_srl); + + // 글을 수정하려고 할 경우 권한이 없는 경우 비밀번호 입력화면으로 + if(!$comment->is_granted) return $this->setTemplateFile('input_password_form'); + + // 필요한 정보들 세팅 + Context::set('comment_srl',$comment_srl); + Context::set('comment', $comment); + + // comment_form 파일을 템플릿 출력 파일로 지정 + $this->setTemplateFile('comment_form'); + } + + /** + * @brief 댓글 삭제 화면 출력 + **/ + function dispGuestbookDeleteComment() { + // 댓글 작성 권한을 체크한다. + if(!$this->grant->write_comment) return $this->dispGuestbookMessage('msg_not_permitted'); + + // 삭제할 댓글번호를 가져온다 + $comment_srl = Context::get('comment_srl'); + + // 삭제하려는 댓글이 있는지 확인 + if(!$comment_srl) return $this->dispGuestbookMessage('msg_invalid_request'); + + // 해당 댓글을 가져온다. + $oCommentModel = &getModel('comment'); + $comment = $oCommentModel->getComment($comment_srl, $this->grant->manager); + + // 삭제하려는 댓글이 없으면 에러 + if(!$comment) return $this->dispGuestbookContent('msg_invalid_request'); + + // 문서 번호를 context setting한다. + Context::set('document_srl',$comment->document_srl); + + // 권한이 없는 경우 비밀번호 입력화면으로 + if(!$comment->is_granted) return $this->setTemplateFile('input_password_form'); + + Context::set('comment',$comment); + + // delete_comemnt_form.html파일을 출력 파일로 지정한다. + $this->setTemplateFile('delete_comment_form'); + } + + /** + * @brief 메세지 출력 + **/ + function dispGuestbookMessage($msg_code) { + $msg = Context::getLang($msg_code); + if(!$msg) $msg = $msg_code; + Context::set('message', $msg); + $this->setTemplateFile('message'); + } + + } +?> diff --git a/modules/guestbook/lang/en.lang.php b/modules/guestbook/lang/en.lang.php new file mode 100644 index 000000000..092d9127c --- /dev/null +++ b/modules/guestbook/lang/en.lang.php @@ -0,0 +1,16 @@ +board = "Guestbook"; + + // Words used in button + $lang->cmd_board_list = 'Guestbook List'; + $lang->cmd_module_config = 'Common Guestbook Configuration'; + $lang->cmd_view_info = 'Guestbook Info'; + + $lang->about_board = "This module is used for creating and managing guestbooks.\nSelect the module's name from the list after creating one to configurate specifically.\nBe careful with guestbook's module name, since it will be the url. (ex : http://domain/zb/?mid=modulename)"; +?> diff --git a/modules/guestbook/lang/es.lang.php b/modules/guestbook/lang/es.lang.php new file mode 100644 index 000000000..2b14c4def --- /dev/null +++ b/modules/guestbook/lang/es.lang.php @@ -0,0 +1,17 @@ +board = "Boletín"; + + // Palabras utiliza en botónes + $lang->cmd_board_list = 'Lista de boletín'; + $lang->cmd_module_config = 'configuración comun de boletínes'; + $lang->cmd_view_info = 'ver información de boletín'; + $lang->move_target_module = "Módulo para mover"; + + $lang->about_board = "Es el módulo para crear y manejar boletínes.\nDespues de crear un boletín, haga clic en nombre de módulos para configuración mas detallado.\nEl nombre de módulo es nombre de URL, sea cuidoso deseando el nombre. (ej : http://dominio/zb/?mid=nombre de módulo)"; +?> diff --git a/modules/guestbook/lang/jp.lang.php b/modules/guestbook/lang/jp.lang.php new file mode 100644 index 000000000..5468fab1a --- /dev/null +++ b/modules/guestbook/lang/jp.lang.php @@ -0,0 +1,16 @@ +guestbook = "ゲストブック"; + + // ボタンに使用する用語 + $lang->cmd_guestbook_list = 'ゲストブックリスト'; + $lang->cmd_module_config = 'ゲストブック共通設定'; + $lang->cmd_view_info = 'ゲストブック情報'; + + $lang->about_guestbook = "ゲストブックを作成・管理できるモジュールです。作成後、リストからモジュール名を選択すると詳細な設定ができます。ゲストブックのモジュール名は、接続URLになるため、慎重に入力してください。(例:http://ドメイン/zb/?mid=モジュール名)"; +?> diff --git a/modules/guestbook/lang/ko.lang.php b/modules/guestbook/lang/ko.lang.php new file mode 100644 index 000000000..e8bb2da38 --- /dev/null +++ b/modules/guestbook/lang/ko.lang.php @@ -0,0 +1,16 @@ +guestbook = "방명록"; + + // 버튼에 사용되는 언어 + $lang->cmd_guestbook_list = '방명록 목록'; + $lang->cmd_module_config = '방명록 공통 설정'; + $lang->cmd_view_info = '방명록 정보'; + + $lang->about_guestbook = "방명록을 생성하고 관리할 수 있는 방명록 모듈입니다.\n생성하신 후 목록에서 모듈이름을 선택하시면 자세한 설정이 가능합니다.\n방명록의 모듈이름은 접속 url이 되므로 신중하게 입력해주세요. (ex : http://도메인/zb/?mid=모듈이름)"; +?> diff --git a/modules/guestbook/lang/zh-CN.lang.php b/modules/guestbook/lang/zh-CN.lang.php new file mode 100644 index 000000000..dcd7af5ae --- /dev/null +++ b/modules/guestbook/lang/zh-CN.lang.php @@ -0,0 +1,16 @@ +guestbook = "留言本"; + + // 버튼에 사용되는 언어 + $lang->cmd_guestbook_list = '留言本目录'; + $lang->cmd_module_config = '留言本共同设置'; + $lang->cmd_view_info = '留言本信息'; + + $lang->about_guestbook = "可生成并管理留言本的模块。\n生成留言本后在留言本目录中点击模块名既可设置更详细的相关项目。\n因留言本的模块名将变成其url中的一部分,所以请慎重填写模块名。 (ex : http://域名/zb/?mid=模块名)"; +?> diff --git a/modules/guestbook/queries/getGuestbookList.xml b/modules/guestbook/queries/getGuestbookList.xml new file mode 100644 index 000000000..090dec365 --- /dev/null +++ b/modules/guestbook/queries/getGuestbookList.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/guestbook/skins/default/comment.html b/modules/guestbook/skins/default/comment.html new file mode 100644 index 000000000..6e04ffb12 --- /dev/null +++ b/modules/guestbook/skins/default/comment.html @@ -0,0 +1,42 @@ + + + + +
+ + + + + + +
+
{htmlspecialchars($val->nick_name)}
+
{zdate($val->regdate, "Y-m-d H:i:s")}
+
+
{$val->content}
+ +
+ {$val->ipaddress} +
+ +
+
+
+ + + + + + + + + + +
diff --git a/modules/guestbook/skins/default/comment_form.html b/modules/guestbook/skins/default/comment_form.html new file mode 100644 index 000000000..9a68d8e01 --- /dev/null +++ b/modules/guestbook/skins/default/comment_form.html @@ -0,0 +1,79 @@ + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
{$lang->date}{$source_comment->regdate}
{$lang->writer}
{htmlspecialchars($source_comment->nick_name)}
{$lang->content}{$source_comment->content}
+
+ + + +fileupload)-->enctype="multipart/form-data"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->writer}
{$lang->password}
{$lang->email_address}
{$lang->homepage}
+ +
+ + + + + +
+ + + + + diff --git a/modules/guestbook/skins/default/css/guestbook.css b/modules/guestbook/skins/default/css/guestbook.css new file mode 100644 index 000000000..41c4e7a47 --- /dev/null +++ b/modules/guestbook/skins/default/css/guestbook.css @@ -0,0 +1,28 @@ +@charset "utf-8"; + +a { color:#555555; text-decoration:none; } + +.titleBox { border:4px solid #EEEEEE; padding:.5em; margin-bottom:1em; } +.titleBox .title { font-weight:bold; } +.titleBox .memo { color:#888888; } + +.info .status { float:left; overflow:hidden; } +.info .link { float:right; overflow:hidden; } + +.write_form { padding:10px; margin:0px; border:3px solid #CCCCCC; margin-top:.5em; } +.write_form table { border:0; padding:0; } +.write_form td.option { text-align:right; padding:.3em; } + +.document { padding:0; margin-top:1em; border:3px solid #EEEEEE; } +.document .info { background-color:#EFEFEF; padding:.5em; } +.document .subinfo { text-align:right; color:#CCCCCC;} +.document .content { padding:1em; } +.document .comment { padding:1em; } + +.comment_box { border:0; padding:.5em; border-top:1px solid #EEEEEE; margin:1em 0 1em 0;} +.comment_box .comment_content { } +.comment_box .comment_content .content { margin:1em 0 2em 0;} +.comment_box .comment_content .comment_sub_info { float:left; } +.comment_box .comment_content .button_area { float:right; } + +textarea.comment_form { border:1px solid #EEEEEE; width:90%;} diff --git a/modules/guestbook/skins/default/delete_comment_form.html b/modules/guestbook/skins/default/delete_comment_form.html new file mode 100644 index 000000000..a3ed7cf27 --- /dev/null +++ b/modules/guestbook/skins/default/delete_comment_form.html @@ -0,0 +1,23 @@ + + + +
+ + + + + + + + + + + + +
{$lang->confirm_delete}
+ + +
+
+ + diff --git a/modules/guestbook/skins/default/delete_form.html b/modules/guestbook/skins/default/delete_form.html new file mode 100644 index 000000000..e0890106c --- /dev/null +++ b/modules/guestbook/skins/default/delete_form.html @@ -0,0 +1,27 @@ + + + +
+ + + + + + + + + + + + + + + +
{$lang->confirm_delete}
{$lang->title}{$oDocument->getTitleText()}
+ + +
+ +
+ + diff --git a/modules/guestbook/skins/default/filter/delete_comment.xml b/modules/guestbook/skins/default/filter/delete_comment.xml new file mode 100644 index 000000000..3780d6a18 --- /dev/null +++ b/modules/guestbook/skins/default/filter/delete_comment.xml @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + + + + +
diff --git a/modules/guestbook/skins/default/filter/delete_document.xml b/modules/guestbook/skins/default/filter/delete_document.xml new file mode 100644 index 000000000..8750f03ad --- /dev/null +++ b/modules/guestbook/skins/default/filter/delete_document.xml @@ -0,0 +1,16 @@ + +
+ + + + + + + + + + + + + +
diff --git a/modules/guestbook/skins/default/filter/input_password.xml b/modules/guestbook/skins/default/filter/input_password.xml new file mode 100644 index 000000000..2e26fbde8 --- /dev/null +++ b/modules/guestbook/skins/default/filter/input_password.xml @@ -0,0 +1,15 @@ + +
+ + + + + + + + + + + + +
diff --git a/modules/guestbook/skins/default/filter/insert.xml b/modules/guestbook/skins/default/filter/insert.xml new file mode 100644 index 000000000..debca08a7 --- /dev/null +++ b/modules/guestbook/skins/default/filter/insert.xml @@ -0,0 +1,17 @@ + +
+ + + + + + + + + + + + + + +
diff --git a/modules/guestbook/skins/default/filter/insert_comment.xml b/modules/guestbook/skins/default/filter/insert_comment.xml new file mode 100644 index 000000000..e2e46f855 --- /dev/null +++ b/modules/guestbook/skins/default/filter/insert_comment.xml @@ -0,0 +1,27 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/guestbook/skins/default/footer.html b/modules/guestbook/skins/default/footer.html new file mode 100644 index 000000000..9d5404ca8 --- /dev/null +++ b/modules/guestbook/skins/default/footer.html @@ -0,0 +1 @@ +{$module_info->footer_text} diff --git a/modules/guestbook/skins/default/header.html b/modules/guestbook/skins/default/header.html new file mode 100644 index 000000000..a49ef2bc9 --- /dev/null +++ b/modules/guestbook/skins/default/header.html @@ -0,0 +1,53 @@ + + +{$module_info->header_text} + + + +
+ +
{$module_info->title}
+ + + +
{nl2br($module_info->memo)}
+ +
+ + + +
+
+ + {$lang->document_count} : {number_format($total_count)}, + {$lang->page_count} : {number_format($page)} / {number_format($total_page)} + +
+ + + +
+
+ diff --git a/modules/guestbook/skins/default/input_password_form.html b/modules/guestbook/skins/default/input_password_form.html new file mode 100644 index 000000000..0a26427de --- /dev/null +++ b/modules/guestbook/skins/default/input_password_form.html @@ -0,0 +1,27 @@ + + + +
+ + + + + + + + + + + + + + + + +
{$lang->msg_input_password}
{$lang->password}
+ + +
+
+ + diff --git a/modules/guestbook/skins/default/js/guestbook.js b/modules/guestbook/skins/default/js/guestbook.js new file mode 100644 index 000000000..4695df7e8 --- /dev/null +++ b/modules/guestbook/skins/default/js/guestbook.js @@ -0,0 +1,74 @@ +/** + * @file modules/guestbook/js/guestbook.js + * @author zero (zero@nzeo.com) + * @brief guestbook 모듈의 javascript + **/ + +/* 글쓰기 작성후 */ +function completeDocumentInserted(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + + alert(message); + + var url = current_url.setQuery('mid',mid).setQuery('document_srl',document_srl).setQuery('act',''); + location.href = url; +} + +/* 글 삭제 */ +function completeDeleteDocument(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var page = ret_obj['page']; + + var url = "./?mid="+mid; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + +// 현재 페이지 reload +function completeReload(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + location.href = location.href; +} + +/* 댓글 글쓰기 작성후 */ +function completeInsertComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var comment_srl = ret_obj['comment_srl']; + + var url = "./?mid="+mid+"&document_srl="+document_srl; + //if(comment_srl) url += "#comment_"+comment_srl; + + alert(message); + + location.href = url; +} + +/* 댓글 삭제 */ +function completeDeleteComment(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; + var page = ret_obj['page']; + + var url = "./?mid="+mid+'&document_srl='+document_srl; + if(page) url += "&page="+page; + + alert(message); + + location.href = url; +} + diff --git a/modules/guestbook/skins/default/list.html b/modules/guestbook/skins/default/list.html new file mode 100644 index 000000000..627a1910a --- /dev/null +++ b/modules/guestbook/skins/default/list.html @@ -0,0 +1,65 @@ + + + + + +
+ +
+ + + +
+ + +
+
+
{$document->getNickName()}
+ + + + + +
+
+ + +
+ {$document->getContent()} +
+ +
+ {$document->getRegdate('Y-m-d H:i:s')} | + {$document->get('ipaddress')} +
+ +
+ + + + +
+
+ + +
+ + +
+ [{$lang->first_page}] + + + + {$page_no} + + [{$page_no}] + + + + [{$lang->last_page}] +
+ + diff --git a/modules/guestbook/skins/default/message.html b/modules/guestbook/skins/default/message.html new file mode 100644 index 000000000..00bf01814 --- /dev/null +++ b/modules/guestbook/skins/default/message.html @@ -0,0 +1,11 @@ + + +
+ {$message} +
+ + + {$lang->cmd_login} + + + diff --git a/modules/guestbook/skins/default/skin.xml b/modules/guestbook/skins/default/skin.xml new file mode 100644 index 000000000..d54e53bf6 --- /dev/null +++ b/modules/guestbook/skins/default/skin.xml @@ -0,0 +1,39 @@ + + + 방명록 기본 스킨 + 留言本默认皮肤 + ゲストブックのデフォルトスキン + + 제로 + Zero + Zero + board모듈의 default스킨 + 版面模块的默认皮肤。 + ボード(board)モジュールのデフォルトスキンです。 + + + + 기본 + 默认 + デフォルト + + + + + 제목 + 标题 + タイトル + 방명록의 제목을 적어주세요. + 请输入留言本标题。 + ゲストブックのタイトルを入力してください。 + + + 방명록 설명 + 留言本说明 + ゲストブックの説明 + 내용의 기본값 + 内容默认值 + 内容のデフォルト値 + + + diff --git a/modules/guestbook/skins/default/write_form.html b/modules/guestbook/skins/default/write_form.html new file mode 100644 index 000000000..077b81209 --- /dev/null +++ b/modules/guestbook/skins/default/write_form.html @@ -0,0 +1,69 @@ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->writer}
{$lang->password}
{$lang->email_address}
{$lang->homepage}
+ + isNotice())-->checked="checked" id="is_notice" /> + + + + isSecret())-->checked="checked" id="is_secret" /> + + + allowComment())-->checked="checked" id="allow_comment" /> + + + isLocked())-->checked="checked" id="lock_comment" /> + + +
{$editor}
+ +
+ + +
+ +
+ + + + + diff --git a/modules/guestbook/tpl/filter/delete_guestbook.xml b/modules/guestbook/tpl/filter/delete_guestbook.xml new file mode 100644 index 000000000..21817e5d3 --- /dev/null +++ b/modules/guestbook/tpl/filter/delete_guestbook.xml @@ -0,0 +1,10 @@ + +
+ + + + + + + +
diff --git a/modules/guestbook/tpl/filter/insert_grant.xml b/modules/guestbook/tpl/filter/insert_grant.xml new file mode 100644 index 000000000..c8e4c8600 --- /dev/null +++ b/modules/guestbook/tpl/filter/insert_grant.xml @@ -0,0 +1,11 @@ + +
+ + + + + + + + +
diff --git a/modules/guestbook/tpl/filter/insert_guestbook.xml b/modules/guestbook/tpl/filter/insert_guestbook.xml new file mode 100644 index 000000000..4b6450fa3 --- /dev/null +++ b/modules/guestbook/tpl/filter/insert_guestbook.xml @@ -0,0 +1,33 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/guestbook/tpl/grant_list.html b/modules/guestbook/tpl/grant_list.html new file mode 100644 index 000000000..f96aa9cfa --- /dev/null +++ b/modules/guestbook/tpl/grant_list.html @@ -0,0 +1,42 @@ + + + +
{nl2br($lang->about_grant)}
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->grant}{$lang->target}
{$val->title} + + grants[$key])&&in_array($v->group_srl,$module_info->grants[$key]))-->checked="checked"/> + + + {$lang->cmd_select_all}{$lang->cmd_unselect_all}
+ +
+ +
+
diff --git a/modules/guestbook/tpl/guestbook_delete.html b/modules/guestbook/tpl/guestbook_delete.html new file mode 100644 index 000000000..7c0330778 --- /dev/null +++ b/modules/guestbook/tpl/guestbook_delete.html @@ -0,0 +1,34 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
{$lang->confirm_delete}
{$lang->module_name}{$module_info->mid}
{$lang->module}{$module_info->module}
{$lang->document_count}{$module_info->document_count}
+ + + +
diff --git a/modules/guestbook/tpl/guestbook_info.html b/modules/guestbook/tpl/guestbook_info.html new file mode 100644 index 000000000..998039fd7 --- /dev/null +++ b/modules/guestbook/tpl/guestbook_info.html @@ -0,0 +1,73 @@ + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->module_category} + + {$lang->not_exists} + + {$module_category[$module_info->module_category_srl]->title} + +
{$lang->layout} + + {$module_info->layout_title} ({$module_info->layout}) + + {$lang->not_exists} + +
{$lang->skin}{$module_info->skin_title} ({$module_info->skin})
{$lang->browser_title}{htmlspecialchars($module_info->browser_title)}
{$lang->use_category}{$lang->use}{$lang->notuse}
{$lang->open_rss}{$lang->open_rss_types[$module_info->open_rss]}
{$lang->list_count}{$module_info->list_count?$module_info->list_count:20}
{$lang->page_count}{$module_info->page_count?$module_info->page_count:10}
{$lang->description}{nl2br(htmlspecialchars($module_info->description))}
{$lang->header_text}{htmlspecialchars($module_info->header_text)}
{$lang->footer_text}{htmlspecialchars($module_info->footer_text)}
{$lang->admin_id}{implode(",",$module_info->admin_id)}
+ + diff --git a/modules/guestbook/tpl/guestbook_insert.html b/modules/guestbook/tpl/guestbook_insert.html new file mode 100644 index 000000000..b953183c1 --- /dev/null +++ b/modules/guestbook/tpl/guestbook_insert.html @@ -0,0 +1,137 @@ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->mid} + +

{$lang->about_mid}

+
{$lang->is_default} + is_default=='Y')-->checked="checked" id="fld_for_default" class="checkbox" /> + +
{$lang->module_category} + +

{$lang->about_module_category}

+
{$lang->browser_title} + +

{$lang->about_browser_title}

+
{$lang->layout} + +

{$lang->about_layout}

+
{$lang->skin} + +

{$lang->about_skin}

+
{$lang->open_rss} + +

{$lang->about_open_rss}

+
{$lang->list_count} + +

{$lang->about_list_count}

+
{$lang->page_count} + +

{$lang->about_page_count}

+
{$lang->description} + +

{$lang->about_description}

+
{$lang->header_text} + +

{$lang->about_header_text}

+
{$lang->footer_text} + +

{$lang->about_footer_text}

+
{$lang->admin_id} + +

{$lang->about_admin_id}

+
+ +
+ +
+ +
diff --git a/modules/guestbook/tpl/header.html b/modules/guestbook/tpl/header.html new file mode 100644 index 000000000..45bc12413 --- /dev/null +++ b/modules/guestbook/tpl/header.html @@ -0,0 +1,23 @@ + + +

{$lang->guestbook} {$lang->cmd_management}

+ + +
+ +

{$module_info->mid} ({$lang->is_default}) | View

+ + + +
+ + diff --git a/modules/guestbook/tpl/index.html b/modules/guestbook/tpl/index.html new file mode 100644 index 000000000..4b300767f --- /dev/null +++ b/modules/guestbook/tpl/index.html @@ -0,0 +1,80 @@ + + +
{nl2br($lang->about_guestbook)}
+ + +
+ Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->no} +
+ + + + +
+
{$lang->mid}{$lang->browser_title}{$lang->is_default}{$lang->skin}{$lang->admin_id}{$lang->regdate}{$lang->cmd_view}{$lang->cmd_delete}
{$no} + + {$lang->not_exists} + + {$module_category[$val->module_category_srl]->title} + + {$val->mid}{htmlspecialchars($val->browser_title)}{$val->is_default}{$val->skin}{$val->admin_id}{zdate($val->regdate,"Y-m-d")}{$lang->cmd_view}{$lang->cmd_delete}
+ + + + + + diff --git a/modules/guestbook/tpl/js/guestbook_admin.js b/modules/guestbook/tpl/js/guestbook_admin.js new file mode 100644 index 000000000..f641d1724 --- /dev/null +++ b/modules/guestbook/tpl/js/guestbook_admin.js @@ -0,0 +1,79 @@ +/** + * @file modules/guestbook/js/guestbook_admin.js + * @author zero (zero@nzeo.com) + * @brief guestbook 모듈의 관리자용 javascript + **/ + +/* 모듈 생성 후 */ +function completeInsertGuestbook(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + var page = ret_obj['page']; + var module_srl = ret_obj['module_srl']; + + alert(message); + + var url = current_url.setQuery('act','dispGuestbookAdminGuestbookInfo'); + if(module_srl) url = url.setQuery('module_srl',module_srl); + if(page) url.setQuery('page',page); + location.href = url; +} + +/* 모듈 삭제 후 */ +function completeDeleteGuestbook(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var page = ret_obj['page']; + alert(message); + + var url = current_url.setQuery('act','dispGuestbookAdminContent').setQuery('module_srl',''); + if(page) url = url.setQuery('page',page); + location.href = url; +} + +/* 권한 관련 */ +function doSelectAll(obj, key) { + var fo_obj = obj.parentNode; + while(fo_obj.nodeName != 'FORM') { + fo_obj = fo_obj.parentNode; + } + + for(var i=0;i + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->skin_default_info}
{$lang->skin}{$skin_info->title}
{$lang->skin_maker}{$skin_info->maker->name} ({$skin_info->maker->email_address})
{$lang->skin_maker_homepage}{$skin_info->maker->homepage}
{$lang->date}{$skin_info->maker->date}
{$lang->description}{nl2br($skin_info->maker->description)}
+ + + + + + + + + + + + + + + + + + +
{$lang->extra_vars}
{$lang->colorset} + +
+ + {$val->title} + + + colorset==$val->name)-->checked="checked"/> + +
+ +
{$val->title} + + + + + + + + + + + + + value))-->checked="checked" class="checkbox" /> + + + + + + + + value)-->checked="checked"/> + + + + + + + +
+
+ + +
+ + + + + + +

{nl2br($val->description)}

+ +
+ +
+ +
+
+ + diff --git a/modules/guestbook/tpl/top_refresh.html b/modules/guestbook/tpl/top_refresh.html new file mode 100644 index 000000000..2f4983d1d --- /dev/null +++ b/modules/guestbook/tpl/top_refresh.html @@ -0,0 +1,3 @@ + diff --git a/modules/importer/conf/info.xml b/modules/importer/conf/info.xml new file mode 100644 index 000000000..7f395e7cc --- /dev/null +++ b/modules/importer/conf/info.xml @@ -0,0 +1,17 @@ + + + 제로보드 데이터 이전 + Zeroboard data transferation + 数据导入 + ZBデータ移転 + + 제로 + Zero + zero + Zero + XML파일을 이용하여 회원정보 또는 게시판등의 데이터를 입력합니다. + Inputting member information or board's data using XML file. + 利用XML文件导入会员信息或版面数据。 + XMLファイルを用いて会員情報または掲示板などの情報を入力します。 + + diff --git a/modules/importer/conf/module.xml b/modules/importer/conf/module.xml new file mode 100644 index 000000000..b36dd8932 --- /dev/null +++ b/modules/importer/conf/module.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/modules/importer/importer.admin.controller.php b/modules/importer/importer.admin.controller.php new file mode 100644 index 000000000..b86566e53 --- /dev/null +++ b/modules/importer/importer.admin.controller.php @@ -0,0 +1,498 @@ +getMidList(); + foreach($module_list as $key => $val) { + $module_list_arr[] = sprintf('%d,%s (%s)', $val->module_srl, $val->browser_title, $val->mid); + } + if(count($module_list_arr)) $module_list = implode("\n",$module_list_arr); + $next_step = 12; + break; + case 'member' : + $next_step = 2; + break; + case 'syncmember' : + $next_step = 3; + break; + } + + $this->add('next_step', $next_step); + $this->add('module_list', $module_list); + } + + /** + * @brief import step12 + * module_srl을 이용하여 대상 모듈에 카테고리값이 있는지 확인하여 + * 있으면 카테고리 정보를 return, 아니면 파일 업로드 단계로 이동 + **/ + function procImporterAdminStep12() { + $target_module= Context::get('target_module'); + + // 대상 모듈의 카테고리 목록을 구해옴 + $oDocumentModel = &getModel('document'); + $category_list = $oDocumentModel->getCategoryList($target_module); + + if(count($category_list)) { + foreach($category_list as $key => $val) { + $category_list_arr[] = sprintf('%d,%s', $val->category_srl, $val->title); + } + if(count($category_list_arr)) { + $category_list = implode("\n",$category_list_arr); + $next_step = 13; + } + } else { + $category_list = null; + $next_step = 2; + } + + $this->add('next_step', $next_step); + $this->add('category_list', $category_list); + } + + /** + * @brief import 실행 + **/ + function procImporterAdminImport() { + // 실행시간 무한대로 설정 + @set_time_limit(0); + + // 변수 체크 + $this->module_srl = Context::get('module_srl'); + $this->target_path = Context::get('target_path'); + if(substr($this->target_path,-1)!="/") $this->target_path .= "/"; + $this->category_srl = Context::get('category_srl'); + $xml_file = Context::get('xml_file'); + $this->start_position = $this->position = (int)Context::get('position'); + $this->total_count = (int)Context::get('total_count'); + $this->file_point = (int)Context::get('file_point'); + + // 파일을 찾을 수 없으면 에러 표시 + if(!file_exists($xml_file)) return new Object(-1,'msg_no_xml_file'); + + $this->oXml = new XmlParser(); + + $oDB = &DB::getInstance(); + $oDB->begin(); + + // module_srl이 있으면 module데이터로 판단하여 처리, 아니면 회원정보로.. + if($this->module_srl) { + $this->limit_count = 100; + $is_finished = $this->importDocument($xml_file); + } else { + $this->limit_count = 500; + $is_finished = $this->importMember($xml_file); + } + + $oDB->commit(); + + if($is_finished) { + $this->add('is_finished', 'Y'); + $this->add('position', $this->total_count); + $this->add('total_count', $this->total_count); + $this->setMessage( sprintf(Context::getLang('msg_import_finished'), $this->position) ); + } else { + $this->add('position', $this->position); + $this->add('total_count', $this->total_count); + $this->add('file_point', $this->file_point); + $this->add('is_finished', 'N'); + + $this->setMessage( $this->msg ); + } + } + + /** + * @brief 회원정보 import + **/ + function importMember($xml_file) { + $filesize = filesize($xml_file); + if($filesize<1) return true; + + $this->oMemberController = &getController('member'); + $this->oMemberModel = &getModel('member'); + + $default_group = $this->oMemberModel->getDefaultGroup(); + $this->default_group_srl = $default_group->group_srl; + + $is_finished = true; + + $fp = @fopen($xml_file, "r"); + if($this->file_point) fseek($fp, $this->file_point, SEEK_SET); + if($fp) { + $buff = ''; + while(!feof($fp)) { + $str = fgets($fp,1024); + $buff .= $str; + + $buff = preg_replace_callback("!]*)>!is", array($this, '_parseRootInfo'), $buff); + $buff = preg_replace_callback("!(.*?)<\/member>!is", array($this, '_importMember'), $buff); + + if($this->start_position+$this->limit_count <= $this->position) { + $is_finished = false; + $this->file_point = ftell($fp) - strlen($buff);; + break; + } + } + fclose($fp); + } + + return $is_finished; + } + + function _importMember($matches) { + $user_id = $matches[1]; + $xml_doc = $this->oXml->parse($matches[0]); + + $args->user_id = strtolower($xml_doc->member->user_id->body); + $args->user_name = $xml_doc->member->user_name->body; + $args->nick_name = $xml_doc->member->nick_name->body; + $args->homepage = $xml_doc->member->homepage->body; + $args->blog = $xml_doc->member->blog->body; + if($args->homepage && !eregi("^http:\/\/",$args->homepage)) $args->homepage = 'http://'.$args->homepage; + if($args->blog && !eregi("^http:\/\/",$args->blog)) $args->blog = 'http://'.$args->blog; + $args->birthday = $xml_doc->member->birthday->body; + $args->email_address = $xml_doc->member->email_address->body; + list($args->email_id, $args->email_host) = explode('@', $args->email_address); + if(!$args->email_host) $args->email_host = $args->email_id; + $args->password = $xml_doc->member->password->body; + $args->regdate = $xml_doc->member->regdate->body; + $args->allow_mailing = $xml_doc->member->allow_mailing->body; + if($args->allow_mailing!='Y') $args->allow_mailing = 'N'; + $args->allow_message = 'Y'; + if(!in_array($args->allow_message, array('Y','N','F'))) $args->allow_message= 'Y'; + + $args->member_srl = getNextSequence(); + $output = executeQuery('member.insertMember', $args); + + if(!$output->toBool()) { + // 닉네임이 같으면 닉네임을 변경후 재 입력 + $member_srl = $this->oMemberModel->getMemberSrlByNickName($args->nick_name); + if($member_srl) { + $args->nick_name .= rand(111,999); + $output = executeQuery('member.insertMember', $args); + } + } + + if($output->toBool()) { + + // 기본 그룹 가입 시킴 + $member_srl = $args->member_srl; + $args->group_srl = $this->default_group_srl; + executeQuery('member.addMemberToGroup',$args); + + // 이미지네임 + if($xml_doc->member->image_nickname->body) { + $image_nickname = base64_decode($xml_doc->member->image_nickname->body); + + $target_path = sprintf('files/member_extra_info/image_name/%s/', getNumberingPath($args->member_extra_info)); + $target_filename = sprintf('%s%d.gif', $target_path, $args->member_srl); + + FileHandler::makeDir($target_path); + FileHandler::writeFile($target_filename, $image_nickname); + } + + // 이미지 마크 + if($xml_doc->member->image_mark->body) { + $image_mark = base64_decode($xml_doc->member->image_mark->body); + + $target_path = sprintf('files/member_extra_info/image_mark/%s/', getNumberingPath($args->member_srl)); + $target_filename = sprintf('%s%d.gif', $target_path, $args->member_srl); + + FileHandler::makeDir($target_path); + FileHandler::writeFile($target_filename, $image_mark); + } + + // 서명 + if(trim($xml_doc->member->signature->body)) { + $signature = removeHackTag(base64_decode($xml_doc->member->signature->body)); + $signature_buff = sprintf('%s', $signature); + + $target_path = sprintf('files/member_extra_info/signature/%s/', getNumberingPath($args->member_srl)); + $target_filename = sprintf('%s%d.signature.php', $target_path, $args->member_srl); + + FileHandler::makeDir($target_path); + FileHandler::writeFile($target_filename, $signature_buff); + } + } else { + $this->msg .= $args->user_id." : ".$output->getMessage()."
"; + } + + $this->position++; + + return ''; + } + + /** + * @brief 게시물정보 import + **/ + function importDocument($xml_file) { + $filesize = filesize($xml_file); + if($filesize<1) return; + + $this->oDocumentController = &getController('document'); + $this->oFileController = &getController('file'); + $this->oCommentController = &getController('comment'); + $this->oTrackbackController = &getController('trackback'); + + $oDocumentModel = &getModel('document'); + $tmp_category_list = $oDocumentModel->getCategoryList($this->module_srl); + if(count($tmp_category_list)) { + foreach($tmp_category_list as $key => $val) $this->category_list[$val->title] = $key; + } else { + $this->category_list = array(); + } + + $is_finished = true; + + $fp = @fopen($xml_file, "r"); + if($this->file_point) fseek($fp, $this->file_point, SEEK_SET); + if($fp) { + $buff = ''; + while(!feof($fp)) { + $str = fread($fp,1024); + $buff .= $str; + $buff = preg_replace_callback("!]*)>!is", array($this, '_parseRootInfo'), $buff); + if(!$this->category_srl) $buff = preg_replace_callback("!(.*?)!is", array($this, '_parseCategoryInfo'), $buff); + $buff = preg_replace_callback("!(.*?)<\/document>!is", array($this, '_importDocument'), $buff); + + if($this->start_position+$this->limit_count <= $this->position) { + $is_finished = false; + $this->file_point = ftell($fp) - strlen($buff);; + break; + } + } + fclose($fp); + } + + return $is_finished; + } + + function _importDocument($matches) { + $sequence = $matches[1]; + $matches[0] = str_replace(array('',''),'',$matches[0]); + $xml_doc = $this->oXml->parse($matches[0]); + + // 문서 번호와 내용 미리 구해 놓기 + $args->document_srl = getNextSequence(); + $args->content = $xml_doc->document->content->body; + + // 첨부파일 미리 등록 + $files = $xml_doc->document->files->file; + if($files && !is_array($files)) $files = array($files); + if(count($files)) { + foreach($files as $key => $val) { + $filename = $val->filename->body; + $path = $val->path->body; + $download_count = (int)$val->download_count->body; + + $tmp_filename = './files/cache/tmp_uploaded_file'; + + $path = $this->target_path.$path; + + if(!eregi("^http",$path)) { + if(preg_match('/[\xEA-\xED][\x80-\xFF]{2}/', $path)&&function_exists('iconv')) { + $tmp_path = iconv("UTF-8","EUC-KR",$path); + if(file_exists($tmp_path)) $path = $tmp_path; + } + if(file_exists($path)) @copy($path, $tmp_filename); + + } else FileHandler::getRemoteFile($path, $tmp_filename); + + if(file_exists($tmp_filename)) { + $file_info['tmp_name'] = $tmp_filename; + $file_info['name'] = $filename; + $this->oFileController->insertFile($file_info, $this->module_srl, $args->document_srl, $download_count, true); + + // 컨텐츠의 내용 수정 (이미지 첨부파일 관련) + if(eregi("\.(jpg|gif|jpeg|png)$", $filename)) $args->content = str_replace($filename, sprintf('./files/attach/images/%s/%s/%s', $this->module_srl, $args->document_srl, $filename), $args->content); + } + @unlink($tmp_filename); + } + } + + // 문서 입력 + $args->module_srl = $this->module_srl; + if($this->category_srl) $args->category_srl = $this->category_srl; + elseif($xml_doc->document->category->body) $args->category_srl = $this->category_list[$xml_doc->document->category->body]; + $args->is_notice = $xml_doc->document->is_notice->body; + $args->is_secret = $xml_doc->document->is_secret->body; + $args->title = $xml_doc->document->title->body; + $args->readed_count = $xml_doc->document->readed_count->body; + $args->voted_count = $xml_doc->document->voted_count->body; + $args->comment_count = $xml_doc->document->comment_count->body; + $args->trackback_count = $xml_doc->document->trackback_count->body; + $args->uploaded_count = $xml_doc->document->uploaded_count->body; + $args->password = $xml_doc->document->password->body; + $args->nick_name = $xml_doc->document->nick_name->body; + $args->member_srl = 0; + $args->user_id = $xml_doc->document->user_id->body; + $args->user_name = $xml_doc->document->user_name->body; + $args->email_address = $xml_doc->document->email_address->body; + $args->homepage = $xml_doc->document->homepage->body; + $args->tags = $xml_doc->document->tags->body; + $args->regdate = $xml_doc->document->regdate->body; + $args->ipaddress = $xml_doc->document->ipaddress->body; + $args->allow_comment = $xml_doc->document->allow_comment->body; + $args->lock_comment = $xml_doc->document->lock_comment->body; + $args->allow_trackback = $xml_doc->document->allow_trackback->body; + $args->extra_vars1 = $xml_doc->document->extra_vars1->body; + $args->extra_vars2 = $xml_doc->document->extra_vars2->body; + $args->extra_vars3 = $xml_doc->document->extra_vars3->body; + $args->extra_vars4 = $xml_doc->document->extra_vars4->body; + $args->extra_vars5 = $xml_doc->document->extra_vars5->body; + $args->extra_vars6 = $xml_doc->document->extra_vars6->body; + $args->extra_vars7 = $xml_doc->document->extra_vars7->body; + $args->extra_vars8 = $xml_doc->document->extra_vars8->body; + $args->extra_vars9 = $xml_doc->document->extra_vars9->body; + $args->extra_vars10 = $xml_doc->document->extra_vars10->body; + $args->extra_vars11 = $xml_doc->document->extra_vars11->body; + $args->extra_vars12 = $xml_doc->document->extra_vars12->body; + $args->extra_vars13 = $xml_doc->document->extra_vars13->body; + $args->extra_vars14 = $xml_doc->document->extra_vars14->body; + $args->extra_vars15 = $xml_doc->document->extra_vars15->body; + $args->extra_vars16 = $xml_doc->document->extra_vars16->body; + $args->extra_vars17 = $xml_doc->document->extra_vars17->body; + $args->extra_vars18 = $xml_doc->document->extra_vars18->body; + $args->extra_vars19 = $xml_doc->document->extra_vars19->body; + $args->extra_vars20 = $xml_doc->document->extra_vars20->body; + + $output = $this->oDocumentController->insertDocument($args, true); + if($output->toBool()) { + + // 코멘트 입력 + $comments = $xml_doc->document->comments->comment; + if($comments && !is_array($comments)) $comments = array($comments); + if(count($comments)) { + foreach($comments as $key => $val) { + $comment_args->document_srl = $args->document_srl; + $comment_args->comment_srl = getNextSequence(); + $comment_args->module_srl = $this->module_srl; + //$comment_args->parent_srl = $val->parent_srl->body; + $comment_args->parent_srl = 0; + $comment_args->content = $val->content->body; + $comment_args->password = $val->password->body; + $comment_args->nick_name = $val->nick_name->body; + $comment_args->user_id = $val->user_id->body; + $comment_args->user_name = $val->user_name->body; + $comment_args->member_srl = 0; + $comment_args->email_address = $val->email_address->body; + $comment_args->regdate = $val->regdate->body; + $comment_args->ipaddress = $val->ipaddress->body; + $this->oCommentController->insertComment($comment_args, true); + } + } + + // 트랙백 입력 + $trackbacks = $xml_doc->document->trackbacks->trackback; + if($trackbacks && !is_array($trackbacks)) $trackbacks = array($trackbacks); + if(count($trackbacks)) { + foreach($trackbacks as $key => $val) { + $trackback_args->document_srl = $args->document_srl; + $trackback_args->module_srl = $this->module_srl; + $trackback_args->url = $val->url->body; + $trackback_args->title = $val->title->body; + $trackback_args->blog_name = $val->blog_name->body; + $trackback_args->excerpt = $val->excerpt->body; + $trackback_args->regdate = $val->regdate->body; + $trackback_args->ipaddress = $val->ipaddress->body; + $this->oTrackbackController->insertTrackback($trackback_args, true); + } + } + } else { + $this->msg .= $sequence." : ".$output->getMessage()."
"; + } + + $this->position++; + return ''; + } + + /** + * @brief 회원정보와 게시물 정보를 싱크 + **/ + function procImporterAdminSync() { + // 게시물정보 싱크 + $output = executeQuery('importer.updateDocumentSync'); + + // 댓글정보 싱크 + $output = executeQuery('importer.updateCommentSync'); + + $this->setMessage('msg_sync_completed'); + } + + /** + * @brief 정보를 읽어서 정보를 구함 + **/ + function _parseRootInfo($matches) { + $root = $matches[0].''; + $xml_doc = $this->oXml->parse($root); + $this->total_count = $xml_doc->root->attrs->count; + } + + /** + * @brief 정보를 읽어서 정보를 구함 + **/ + function _parseCategoryInfo($matches) { + $xml_doc = $this->oXml->parse($matches[0]); + + $category_list = $xml_doc->categories->category; + if(!$category_list) return; + + if(!is_array($category_list)) $category_list = array($category_list); + + $oDocumentController = &getAdminController('document'); + + foreach($category_list as $key => $val) { + $title = $val->body; + if($this->category_list[$title]) continue; + + $output = $oDocumentController->insertCategory($this->module_srl, $title); + $this->category_list[$title] = $output->get('category_srl'); + } + } + } +?> diff --git a/modules/importer/importer.admin.view.php b/modules/importer/importer.admin.view.php new file mode 100644 index 000000000..b866cc35b --- /dev/null +++ b/modules/importer/importer.admin.view.php @@ -0,0 +1,27 @@ +setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('index'); + } + + } +?> diff --git a/modules/importer/importer.class.php b/modules/importer/importer.class.php new file mode 100644 index 000000000..9f3b83dbe --- /dev/null +++ b/modules/importer/importer.class.php @@ -0,0 +1,36 @@ +insertActionForward('importer', 'view', 'dispImporterAdminContent'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + + } +?> diff --git a/modules/importer/lang/en.lang.php b/modules/importer/lang/en.lang.php new file mode 100644 index 000000000..eea8891f9 --- /dev/null +++ b/modules/importer/lang/en.lang.php @@ -0,0 +1,52 @@ +cmd_sync_member = 'Synchronize'; + $lang->cmd_continue = 'Continue'; + + // items + $lang->importer = 'Transfer zeroboard datas'; + $lang->source_type = 'Previous target'; + $lang->type_member = 'Member data'; + $lang->type_module = 'Articles data'; + $lang->type_syncmember = 'Synchronize member data'; + $lang->target_module = 'Target module'; + $lang->xml_file = 'XML file'; + + $lang->import_step_title = array( + 1 => 'Step 1. Select previous target', + 12 => 'Step 1-2. Select target module', + 13 => 'Step 1-3. Select target category', + 2 => 'Step 2. Upload XML file', + 3 => 'Step 2. Synchronize member data and article data', + ); + + $lang->import_step_desc = array( + 1 => 'Please select the XML file\'s type you wish to transfer.', + 12 => 'Please select the module you wish to transfer datas.', + 13 => 'Please select the target category you wish to tranfer datas.', + 2 => "Please input the XML file's location you wish to tranfer datas.\nIf it is located in the same account, input absolute/relative path. If not, input the url starting with http://..", + 3 => 'The member data and article data may not be correct after the transferation. If that is the case, synchronize to repair it based on user_id.', + ); + + // guide/alert + $lang->msg_sync_member = 'Member and article data synchronization will begin by clicking the synchronize button.'; + $lang->msg_no_xml_file = 'Could not find XML file. Please check the path again'; + $lang->msg_invalid_xml_file = 'Invalid type of XML file.'; + $lang->msg_importing = 'Writing %d datas of %d. (If it keeps being frozen, click the button "Continue")'; + $lang->msg_import_finished = '%d datas were inputted completely. Depending on the situation, there might be some datas which couldn\'t be inputted.'; + $lang->msg_sync_completed = 'Completed synchronzing member article and comments.'; + + // blah blah.. + $lang->about_type_member = 'If you are transfering the member information, select this option'; + $lang->about_type_module = 'If you are transfering the board or articles information, select this option'; + $lang->about_type_syncmember = 'If you are trying to synchronize the member information after transfering member and article information, select this option'; + $lang->about_importer = "You can transfer Zeroboard4, Zeroboard5 Beta or other program's data into ZeroboardXE's data.\nIn order to tranfer, you have to use XML Exporter to convert the data you want into XML File then upload it."; + + $lang->about_target_path = "첨부파일을 받기 위해 제로보드4가 설치된 위치를 입력해주세요.\n같은 서버에 있을 경우 /home/아이디/public_html/bbs 등과 같이 제로보드4의 위치를 입력하시고\n다른 서버일 경우 http://도메인/bbs 처럼 제로보드가 설치된 곳의 url을 입력해주세요"; +?> diff --git a/modules/importer/lang/jp.lang.php b/modules/importer/lang/jp.lang.php new file mode 100644 index 000000000..090f6263d --- /dev/null +++ b/modules/importer/lang/jp.lang.php @@ -0,0 +1,52 @@ +cmd_sync_member = '同期化'; + $lang->cmd_continue = '続ける'; + + // 項目 + $lang->importer = 'ZBデータ変換'; + $lang->source_type = 'データ変換の対象'; + $lang->type_member = '会員情報'; + $lang->type_module = '書き込みデータ情報'; + $lang->type_syncmember = '会員情報同期化'; + $lang->target_module = '対象モジュール'; + $lang->xml_file = 'XMLファイル'; + + $lang->import_step_title = array( + 1 => 'Step 1. 以前対象選択', + 12 => 'Step 1-2. 対象モジュール選択', + 13 => 'Step 1-3. 対象カテゴリ選択', + 2 => 'Step 2. XMLファイルアップロード', + 3 => 'Step 2. 会員情報と書き込みデータの同期化', + ); + + $lang->import_step_desc = array( + 1 => '変換するXMLファイルの種類を選択してください。', + 12 => 'データ変換を行う対象モジュールを選択してください。', + 13 => 'データ変換を行う対象カテゴリを選択してください。', + 2 => "データ変換を行うXMLファイルパスを入力してください。同じアカウントのサーバ上では、相対または絶対パスを、異なるサーバにアップロードされている場合は、「http://アドレス..」を入力してください。", + 3 => '会員情報と書き込みデータの情報の変換を行った後、データが合わない場合があります。この時に同期化を行うと「user_id」をもとに正しく動作するようにします。', + ); + + // 案内/警告 + $lang->msg_sync_member = '同期化ボタンをクリックすると会員情報と書き込みデータの情報の同期化が始まります。'; + $lang->msg_no_xml_file = 'XMLファイルが見つかりません。パスをもう一度確認してください。'; + $lang->msg_invalid_xml_file = 'XMLファイルのフォーマットが正しくありません。'; + $lang->msg_importing = '%d個のデータの内、%d個を変換中です(止まったままの場合は「続ける」ボタンをクリックしてください)。'; + $lang->msg_import_finished = '%d個のデータ変換が完了しました。場合によって変換されていないデータがあることもあります。'; + $lang->msg_sync_completed = '会員情報、書き込みデータ、コメントのデータの同期化(変換)が完了しました。'; + + // Bla, Blah.. + $lang->about_type_member = 'データ変換の対象が会員情報の場合は選択してください。'; + $lang->about_type_module = 'データ変換の対象が書き込みデータである場合は選択してください。'; + $lang->about_type_syncmember = '会員情報と書き込みデータなどの変換を行った後、会員情報を同期化する必要がある場合は、選択してください。'; + $lang->about_importer = "ゼロボード4、zb5betaまたは他のプログラムの書き込みデータをゼロボードXEのデータに変換することができます。\n変換するためには、XML Exporterを利用して変換したい書き込みデータをXMLファイルで作成してアップロードしてください。"; + + $lang->about_target_path = "첨부파일을 받기 위해 제로보드4가 설치된 위치를 입력해주세요.\n같은 서버에 있을 경우 /home/아이디/public_html/bbs 등과 같이 제로보드4의 위치를 입력하시고\n다른 서버일 경우 http://도메인/bbs 처럼 제로보드가 설치된 곳의 url을 입력해주세요"; +?> diff --git a/modules/importer/lang/ko.lang.php b/modules/importer/lang/ko.lang.php new file mode 100644 index 000000000..ff4104517 --- /dev/null +++ b/modules/importer/lang/ko.lang.php @@ -0,0 +1,52 @@ +cmd_sync_member = '동기화'; + $lang->cmd_continue = '계속진행'; + + // 항목 + $lang->importer = '제로보드 데이터 이전'; + $lang->source_type = '이전 대상'; + $lang->type_member = '회원 정보'; + $lang->type_module = '게시물 정보'; + $lang->type_syncmember = '회원정보 동기화'; + $lang->target_module = '대상 모듈'; + $lang->xml_file = 'XML 파일'; + + $lang->import_step_title = array( + 1 => 'Step 1. 이전 대상 선택', + 12 => 'Step 1-2. 대상 모듈 선택', + 13 => 'Step 1-3. 대상 분류 선택', + 2 => 'Step 2. XML파일 지정', + 3 => 'Step 2. 회원정보와 게시물의 정보 동기화', + ); + + $lang->import_step_desc = array( + 1 => '이전을 하려는 XML파일의 종류를 선택해주세요.', + 12 => '데이터 이전을 할 대상 모듈을 선택해주세요.', + 13 => '데이터 이전을 할 대상 분류를 선택해주세요.', + 2 => "데이터 이전을 할 XML파일의 경로를 입력해주세요.\n상대 또는 절대 경로를 입력하시면 됩니다", + 3 => '회원정보와 게시물의 정보가 이전후에 맞지 않을 수 있습니다. 이 때 동기화를 하시면 user_id를 기반으로 올바르게 동작하도록 합니다.', + ); + + // 안내/경고 + $lang->msg_sync_member = '동기화 버튼을 클릭하시면 회원정보와 게시물정보의 동기화를 시작합니다.'; + $lang->msg_no_xml_file = 'XML파일을 찾을 수 없습니다. 경로를 다시 확인해주세요'; + $lang->msg_invalid_xml_file = '잘못된 형식의 XML파일입니다'; + $lang->msg_importing = '%d개의 데이터중 %d개를 입력중입니다. (계속 멈추어 있으면 "계속진행" 버튼을 클릭해주세요)'; + $lang->msg_import_finished = '%d개의 데이터 입력이 완료되었습니다. 상황에 따라 입력되지 못한 데이터가 있을 수 있습니다.'; + $lang->msg_sync_completed = '회원과 게시물, 댓글의 동기화가 완료되었습니다.'; + + // 주절 주절.. + $lang->about_type_member = '데이터 이전 대상이 회원정보일 경우 선택해주세요'; + $lang->about_type_module = '데이터 이전 대상이 게시판등의 게시물 정보일 경우 선택해주세요'; + $lang->about_type_syncmember = '회원정보와 게시물정보등을 이전후 회원정보 동기화 해야 할때 선택해주세요'; + $lang->about_importer = "제로보드4, zb5beta 또는 다른 프로그램의 데이터를 제로보드XE 데이터로 이전할 수 있습니다.\n이전을 위해서는 XML Exporter를 이용해서 원하는 데이터를 XML파일로 생성후 업로드해주셔야 합니다."; + + $lang->about_target_path = "첨부파일을 받기 위해 제로보드4가 설치된 위치를 입력해주세요.\n같은 서버에 있을 경우 /home/아이디/public_html/bbs 등과 같이 제로보드4의 위치를 입력하시고\n다른 서버일 경우 http://도메인/bbs 처럼 제로보드가 설치된 곳의 url을 입력해주세요"; +?> diff --git a/modules/importer/lang/zh-CN.lang.php b/modules/importer/lang/zh-CN.lang.php new file mode 100644 index 000000000..e659b440a --- /dev/null +++ b/modules/importer/lang/zh-CN.lang.php @@ -0,0 +1,52 @@ +cmd_sync_member = '同步'; + $lang->cmd_continue = '继续进行'; + + // 项目 + $lang->importer = '数据导入'; + $lang->source_type = '导入对象'; + $lang->type_member = '会员信息'; + $lang->type_module = '版面信息'; + $lang->type_syncmember = '同步会员信息'; + $lang->target_module = '模块对象'; + $lang->xml_file = 'XML文件'; + + $lang->import_step_title = array( + 1 => 'Step 1. 选择导入对象', + 12 => 'Step 1-2. 选择模块对象', + 13 => 'Step 1-3. 选择对象分类', + 2 => 'Step 2. 上传XML文件', + 3 => 'Step 2. 同步会员信息和文章信息', + ); + + $lang->import_step_desc = array( + 1 => '请选择要导入的XML文件种类。', + 12 => '请选择要导入的对象模块。', + 13 => '请选择要导入的对象分类。', + 2 => "请输入要导入的XML文件的位置。\n位于同一个服务器时,可输入相对或绝对路径,位于不同服务器时,可输入http://地址。", + 3 => '数据导入后可能会导致会员信息和文章内容信息的误差。这时以user_id进行同步即可解决问题。', + ); + + // 信息/提示 + $lang->msg_sync_member = '按同步按钮即可开始对会员信息和文章信息进行同步。'; + $lang->msg_no_xml_file = '找不到XML文件,请重新确认路径。'; + $lang->msg_invalid_xml_file = '错误形式的XML文件!'; + $lang->msg_importing = '%d个的数据中正在输入 %d个。 (长时间没有响应时请按“继续进行”按钮)'; + $lang->msg_import_finished = '已完成输入%d个数据。根据情况的不同可能有没有被导入的数据。'; + $lang->msg_sync_completed = '已完成会员和文章,评论的同步。'; + + // 说明 + $lang->about_type_member = '数据导入对象为会员信息时请选择'; + $lang->about_type_module = '数据导入对象是版面主题时请选择'; + $lang->about_type_syncmember = '会员信息和文章信息导入后需要同步会员信息时请选择。'; + $lang->about_importer = "不仅可以导入Zeroboard 4,Zb5beta的数据,也可以把其他程序数据导入到Zeroboard XE当中。\n导入数据时请利用 XML Exporter生成XML文件后再上传。"; + + $lang->about_target_path = "为了下载附件请输入Zeroboard 4的安装位置。\n位置在同一个服务器时,请输入如 /home/id/public_html/bbs的路径,在不同服务器时,请输入如 http://域名/bbs的url地址。"; +?> diff --git a/modules/importer/queries/updateCommentSync.xml b/modules/importer/queries/updateCommentSync.xml new file mode 100644 index 000000000..6303d624d --- /dev/null +++ b/modules/importer/queries/updateCommentSync.xml @@ -0,0 +1,12 @@ + + + +
+ + + + + + + + diff --git a/modules/importer/queries/updateDocumentSync.xml b/modules/importer/queries/updateDocumentSync.xml new file mode 100644 index 000000000..d46ec197e --- /dev/null +++ b/modules/importer/queries/updateDocumentSync.xml @@ -0,0 +1,12 @@ + + +
+
+ + + + + + + + diff --git a/modules/importer/tpl/css/importer.css b/modules/importer/tpl/css/importer.css new file mode 100644 index 000000000..cdd6e64a7 --- /dev/null +++ b/modules/importer/tpl/css/importer.css @@ -0,0 +1,3 @@ +@charset "utf-8"; + +#step2_position { height:150px; overflow-y:scroll; border:2px solid #DDDDDD; } diff --git a/modules/importer/tpl/filter/import_xml.xml b/modules/importer/tpl/filter/import_xml.xml new file mode 100644 index 000000000..620edeacf --- /dev/null +++ b/modules/importer/tpl/filter/import_xml.xml @@ -0,0 +1,14 @@ + +
+ + + + + + + + + + + +
diff --git a/modules/importer/tpl/filter/step1.xml b/modules/importer/tpl/filter/step1.xml new file mode 100644 index 000000000..2030a9f7b --- /dev/null +++ b/modules/importer/tpl/filter/step1.xml @@ -0,0 +1,12 @@ + +
+ + + + + + + + + +
diff --git a/modules/importer/tpl/filter/step12.xml b/modules/importer/tpl/filter/step12.xml new file mode 100644 index 000000000..fa56efb05 --- /dev/null +++ b/modules/importer/tpl/filter/step12.xml @@ -0,0 +1,13 @@ + +
+ + + + + + + + + + +
diff --git a/modules/importer/tpl/index.html b/modules/importer/tpl/index.html new file mode 100644 index 000000000..ce1b86d85 --- /dev/null +++ b/modules/importer/tpl/index.html @@ -0,0 +1,136 @@ + + + + + + +

{$lang->importer} {$lang->cmd_management}

+ + +
{nl2br($lang->about_importer)}
+ + +
+
+ +
{$lang->import_step_title[1]}
+
{$lang->import_step_desc[1]}
+ +
+ + + + + + + + + + + + +
{$lang->about_type_module}
{$lang->about_type_member}
{$lang->about_type_syncmember}
+ +
+ +
+ +
+ + + + + + + + + + + + + + + diff --git a/modules/importer/tpl/js/importer_admin.js b/modules/importer/tpl/js/importer_admin.js new file mode 100644 index 000000000..8b6077718 --- /dev/null +++ b/modules/importer/tpl/js/importer_admin.js @@ -0,0 +1,137 @@ +/** + * @file modules/importer/js/importer_admin.js + * @author zero (zero@nzeo.com) + * @brief importer에서 사용하는 javascript + **/ + +/* Step 1 처리 */ +function completeStep1(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var next_step = ret_obj['next_step']; + var module_list = ret_obj['module_list']; + + if(module_list) { + var sel = xGetElementById("target_module"); + var module_list_arr = module_list.split("\n"); + for(var i=0;i0) { + var module_srl = sel_module.options[sel_module.selectedIndex].value; + fo_obj.module_srl.value = module_srl; + } + + var sel_category = xGetElementById("target_category"); + if(sel_category.options.length>1) { + var category_srl = sel_category.options[sel_category.selectedIndex].value; + fo_obj.category_srl.value = category_srl; + } + + var target_path = xGetElementById("target_path").value; + fo_obj.target_path.value = target_path; + + procFilter(fo_obj, import_xml); + + + xGetElementById('step2_status').style.display = 'block'; + return false; +} + +/* Step Complete Import */ +function completeImport(ret_obj) { + var message = ret_obj['message']; + var is_finished = ret_obj['is_finished']; + var position = ret_obj['position']; + var file_point = ret_obj['file_point']; + var total_count = ret_obj['total_count']; + + if(total_count>0) { + var bar = xGetElementById('bar'); + var status = xGetElementById('bar_status'); + var per = parseInt(position/total_count*100,10) + xInnerHtml(status, position+'/'+total_count+' ('+per+'%)'); + bar.style.width = per+'%'; + } + + if(is_finished=='Y') { + alert(ret_obj["message"]); + location.href = location.href; + } else { + var fo_obj = xGetElementById('fo_step2'); + fo_obj.position.value = position; + fo_obj.file_point.value = file_point; + fo_obj.total_count.value = total_count; + message = message.replace(/</g,"<").replace(/>/g,">"); + + var obj = xGetElementById('step2_position'); + var txt = xInnerHtml(obj); + if(txt.length > 1024*10) txt = ''; + if(message != "success") xInnerHtml(obj, txt+message); + obj.scrollTop += xHeight(obj); + procFilter(fo_obj, import_xml); + } +} + +function doManualProcess() { + var fo_obj = xGetElementById('fo_step2'); + procFilter(fo_obj, import_xml); +} + +/* 회원정보와 게시물의 싱크 */ +function doStep3(fo_obj) { + exec_xml('importer','procImporterAdminSync', new Array(), completeStep3); + return false; +} + +function completeStep3(ret_obj) { + alert(ret_obj['message']); + location.href=location.href; +} diff --git a/modules/install/conf/info.xml b/modules/install/conf/info.xml new file mode 100644 index 000000000..0ed3dcd71 --- /dev/null +++ b/modules/install/conf/info.xml @@ -0,0 +1,17 @@ + + + 설치관리 + Manage installation + 安装管理 + インストール管理 + + 제로 + Zero + zero + Zero + 설치 관리 모듈 + Module for managing installation + 安装管理模块。 + インストール管理モジュール + + diff --git a/modules/install/conf/module.xml b/modules/install/conf/module.xml new file mode 100644 index 000000000..e1cff33fa --- /dev/null +++ b/modules/install/conf/module.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/modules/install/install.admin.controller.php b/modules/install/install.admin.controller.php new file mode 100644 index 000000000..3127efd4c --- /dev/null +++ b/modules/install/install.admin.controller.php @@ -0,0 +1,64 @@ +installModule($module_name, './modules/'.$module_name); + + $this->setMessage('success_installed'); + } + + /** + * @brief 모듈 업데이트 + **/ + function procInstallAdminUpdate() { + $module_name = Context::get('module_name'); + if(!$module_name) return new object(-1, 'invalid_request'); + + $oModule = &getModule($module_name, 'class'); + if($oModule) $output = $oModule->moduleUpdate(); + else $output = new Object(-1, 'invalid_request'); + + return $output; + } + + /** + * @brief time zone변경 + **/ + function procInstallAdminSaveTimeZone() { + $use_rewrite = Context::get('use_rewrite'); + if($use_rewrite!='Y') $use_rewrite = 'N'; + $time_zone = Context::get('time_zone'); + + $db_info = Context::getDBInfo(); + $db_info->time_zone = $time_zone; + $db_info->use_rewrite = $use_rewrite; + $db_info->lang_type = Context::getLangType(); + Context::setDBInfo($db_info); + + $oInstallController = &getController('install'); + $oInstallController->makeConfigFile(); + + $this->setMessage('success_updated'); + } + } +?> diff --git a/modules/install/install.class.php b/modules/install/install.class.php new file mode 100644 index 000000000..8695ccd86 --- /dev/null +++ b/modules/install/install.class.php @@ -0,0 +1,32 @@ + diff --git a/modules/install/install.controller.php b/modules/install/install.controller.php new file mode 100644 index 000000000..6b6b993c7 --- /dev/null +++ b/modules/install/install.controller.php @@ -0,0 +1,198 @@ +is_admin = 'Y'; + $_SESSION['logged_info'] = $logged_info; + Context::set('logged_info', $logged_info); + + // DB와 관련된 변수를 받음 + $db_info = Context::gets('db_type','db_port','db_hostname','db_userid','db_password','db_database','db_table_prefix','time_zone','use_rewrite'); + if($db_info->use_rewrite!='Y') $db_info->use_rewrite = 'N'; + $db_info->lang_type = Context::getLangType(); + + // DB의 타입과 정보를 등록 + Context::setDBInfo($db_info); + + // DB Instance 생성 + $oDB = &DB::getInstance(); + + // DB접속이 가능한지 체크 + if(!$oDB->isConnected()) return $oDB->getError(); + + $oDB->begin(); + + // 모든 모듈의 설치 + $this->installDownloadedModule(); + + $oDB->commit(); + + // config 파일 생성 + if(!$this->makeConfigFile()) return new Object(-1, 'msg_install_failed'); + + // 설치 완료 메세지 출력 + $this->setMessage('msg_install_completed'); + } + + /** + * @brief 인스톨 환경을 체크하여 결과 return + **/ + function checkInstallEnv() { + // 각 필요한 항목 체크 + $checklist = array(); + + // 0. php 버전 체크 (5.2.2는 설치 불가) + if(phpversion()=='5.2.2') $checklist['php_version'] = false; + else $checklist['php_version'] = true; + + // 1. permission 체크 + if(is_writable('./')||is_writable('./files')) $checklist['permission'] = true; + else $checklist['permission'] = false; + + // 2. xml_parser_create함수 유무 체크 + if(function_exists('xml_parser_create')) $checklist['xml'] = true; + else $checklist['xml'] = false; + + // 3. ini_get(session.auto_start)==1 체크 + if(ini_get(session.auto_start)!=1) $checklist['session'] = true; + else $checklist['session'] = false; + + // 4. iconv 체크 + if(function_exists('iconv')) $checklist['iconv'] = true; + else $checklist['iconv'] = false; + + // 5. gd 체크 (imagecreatefromgif함수) + if(function_exists('imagecreatefromgif')) $checklist['gd'] = true; + else $checklist['gd'] = false; + + if(!$checklist['php_version'] || !$checklist['permission'] || !$checklist['xml'] || !$checklist['session']) $install_enable = false; + else $install_enable = true; + + // 체크 결과를 Context에 저장 + Context::set('checklist', $checklist); + Context::set('install_enable', $install_enable); + + return $install_enable; + } + + /** + * @brief files 및 하위 디렉토리 생성 + * DB 정보를 바탕으로 실제 install하기 전에 로컬 환경 설저d + **/ + function makeDefaultDirectory() { + $directory_list = array( + './files/config', + './files/cache/queries', + './files/cache/js_filter_compiled', + './files/cache/template_compiled', + ); + + foreach($directory_list as $dir) { + FileHandler::makeDir($dir); + } + } + + /** + * @brief 모든 모듈의 설치 + * + * 모든 module의 schemas 디렉토리를 확인하여 schema xml을 이용, 테이블 생성 + **/ + function installDownloadedModule() { + // 수동으로 설치를 할 목록 + $manual_modules = array('install','module','member'); + + // install, module 모듈은 미리 설치 + $this->installModule('install', './modules/install/'); + $this->installModule('module', './modules/module/'); + $this->installModule('member', './modules/member/'); + + // 각 모듈의 schemas/*.xml 파일을 모두 찾아서 table 생성 + $module_list = FileHandler::readDir('./modules/', NULL, false, true); + foreach($module_list as $module_path) { + // 모듈 이름을 구함 + $tmp_arr = explode('/',$module_path); + $module = $tmp_arr[count($tmp_arr)-1]; + + // 미리 수동으로 설치한 모듈이면 패스~ + if(in_array($module, $manual_modules)) continue; + + $this->installModule($module, $module_path); + } + + return new Object(); + } + + /** + * @brief 개별 모듈의 설치 + **/ + function installModule($module, $module_path) { + // db instance생성 + $oDB = &DB::getInstance(); + + // 해당 모듈의 schemas 디렉토리를 검사하여 schema xml파일이 있으면 생성 + $schema_dir = sprintf('%s/schemas/', $module_path); + $schema_files = FileHandler::readDir($schema_dir, NULL, false, true); + + $file_cnt = count($schema_files); + for($i=0;$i<$file_cnt;$i++) { + $file = trim($schema_files[$i]); + if(!$file || substr($file,-4)!='.xml') continue; + $output = $oDB->createTableByXmlFile($file); + } + + // 테이블 설치후 module instance를 만들고 install() method를 실행 + unset($oModule); + $oModule = &getClass($module); + if(method_exists($oModule, 'moduleInstall')) $oModule->moduleInstall(); + + return new Object(); + } + + /** + * @brief config 파일을 생성 + * 모든 설정이 이상없이 끝난 후에 config파일 생성 + **/ + function makeConfigFile() { + $config_file = Context::getConfigFile(); + //if(file_exists($config_file)) return; + + $db_info = Context::getDbInfo(); + if(!$db_info) return; + + $buff = ' $val) { + $buff .= sprintf("\$db_info->%s = \"%s\";\n", $key, $val); + } + $buff .= "?>"; + + FileHandler::writeFile($config_file, $buff); + + if(@file_exists($config_file)) return true; + return false; + } + } +?> diff --git a/modules/install/install.view.php b/modules/install/install.view.php new file mode 100644 index 000000000..93359eec4 --- /dev/null +++ b/modules/install/install.view.php @@ -0,0 +1,73 @@ +setTemplatePath($this->module_path.'tpl'); + + // 설치가 되어 있으면 오류 + if(Context::isInstalled()) return $this->stop('msg_already_installed'); + + // 컨트롤러 생성 + $oInstallController = &getController('install'); + $this->install_enable = $oInstallController->checkInstallEnv(); + + // 설치 가능한 환경이라면 installController::makeDefaultDirectory() 실행 + if($this->install_enable) $oInstallController->makeDefaultDirectory(); + } + + /** + * @brief license 메세지 노출 + **/ + function dispInstallIntroduce() { + $this->setTemplateFile('introduce'); + } + + /** + * @brief 설치 환경에 대한 메세지 보여줌 + **/ + function dispInstallCheckEnv() { + $this->setTemplateFile('check_env'); + } + + + /** + * @brief DB 선택 화면 + **/ + function dispInstallSelectDB() { + // 설치 불가능하다면 check_env를 출력 + if(!$this->install_enable) return $this->dispInstallCheckEnv(); + + $this->setTemplateFile('select_db'); + } + + /** + * @brief DB 정보/ 최고 관리자 정보 입력 화면을 보여줌 + **/ + function dispInstallForm() { + // 설치 불가능하다면 check_env를 출력 + if(!$this->install_enable) return $this->dispInstallCheckEnv(); + + // db_type이 지정되지 않았다면 다시 초기화면 출력 + if(!Context::get('db_type')) return $this->dispInstallSelectDB(); + + Context::set('time_zone', $GLOBALS['time_zone']); + + // disp_db_info_form.html 파일 출력 + $tpl_filename = sprintf('form.%s', Context::get('db_type')); + $this->setTemplateFile($tpl_filename); + } + + } +?> diff --git a/modules/install/lang/en.lang.php b/modules/install/lang/en.lang.php new file mode 100644 index 000000000..643f44d4a --- /dev/null +++ b/modules/install/lang/en.lang.php @@ -0,0 +1,181 @@ +introduce_title = 'Zeroboard XE Installation'; + $lang->license = <<http://www.zeroboard.com +- Author : zero (zero@zeroboard.com, http://www.zeroboard.com) + +This program is a free software that follows GPL license. +But when skin with design element is included, owner of the skin may apply their own individual license. + +GNU GENERAL PUBLIC LICENSE + +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation\'s software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. + +Also, for each author\'s protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors\' reputations. + +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone\'s free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification follow. +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program\'s source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. +b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. +c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, +b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, +c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients\' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +END OF TERMS AND CONDITIONS + + + + + +EndOfLicense; + + $lang->install_condition_title = "Please check the installation requirement."; + + $lang->install_checklist_title = array( + 'php_version' => 'PHP Version', + 'permission' => 'Permission', + 'xml' => 'XML Library', + 'iconv' => 'ICONV Library', + 'gd' => 'GD Library', + 'session' => 'Session.auto_start setting', + ); + + $lang->install_checklist_desc = array( + 'php_version' => '[Required] If PHP version is 5.2.2, zeroboard will not be installed because of bug', + 'permission' => '[Required] Zeroboard installation path or ./files directory\'s permission must be 707', + 'xml' => '[Required] XML Library is needed for XML communication', + 'session' => '[Required] PHP setting file\'s (php.ini) \'Session.auto_start\' must equal to zero in order for zeroboard to use the session', + 'iconv' => 'Iconv should be installed in order to convert UTF-8 and other language set', + 'gd' => 'GD Library should be installed in order to use image convert function', + ); + + $lang->install_checklist_xml = 'Install XML Library'; + $lang->install_without_xml = 'XML Library is not installed'; + $lang->install_checklist_gd = 'Install GD Library'; + $lang->install_without_gd = 'GD Library is not installed for image convertion'; + $lang->install_checklist_gd = 'Intall GD Library'; + $lang->install_without_iconv = 'Iconv Library is not installed for processing characters'; + $lang->install_session_auto_start = 'Possible problems might occur due to the php setting. session.auto_start is equal to 1'; + $lang->install_permission_denied = 'Installation path\'s permission doesn\'t equal to 707'; + + $lang->cmd_agree_license = 'I agree with the license'; + $lang->cmd_install_fix_checklist = 'I have fixed the required conditions.'; + $lang->cmd_install_next = 'Continue installation'; + + $lang->db_desc = array( + 'mysql' => 'Using mysql*() function to use mysql DB.
Transaction is disabled because DB file is created by myisam.', + 'mysql_innodb' => 'Using innodb to use mysql DB.
Transaction is enabled for innodb', + 'sqlite2' => 'Supporting sqlite2 which saves the data into the file.
When installing, DB file should be created at unreachable place from web.
(Never got tested on stabilization)', + 'sqlite3_pdo' => 'Suppots sqlite3 by PHP\'s PDO.
When installing, DB file should be created at unreachable place from web.', + 'cubrid' => 'Use CUBRID DB.
(Never got tested on stabilization and didn\'t get tuned.)', + ); + + $lang->form_title = 'Please input DB & Admin information'; + $lang->db_title = 'Please input DB information'; + $lang->db_type = 'DB Type'; + $lang->select_db_type = 'Please select the DB you want to use.'; + $lang->db_hostname = 'DB Hostname'; + $lang->db_port = 'DB Port'; + $lang->db_userid = 'DB ID'; + $lang->db_password = 'DB Password'; + $lang->db_database = 'DB Database'; + $lang->db_database_file = 'DB Database file'; + $lang->db_table_prefix = 'Table header'; + + $lang->admin_title = 'Administrator Info'; + + $lang->env_title = 'Configuration'; + $lang->use_rewrite = 'Use rewrite mod'; + $lang->about_rewrite = "If web server provides rewrite mod, long URL such as http://blah/?document_srl=123 can be shortened like http://blah/123"; + $lang->time_zone = 'Time zone'; + $lang->about_time_zone = "If the server time and the time on your location don't accord each other, you can set the time as same as your location by using time zone "; + + $lang->about_database_file = 'Sqlite saves data in the file. Location of the database file should be unreachable by web
Data file should be inside the permission of 707.'; + + $lang->success_installed = 'Installation Complete'; + $lang->success_updated = 'Update Complete'; + + $lang->msg_cannot_proc = 'Unabled to execute the request because installation environment is not provided'; + $lang->msg_already_installed = 'Zeroboard is already installed'; + $lang->msg_dbconnect_failed = "Error has occurred while connecting DB.\nPlease check DB information again"; + $lang->msg_table_is_exists = "Table is already created in the DB.\nConfig file is recreated"; + $lang->msg_install_completed = "Installation complete.\nThank you for choosing ZeroboardXE"; + $lang->msg_install_failed = "Error has occurred while creating installation file."; +?> diff --git a/modules/install/lang/jp.lang.php b/modules/install/lang/jp.lang.php new file mode 100644 index 000000000..ed0fded59 --- /dev/null +++ b/modules/install/lang/jp.lang.php @@ -0,0 +1,274 @@ +introduce_title = 'ゼロボードXEのインストール'; + $lang->license = <<http://www.zeroboard.com +- 作者:zero (zero@zeroboard.com, http://www.zeroboard.com) + +このプログラムは、フリーソフトウェアであり、GPLに従うものとします。 +正し、デザインのスキンは、スキン作者が個別的に異なるライセンスを適用することができます。 +翻訳文と原文との内容に相違点がある場合は、原文の内容に従うものとします。 + +GNU 一般公衆利用許諾契約書 - 翻訳文 +バージョン 2、1991年6月 +Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +この利用許諾契約書を、一字一句そのままに複製し頒布することは許可する。しかし変更は認めない。 + + +はじめに +ソフトウェア向けライセンスの大半は、あなたがそのソフトウェアを共有したり変更したりする自由を奪うように設計されています。対照的に、GNU 一般公衆利用許諾契約書は、あなたがフリーソフトウェアを共有したり変更したりする自由を保証する--すなわち、ソフトウェアがそのユーザすべてにとってフリーであることを保証することを目的としています。この一般公衆利用許諾契約書はフリーソフトウェア財団のソフトウェアのほとんどに適用されており、また GNU GPLを適用すると決めたフリーソフトウェア財団以外の作者によるプログラムにも適用されています(いくつかのフリーソフトウェア財団のソフトウェアには、GNU GPLではなくGNU ライブラリ一般公衆利用許諾契約書が適用されています)。あなたもまた、ご自分のプログラムにGNU GPLを適用することが可能です。 + +私たちがフリーソフトウェアと言うとき、それは利用の自由について言及しているのであって、価格は問題にしていません。私たちの一般公衆利用許諾契約書は、あなたがフリーソフトウェアの複製物を頒布する自由を保証するよう設計されています(希望に応じてその種のサービスに手数料を課す自由も保証されます)。また、あなたがソースコードを受け取るか、あるいは望めばそれを入手することが可能であるということ、あなたがソフトウェアを変更し、その一部を新たなフリーのプログラムで利用できるということ、そして、以上で述べたようなことができるということがあなたに知らされるということも保証されます。 + +あなたの権利を守るため、私たちは誰かがあなたの有するこれらの権利を否定することや、これらの権利を放棄するよう要求することを禁止するという制限を加える必要があります。よって、あなたがソフトウェアの複製物を頒布したりそれを変更したりする場合には、そういった制限のためにあなたにある種の責任が発生することになります。 + +例えば、あなたがフリーなプログラムの複製物を頒布する場合、有料か無料に関わらず、あなたは自分が有する権利を全て受領者に与えなければなりません。また、あなたは彼らもソースコードを受け取るか手に入れることができるよう保証しなければなりません。そして、あなたは彼らに対して以下で述べる条件を示し、彼らに自らの持つ権利について知らしめるようにしなければなりません。 + +私たちはあなたの権利を二段階の手順を踏んで保護します。(1) まずソフトウェアに対して著作権を主張し、そして (2) あなたに対して、ソフトウェアの複製や頒布または改変についての法的な許可を与えるこの契約書を提示します。 + +また、各作者や私たちを保護するため、私たちはこのフリーソフトウェアには何の保証も無いということを誰もが確実に理解するようにし、またソフトウェアが誰か他人によって改変され、それが次々と頒布されていったとしても、その受領者は彼らが手に入れたソフトウェアがオリジナルのバージョンでは無いこと、そして原作者の名声は他人によって持ち込まれた可能性のある問題によって影響されることがないということを周知させたいと思います。 + +最後に、ソフトウェア特許がいかなるフリーのプログラムの存在にも不断の脅威を投げかけていますが、私たちは、フリーなプログラムの再頒布者が個々に特許ライセンスを取得することによって、事実上プログラムを独占的にしてしまうという危険を避けたいと思います。こういった事態を予防するため、私たちはいかなる特許も誰もが自由に利用できるようライセンスされるか、全くライセンスされないかのどちらかでなければならないことを明確にしました。 + +複製や頒布、改変についての正確な条件と制約を以下で述べていきます。 + +複製、頒布、改変に関する条件と制約 +0. この利用許諾契約書は、そのプログラム(またはその他の著作物)をこの一般公衆利用許諾契約書の定める条件の下で頒布できる、という告知が著作権者によって記載されたプログラムまたはその他の著作物全般に適用される。以下では、「『プログラム』」とはそのようにしてこの契約書が適用されたプログラムや著作物全般を意味し、また「『プログラム』を基にした著作物」とは『プログラム』やその他著作権法の下で派生物と見なされるもの全般を指す。すなわち、『プログラム』かその一部を、全く同一のままか、改変を加えたか、あるいは他の言語に翻訳された形で含む著作物のことである(「改変」という語の本来の意味からはずれるが、以下では翻訳も改変の一種と見なす)。それぞれの契約者は「あなた」と表現される。 + +複製や頒布、改変以外の活動はこの契約書ではカバーされない。それらはこの契約書の対象外である。『プログラム』を実行する行為自体に制限はない。また、そのような『プログラム』の出力結果は、その内容が『プログラム』を基にした著作物を構成する場合のみこの契約書によって保護される(『プログラム』を実行したことによって作成されたということとは無関係である)。このような線引きの妥当性は、『プログラム』が何をするのかに依存する。 + +1. それぞれの複製物において適切な著作権表示と保証の否認声明(disclaimer of warranty)を目立つよう適切に掲載し、またこの契約書および一切の保証の不在に触れた告知すべてをそのまま残し、そしてこの契約書の複製物を『プログラム』のいかなる受領者にも『プログラム』と共に頒布する限り、あなたは『プログラム』のソースコードの複製物を、あなたが受け取った通りの形で複製または頒布することができる。媒体は問わない。 + +あなたは、物理的に複製物を譲渡するという行為に関して手数料を課しても良いし、希望によっては手数料を取って交換における保護の保証を提供しても良い。 + +2. あなたは自分の『プログラム』の複製物かその一部を改変して『プログラム』を基にした著作物を形成し、そのような改変点や著作物を上記第1節の定める条件の下で複製または頒布することができる。ただし、そのためには以下の条件すべてを満たしていなければならない: + +a) あなたがそれらのファイルを変更したということと変更した日時が良く 分かるよう、改変されたファイルに告示しなければならない。 + +b) 『プログラム』またはその一部を含む著作物、あるいは『プログラム』 かその一部から派生した著作物を頒布あるいは発表する場合には、その 全体をこの契約書の条件に従って第三者へ無償で利用許諾しなけれ ばならない。 + +c) 改変されたプログラムが、通常実行する際に対話的にコマンドを読むよ うになっているならば、そのプログラムを最も一般的な方法で対話的に 実行する際、適切な著作権表示、無保証であること(あるいはあなたが保 証を提供するということ)、ユーザがプログラムをこの契約書で述べた条 件の下で頒布することができるということ、そしてこの契約書の複製物 を閲覧するにはどうしたらよいかというユーザへの説明を含む告知が印 刷されるか、あるいは画面に表示されるようにしなければならない(例外 として、『プログラム』そのものは対話的であっても通常そのような告 知を印刷しない場合には、『プログラム』を基にしたあなたの著作物に そのような告知を印刷させる必要はない)。 + +以上の必要条件は全体としての改変された著作物に適用される。著作物の一部が『プログラム』から派生したものではないと確認でき、それら自身別の独立した著作物であると合理的に考えられるならば、あなたがそれらを別の著作物として分けて頒布する場合、そういった部分にはこの契約書とその条件は適用されない。しかし、あなたが同じ部分を『プログラム』を基にした著作物全体の一部として頒布するならば、全体としての頒布物は、この契約書が課す条件に従わなければならない。というのは、この契約書が他の契約者に与える許可は『プログラム』丸ごと全体に及び、誰が書いたかは関係なく各部分のすべてを保護するからである。 + +よって、すべてあなたによって書かれた著作物に対し、権利を主張したりあなたの権利に異議を申し立てることはこの節の意図するところではない。むしろ、その趣旨は『プログラム』を基にした派生物ないし集合著作物の頒布を管理する権利を行使するということにある。 + +また、『プログラム』を基にしていないその他の著作物を『プログラム』(あるいは『プログラム』を基にした著作物)と一緒に集めただけのものを一巻の保管装置ないし頒布媒体に収めても、その他の著作物までこの契約書が保護する対象になるということにはならない。 + +3. あなたは上記第1節および2節の条件に従い、『プログラム』(あるいは第2節における派生物)をオブジェクトコードないし実行形式で複製または頒布することができる。ただし、その場合あなたは以下のうちどれか一つを実施しなければならない: + +a) 著作物に、『プログラム』に対応した完全かつ機械で読み取り可能なソー スコードを添付する。ただし、ソースコードは上記第1節および2節の条 件に従いソフトウェアの交換で習慣的に使われる媒体で頒布しなければ ならない。あるいは、 + +b) 著作物に、いかなる第三者に対しても、『プログラム』に対応した完全 かつ機械で読み取り可能なソースコードを、頒布に要する物理的コスト を上回らない程度の手数料と引き換えに提供する旨述べた少なくとも3年 間は有効な書面になった申し出を添える。ただし、ソースコードは上記 第1節および2節の条件に従いソフトウェアの交換で習慣的に使われる媒 体で頒布しなければならない。あるいは、 + +c) 対応するソースコード頒布の申し出に際して、あなたが得た情報を一緒 に引き渡す(この選択肢は、営利を目的としない頒布であって、かつあな たが上記小節bで指定されているような申し出と共にオブジェクトコード あるいは実行形式のプログラムしか入手していない場合に限り許可され る)。 + +著作物のソースコードとは、それに対して改変を加える上で好ましいとされる著作物の形式を意味する。ある実行形式の著作物にとって完全なソースコードとは、それが含むモジュールすべてのソースコード全部に加え、関連するインターフェース定義ファイルのすべてとライブラリのコンパイルやインストールを制御するために使われるスクリプトをも加えたものを意味する。しかし特別な例外として、そのコンポーネント自体が実行形式に付随するのでは無い限り、頒布されるものの中に、実行形式が実行されるオペレーティングシステムの主要なコンポーネント(コンパイラやカーネル等)と通常一緒に(ソースかバイナリ形式のどちらかで)頒布されるものを含んでいる必要はないとする。 + +実行形式またはオブジェクトコードの頒布が、指定された場所からコピーするためのアクセス手段を提供することで為されるとして、その上でソースコードも同等のアクセス手段によって同じ場所からコピーできるようになっているならば、第三者がオブジェクトコードと一緒にソースも強制的にコピーさせられるようになっていなくてもソースコード頒布の条件を満たしているものとする。 + +4. あなたは『プログラム』を、この契約書において明確に提示された行為を除き複製や改変、サブライセンス、あるいは頒布してはならない。他に『プログラム』を複製や改変、サブライセンス、あるいは頒布する企てはすべて無効であり、この契約書の下でのあなたの権利を自動的に終結させることになろう。しかし、複製物や権利をこの契約書に従ってあなたから得た人々に関しては、そのような人々がこの契約書に完全に従っている限り彼らのライセンスまで終結することはない。 + +5. あなたはこの契約書を受諾する必要は無い。というのは、あなたはこれに署名していないからである。しかし、この契約書以外にあなたに対して『プログラム』やその派生物を改変または頒布する許可を与えるものは存在しない。これらの行為は、あなたがこの契約書を受け入れない限り法によって禁じられている。そこで、『プログラム』(あるいは『プログラム』を基にした著作物全般) を改変ないし頒布することにより、あなたは自分がそのような行為を行うためにこの契約書を受諾したということ、そして『プログラム』とそれに基づく著作物の複製や頒布、改変についてこの契約書が課す制約と条件をすべて受け入れたということを示したものと見なす。 + +6. あなたが『プログラム』(または『プログラム』を基にした著作物全般)を再頒布するたびに、その受領者は元々のライセンス許可者から、この契約書で指定された条件と制約の下で『プログラム』を複製や頒布、あるいは改変する許可を自動的に得るものとする。あなたは、受領者がここで認められた権利を行使することに関してこれ以上他のいかなる制限も課してはならない。あなたには、第三者がこの契約書に従うことを強制する責任はない。 + +7. 特許侵害あるいはその他の理由(特許関係に限らない)から、裁判所の判決あるいは申し立ての結果としてあなたに(裁判所命令や契約などにより)このライセンスの条件と矛盾する制約が課された場合でも、あなたがこの契約書の条件を免除されるわけではない。もしこの契約書の下であなたに課せられた責任と他の関連する責任を同時に満たすような形で頒布できないならば、結果としてあなたは『プログラム』を頒布することが全くできないということである。例えば特許ライセンスが、あなたから直接間接を問わずコピーを受け取った人が誰でも『プログラム』を使用料無料で再頒布することを認めていない場合、あなたがその制約とこの契約書を両方とも満たすには『プログラム』の頒布を完全に中止するしかないだろう。 + +この節の一部分が特定の状況の下で無効ないし実施不可能な場合でも、節の残りの部分は適用されるよう意図されている。その他の状況では節が全体として適用されるよう意図されている。 + +特許やその他の財産権を侵害したり、そのような権利の主張の効力に異議を唱えたりするようあなたを誘惑することがこの節の目的ではない。この節には、人々によってライセンス慣行として実現されてきた、フリーソフトウェア頒布のシステムの完全性を護るという目的しかない。多くの人々が、フリーソフトウェアの頒布システムが首尾一貫して適用されているという信頼に基づき、このシステムを通じて頒布される多様なソフトウェアに寛大な貢献をしてきたのは事実であるが、人がどのようなシステムを通じてソフトウェアを頒布したいと思うかはあくまでも作者/寄与者次第であり、あなたが選択を押しつけることはできない。 + +この節は、この契約書のこの節以外の部分の一帰結になると考えられるケースを徹底的に明らかにすることを目的としている。 + +8. 『プログラム』の頒布や利用が、ある国においては特許または著作権が主張されたインターフェースのいずれかによって制限されている場合、『プログラム』にこの契約書を適用した元の著作権者は、そういった国々を排除した明確な地理的頒布制限を加え、そこで排除されていない国の中やそれらの国々の間でのみ頒布が許可されるようにしても構わない。その場合、そのような制限はこの契約書本文で書かれているのと同様に見なされる。 + +9. フリーソフトウェア財団は、時によって改訂または新版の一般公衆利用許諾書を発表することができる。そのような新版は現在のバージョンとその精神においては似たものになるだろうが、新たな問題や懸念を解決するため細部では異なる可能性がある。 + +それぞれのバージョンには、見分けが付くようにバージョン番号が振られている。『プログラム』においてそれに適用されるこの契約書のバージョン番号が指定されていて、更に「それ以降のいかなるバージョン(any later version)」も適用して良いとなっていた場合、あなたは従う条件と制約として、指定のバージョンか、フリーソフトウェア財団によって発行された指定のバージョン以降の版のどれか一つのどちらかを選ぶことが出来る。『プログラム』でライセンスのバージョン番号が指定されていないならば、あなたは今までにフリーソフトウェア財団から発行されたバージョンの中から好きに選んで構わない。 + +10. もしあなたが『プログラム』の一部を、その頒布条件がこの契約書と異なる他のフリーなプログラムと統合したいならば、作者に連絡して許可を求めよ。フリーソフトウェア財団が著作権を保有するソフトウェアについては、フリーソフトウェア財団に連絡せよ。私たちは、このような場合のために特別な例外を設けることもある。私たちが決定を下すにあたっては、私たちのフリーソフトウェアの派生物すべてがフリーな状態に保たれるということと、一般的にソフトウェアの共有と再利用を促進するという二つの目標を規準に検討されるであろう。 + +無保証について + +11. 『プログラム』は代価無しに利用が許可されるので、適切な法が認める限りにおいて、『プログラム』に関するいかなる保証も存在しない。書面で別に述べる場合を除いて、著作権者、またはその他の団体は、『プログラム』を、表明されたか言外にかは問わず、商業的適性を保証するほのめかしやある特定の目的への適合性(に限られない)を含む一切の保証無しに「あるがまま」で提供する。『プログラム』の質と性能に関するリスクのすべてはあなたに帰属する。『プログラム』に欠陥があると判明した場合、あなたは必要な保守点検や補修、修正に要するコストのすべてを引き受けることになる。 + +12. 適切な法か書面での同意によって命ぜられない限り、著作権者、または上記で許可されている通りに『プログラム』を改変または再頒布したその他の団体は、あなたに対して『プログラム』の利用ないし利用不能で生じた通常損害や特別損害、偶発損害、間接損害(データの消失や不正確な処理、あなたか第三者が被った損失、あるいは『プログラム』が他のソフトウェアと一緒に動作しないという不具合などを含むがそれらに限らない)に一切の責任を負わない。そのような損害が生ずる可能性について彼らが忠告されていたとしても同様である。 + + +条件と制約終わり + + +GNU 一般公衆利用許諾契約書 - 原文 + +GNU GENERAL PUBLIC LICENSE + +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification follow. +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. +b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. +c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, +b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, +c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +END OF TERMS AND CONDITIONS + + + + + +EndOfLicense; + + $lang->install_condition_title = "インストールするための必須条件を確認してください。"; + + $lang->install_checklist_title = array( + 'php_version' => 'PHPバージョン', + 'permission' => 'パーミッション', + 'xml' => 'XMLライブラリ', + 'iconv' => 'ICONVライブラリ', + 'gd' => 'GDライブラリ', + 'session' => 'Session.auto_start の設定', + ); + + $lang->install_checklist_desc = array( + 'php_version' => '【必須】PHPバージョンが 5.2.2の場合は、PHPのセキュリティバグのため、インストールできません。', + 'permission' => '【必須】ゼロボードのインストールパスまたは「./files」ディレクトリのパーミッションが「707」でなければなりません', + 'xml' => '【必須】XML通信のためにXMLライブラリが必要です', + 'session' => '【必須】ゼロボードでは、セッションを使用しているため、「php.ini」の設定で「session.auto_start=0」にしなければなりません。', + 'iconv' => 'UTF-8と多言語サポート及び文字コード変換のため、「iconv」をインストールする必要があります。', + 'gd' => 'イメージ変換機能を使用するためには、「GD」ライブラリをインストールする必要があります。', + ); + + $lang->install_checklist_xml = 'XMLライブラリのインストール'; + $lang->install_without_xml = 'XMLライブラリがインストールされていません'; + $lang->install_checklist_gd = 'GDライブラリのインストール'; + $lang->install_without_gd = 'イメージ変換用のGDライブラリがインストールされていません'; + $lang->install_checklist_gd = 'GDライブラリのインストール'; + $lang->install_without_iconv = '文字列処理のための「iconv」ライブラリがインストールされていません'; + $lang->install_session_auto_start = 'PHPの設定で「session.auto_start==1」 にするとセッション処理に問題が発生することがあります'; + $lang->install_permission_denied = 'インストールする対象のディレクトリのパーミッションが「707」になっていません'; + + $lang->cmd_agree_license = 'ライセンスに同意します'; + $lang->cmd_install_fix_checklist = 'インストールするための必須条件を設定しました。'; + $lang->cmd_install_next = 'インストールを続けます'; + + $lang->db_desc = array( + 'mysql' => 'MySQL DBで PHPの「mysql*()」関数を利用してデータの入出力を行います。DBは「myisam」タイプで作成されるため、トランザクション処理はできません。', + 'mysql_innodb' => 'MySQL DBで「innodb」タイプでデータの入出力を行います。「innodb」ではトランザクションの処理が行えます。', + 'sqlite2' => 'ファイルタイプデータベースである「sqlite2」をサポートします。インストールの際は、DBファイルはウェブがらアクセスできない場所に作成してください。(安定化までのテストは行われていません)', + 'sqlite3_pdo' => 'PHPのPDOを経由うして「sqlite3」をサポートします。インストールの際は、ウェブからアクセスできない場所に作成してください。', + 'cubrid' => 'CUBRID DBを利用します。
(安定化までのテスト及びチューニングは行われていません)', + ); + + $lang->form_title = 'データベース & 管理者情報入力'; + $lang->db_title = 'データベース情報入力'; + $lang->db_type = 'データベースの種類'; + $lang->select_db_type = '使用するデータベースを選択してください。'; + $lang->db_hostname = 'ホスト名'; + $lang->db_port = 'ポート番号'; + $lang->db_userid = 'ユーザID'; + $lang->db_password = 'パスワード'; + $lang->db_database = 'データベース名'; + $lang->db_database_file = 'データベースファイル'; + $lang->db_table_prefix = 'テーブルプレフィックス'; + + $lang->admin_title = '管理者情報'; + + $lang->env_title = '環境設定'; + $lang->use_rewrite = 'リライトモジュール使用'; + $lang->about_rewrite = 'Webサーバで「リライトモジュール(mod_rewrite)」をサポートしている場合は、「http://アドレス/?document_srl=123」のようなアドレスを「http://アドレス/123」のように簡単にすることができます。'; + $lang->time_zone = 'タイムゾーン'; + $lang->about_time_zone = 'サーバの設定時間とサービスしているローカル時間との差が生じる場合、タイムゾーンを指定すれば、表示時間をWebサービスをしているローカル時間に設定できます。'; + + $lang->about_database_file = 'Sqliteはファイルにデータを保存します。そのため、データベースファイルにはウェブからアクセスできない場所にしなければなりません。
データファイルのパーミッションは「707」に設定してください。'; + + $lang->success_installed = '正常にインストールされました。'; + $lang->success_updated = '正常にアップデートされました。'; + + $lang->msg_cannot_proc = 'インストールできる環境が整っていないため、リクエストを実行できませんでした。'; + $lang->msg_already_installed = '既にインストールされています。'; + $lang->msg_dbconnect_failed = "データベースの接続エラーです。\nデータベースの情報をもう一度確認してください。"; + $lang->msg_table_is_exists = "既にデータベースにデーブルが作成されています。\nconfigファイルを再作成しました。"; + $lang->msg_install_completed = "インストールが完了しました。\nありがとうございます。"; + $lang->msg_install_failed = "インストールファイルを作成する際にエラーが発生しました。"; +?> diff --git a/modules/install/lang/ko.lang.php b/modules/install/lang/ko.lang.php new file mode 100644 index 000000000..8bcf3750c --- /dev/null +++ b/modules/install/lang/ko.lang.php @@ -0,0 +1,273 @@ +introduce_title = '제로보드 XE 설치'; + $lang->license = <<http://www.zeroboard.com +- 원저작자 : zero (zero@zeroboard.com, http://www.zeroboard.com) + +이 프로그램은 자유 소프트웨어 이며 GPL을 따릅니다. +단 디자인 요소가 첨부된 스킨의 경우는 해당 스킨 제작자가 개별적인 라이센스를 적용할 수 있습니다. +번역문과 원문의 내용상 차이가 발생시 원문의 내용을 따르게 됩니다. + +GNU 일반 공중 사용 허가서 - 번역문 +2판, 1991년 6월 +Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +누구든지 본 사용 허가서를 있는 그대로 복제하고 배포할 수 있습니다. 그러나 본문에 대한 수정은 허용되지 않습니다. + +전 문 + +소프트웨어에 적용되는 대부분의 사용 허가서(license)들은 소프트웨어에 대한 수정과 공유의 자유를 제한하려는 것을 그 목적으로 합니다. 그러나 GNU 일반 공중 사용 허가서(이하, ``GPL''이라고 칭합니다.)는 자유 소프트웨어에 대한 수정과 공유의 자유를 모든 사용자들에게 보장하기 위해서 성립된 것입니다. 자유 소프트웨어 재단이 제공하는 대부분의 소프트웨어들은 GPL에 의해서 관리되고 있으며, 몇몇 소프트웨어에는 별도의 사용 허가서인 GNU 라이브러리 일반 공중 사용 허가서(GNU Library General Public License)를 대신 적용하기도 합니다. 자유 소프트웨어란, 이를 사용하려고 하는 모든 사람에 대해서 동일한 자유와 권리가 함께 양도되는 소프트웨어를 말하며 프로그램 저작자의 의지에 따라 어떠한 종류의 프로그램에도 GPL을 적용할 수 있습니다. 따라서 여러분이 만든 프로그램에도 GPL을 적용할 수 있습니다. + +자유 소프트웨어를 언급할 때 사용되는 ``자유''라는 단어는 무료(無料)를 의미하는 금전적인 측면의 자유가 아니라 구속되지 않는다는 관점에서의 자유를 의미하며, GPL은 자유 소프트웨어를 이용한 복제와 개작, 배포와 수익 사업 등의 가능한 모든 형태의 자유를 실질적으로 보장하고 있습니다. 여기에는 원시 코드(source code)의 전부 또는 일부를 원용해서 개선된 프로그램을 만들거나 새로운 프로그램을 창작할 수 있는 자유가 포함되며, 자신에게 양도된 이러한 자유와 권리를 보다 명확하게 인식할 수 있도록 하기 위한 규정도 포함되어 있습니다. + +GPL은 GPL 안에 소프트웨어를 양도받을 사용자의 권리를 제한하는 조항과 단서를 별항으로 추가시키지 못하게 함으로써 사용자들의 자유와 권리를 실제적으로 보장하고 있습니다. 자유 소프트웨어의 개작과 배포에 관계하고 있는 사람들은 이러한 무조건적인 권리 양도 규정을 준수해야만 합니다. + +예를 들어 GPL 프로그램을 배포할 경우에는 프로그램의 유료 판매나 무료 배포에 관계없이 자신이 해당 프로그램에 대해서 가질 수 있었던 모든 권리를, 프로그램을 받게될 사람에게 그대로 양도해 주어야 합니다. 이 경우, 프로그램의 원시 코드를 함께 제공하거나 원시 코드를 구할 수 있는 방법을 확실히 알려주어야 하고 이러한 모든 사항들을 사용자들이 분명히 알 수 있도록 명시해야 합니다. + +자유 소프트웨어 재단은 다음과 같은 두 가지 단계를 통해서 사용자들을 권리를 보호합니다. (1) 소프트웨어에 저작권을 설정합니다. (2) 저작권의 양도에 관한 실정법에 의해서 유효한 법률적 효력을 갖는 GPL을 통해 소프트웨어를 복제하거나 개작 및 배포할 수 있는 권리를 사용자들에게 부여합니다. + +자유 소프트웨어를 사용하는 사람들은 반복적인 재배포 과정을 통해 소프트웨어 자체에 수정과 변형이 일어날 수도 있으며, 이는 최초의 저작자가 만든 소프트웨어가 갖고 있는 문제가 아닐 수 있다는 개연성을 인식하고 있어야 합니다. 우리는 개작과 재배포 과정에서 다른 사람에 의해 발생된 문제로 인해 프로그램 원저작자들의 신망이 훼손되는 것을 원하지 않습니다. GPL에 자유 소프트웨어에 대한 어떠한 형태의 보증도 규정하지 않는 이유는 이러한 점들이 고려되었기 때문이며, 이는 프로그램 원저작자와 자유 소프트웨어 재단의 자유로운 활동을 보장하는 현실적인 수단이기도 합니다. + +특허 제도는 자유 소프트웨어의 발전을 위협하는 요소일 수밖에 없습니다. 자유 프로그램을 재배포하는 사람들이 개별적으로 특허를 취득하게 되면, 결과적으로 그 프로그램이 독점 소프트웨어가 될 가능성이 있습니다. 자유 소프트웨어 재단은 이러한 문제에 대처하기 위해서 어떠한 특허에 대해서도 그 사용 권리를 모든 사람들(이하, ``공중(公衆)''이라고 칭합니다.)에게 자유롭게 허용하는 경우에 한해서만 자유 소프트웨어와 함께 사용할 수 있다는 것을 명확히 밝히고 있습니다. + +복제(copying)와 개작(modification) 및 배포(distribution)에 관련된 구체적인 조건과 규정은 다음과 같습니다. + +복제와 개작 및 배포에 관한 조건과 규정 + +제 0 조. 본 허가서는 GNU 일반 공중 사용 허가서의 규정에 따라 배포될 수 있다는 사항이 저작권자에 의해서 명시된 모든 컴퓨터 프로그램 저작물에 대해서 동일하게 적용됩니다. 컴퓨터 프로그램 저작물(이하, ``프로그램''이라고 칭합니다.)이란 특정한 결과를 얻기 위해서 컴퓨터 등의 정보 처리 능력을 가진 장치(이하, ``컴퓨터''라고 칭합니다.) 내에서 직접 또는 간접으로 사용되는 일련의 지시 및 명령으로 표현된 창작물을 의미하고, ``2차적 프로그램''이란 전술한 프로그램 자신 또는 저작권법의 규정에 따라 프로그램의 전부 또는 상당 부분을 원용하거나 다른 언어로의 번역을 포함할 수 있는 개작 과정을 통해서 창작된 새로운 프로그램과 이와 관련된 저작물을 의미합니다. (이후로 다른 언어로의 번역은 별다른 제한없이 개작의 범위에 포함되는 것으로 간주합니다.) ``피양도자''란 GPL의 규정에 따라 프로그램을 양도받은 사람을 의미하고, ``원(原)프로그램''이란 프로그램을 개작하거나 2차적 프로그램을 만들기 위해서 사용된 최초의 프로그램을 의미합니다. + +본 허가서는 프로그램에 대한 복제와 개작 그리고 배포 행위에 대해서만 적용됩니다. 따라서 프로그램을 실행시키는 행위에 대한 제한은 없습니다. 프로그램의 결과물(output)에는, 그것이 프로그램을 실행시켜서 생성된 것인지 아닌지의 여부에 상관없이 결과물의 내용이 원프로그램으로부터 파생된 2차적 프로그램을 구성했을 때에 한해서 본 허가서의 규정들이 적용됩니다. 2차적 프로그램의 구성 여부는 2차적 프로그램 안에서의 원프로그램의 역할을 토대로 판단합니다. + +제 1 조. 적절한 저작권 표시와 프로그램에 대한 보증이 제공되지 않는다는 사실을 각각의 복제물에 명시하는 한, 피양도자는 프로그램의 원시 코드를 자신이 양도받은 상태 그대로 어떠한 매체를 통해서도 복제하고 배포할 수 있습니다. 복제와 배포가 이루어 질 때는 본 허가서와 프로그램에 대한 보증이 제공되지 않는다는 사실에 대해서 언급되었던 모든 내용을 그대로 유지시켜야 하며, 영문판 GPL을 함께 제공해야 합니다. + +배포자는 복제물을 물리적으로 인도하는데 소요된 비용을 청구할 수 있으며, 선택 사항으로 독자적인 유료 보증을 설정할 수 있습니다. + +제 2 조. 피양도자는 자신이 양도받은 프로그램의 전부나 일부를 개작할 수 있으며, 이를 통해서 2차적 프로그램을 창작할 수 있습니다. 개작된 프로그램이나 창작된 2차적 프로그램은 다음의 사항들을 모두 만족시키는 조건에 한해서, 제1조의 규정에 따라 또다시 복제되고 배포될 수 있습니다. + +제 1 항. 파일을 개작할 때는 파일을 개작한 사실과 그 날짜를 파일 안에 명시해야 합니다. + +제 2 항. 배포하거나 공표하려는 저작물의 전부 또는 일부가 양도받은 프로그램으로부터 파생된 것이라면, 저작물 전체에 대한 사용 권리를 본 허가서의 규정에 따라 공중에게 무상으로 허용해야 합니다. + +제 3 항. 개작된 프로그램의 일반적인 실행 형태가 대화형 구조로 명령어를 읽어 들이는 방식을 취하고 있을 경우에는, 적절한 저작권 표시와 프로그램에 대한 보증이 제공되지 않는다는 사실, (별도의 보증을 설정한 경우라면 해당 내용) 그리고 양도받은 프로그램을 본 규정에 따라 재배포할 수 있다는 사실과 GPL 사본을 참고할 수 있는 방법이 함께 포함된 문구가 프로그램이 대화형 구조로 평이하게 실행된 직후에 화면 또는 지면으로 출력되도록 작성되어야 합니다. (예외 규정: 양도받은 프로그램이 대화형 구조를 갖추고 있다 하더라도 통상적인 실행 환경에서 전술한 사항들이 출력되지 않는 형태였을 경우에는 이를 개작한 프로그램 또한 관련 사항들을 출력시키지 않아도 무방합니다.) + +위의 조항들은 개작된 프로그램 전체에 적용됩니다. 만약, 개작된 프로그램에 포함된 특정 부분이 원프로그램으로부터 파생된 것이 아닌 별도의 독립 저작물로 인정될 만한 상당한 이유가 있을 경우에는 해당 저작물의 개별적인 배포에는 본 허가서의 규정들이 적용되지 않습니다. 그러나 이러한 저작물이 2차적 프로그램의 일부로서 함께 배포된다면 개별적인 저작권과 배포 기준에 상관없이 저작물 모두에 본 허가서가 적용되어야 하며, 전체 저작물에 대한 사용 권리는 공중에게 무상으로 양도됩니다. + +이러한 규정은 개별적인 저작물에 대한 저작자의 권리를 침해하거나 인정하지 않으려는 것이 아니라, 원프로그램으로부터 파생된 2차적 프로그램이나 수집 저작물의 배포를 일관적으로 규제할 수 있는 권리를 행사하기 위한 것입니다. + +원프로그램이나 원프로그램으로부터 파생된 2차적 프로그램을 이들로부터 파생되지 않은 다른 저작물과 함께 단순히 저장하거나 배포할 목적으로 동일한 매체에 모아 놓은 집합물의 경우에는, 원프로그램으로부터 파생되지 않은 다른 저작물에는 본 허가서의 규정들이 적용되지 않습니다. + +제 3 조. 피양도자는 다음 중 하나의 항목을 만족시키는 조건에 한해서 제1조와 제2조의 규정에 따라 프로그램(또는 제2조에서 언급된 2차적 프로그램)을 목적 코드(object code)나 실행물(executable form)의 형태로 복제하고 배포할 수 있습니다. + +제 1 항. 목적 코드나 실행물에 상응하는 컴퓨터가 인식할 수 있는 완전한 원시 코드를 함께 제공해야 합니다. 원시 코드는 제1조와 제2조의 규정에 따라 배포될 수 있어야 하며, 소프트웨어의 교환을 위해서 일반적으로 사용되는 매체를 통해 제공되어야 합니다. + +제 2 항. 배포에 필요한 최소한의 비용만을 받고 목적 코드나 실행물에 상응하는 완전한 원시 코드를 배포하겠다는, 최소한 3년간 유효한 약정서를 함께 제공해야 합니다. 이 약정서는 약정서를 갖고 있는 어떠한 사람에 대해서도 유효해야 합니다. 원시 코드는 컴퓨터가 인식할 수 있는 형태여야 하고 제1조와 제2조의 규정에 따라 배포될 수 있어야 하며, 소프트웨어의 교환을 위해서 일반적으로 사용되는 매체를 통해 제공되어야 합니다. + +제 3 항. 목적 코드나 실행물에 상응하는 원시 코드를 배포하겠다는 약정에 대해서 자신이 양도받은 정보를 함께 제공해야 합니다. (제3항은 위의 제2항에 따라 원시 코드를 배포하겠다는 약정을 프로그램의 목적 코드나 실행물과 함께 제공 받았고, 동시에 비상업적인 배포를 하고자 할 경우에 한해서만 허용됩니다.) + +저작물에 대한 원시 코드란 해당 저작물을 개작하기에 적절한 형식을 의미합니다. 실행물에 대한 완전한 원시 코드란 실행물에 포함된 모든 모듈들의 원시 코드와 이와 관련된 인터페이스 정의 파일 모두, 그리고 실행물의 컴파일과 설치를 제어하는데 사용된 스크립트 전부를 의미합니다. 그러나 특별한 예외의 하나로서, 실행물이 실행될 운영체제의 주요 부분(컴파일러나 커널 등)과 함께 (원시 코드나 바이너리의 형태로) 일반적으로 배포되는 구성 요소들은 이러한 구성 요소 자체가 실행물에 수반되지 않는 한 원시 코드의 배포 대상에서 제외되어도 무방합니다. + +목적 코드나 실행물을 지정한 장소로부터 복제해 갈 수 있게 하는 방식으로 배포할 경우, 동일한 장소로부터 원시 코드를 복제할 수 있는 동등한 접근 방법을 제공한다면 이는 원시 코드를 목적 코드와 함께 복제되도록 설정하지 않았다고 하더라도 원시 코드를 배포하는 것으로 간주됩니다. + +제 4 조. 본 허가서에 의해 명시적으로 이루어 지지 않는 한 프로그램에 대한 복제와 개작 및 하위 허가권 설정과 배포가 성립될 수 없습니다. 이와 관련된 어떠한 행위도 무효이며 본 허가서가 보장한 권리는 자동으로 소멸됩니다. 그러나 본 허가서의 규정에 따라 프로그램의 복제물이나 권리를 양도받았던 제3자는 본 허가서의 규정들을 준수하는 한, 배포자의 권리 소멸에 관계없이 사용상의 권리를 계속해서 유지할 수 있습니다. + +제 5 조. 본 허가서는 서명이나 날인이 수반되는 형식을 갖고 있지 않기 때문에 피양도자가 본 허가서의 내용을 반드시 받아들여야 할 필요는 없습니다. 그러나 프로그램이나 프로그램에 기반한 2차적 프로그램에 대한 개작 및 배포를 허용하는 것은 본 허가서에 의해서만 가능합니다. 만약 본 허가서에 동의하지 않을 경우에는 이러한 행위들이 법률적으로 금지됩니다. 따라서 프로그램(또는 프로그램에 기반한 2차적 프로그램)을 개작하거나 배포하는 행위는 이에 따른 본 허가서의 내용에 동의한다는 것을 의미하며, 복제와 개작 및 배포에 관한 본 허가서의 조건과 규정들을 모두 받아들이겠다는 의미로 간주됩니다. + +제 6 조. 피양도자에 의해서 프로그램(또는 프로그램에 기반한 2차적 프로그램)이 반복적으로 재배포될 경우, 각 단계에서의 피양도자는 본 허가서의 규정에 따른 프로그램의 복제와 개작 및 배포에 대한 권리를 최초의 양도자로부터 양도받은 것으로 자동적으로 간주됩니다. 프로그램(또는 프로그램에 기반한 2차적 프로그램)을 배포할 때는 피양도자의 권리의 행사를 제한할 수 있는 어떠한 사항도 추가할 수 없습니다. 그러나 피양도자에게, 재배포가 일어날 시점에서의 제3의 피양도자에게 본 허가서를 준수하도록 강제할 책임은 부과되지 않습니다. + +제 7 조. 법원의 판결이나 특허권 침해에 대한 주장 또는 특허 문제에 국한되지 않은 그밖의 이유들로 인해서 본 허가서의 규정에 배치되는 사항이 발생한다 하더라도 그러한 사항이 선행하거나 본 허가서의 조건과 규정들이 면제되는 것은 아닙니다. 따라서 법원의 명령이나 합의 등에 의해서 본 허가서에 위배되는 사항들이 발생한 상황이라도 양측 모두를 만족시킬 수 없다면 프로그램은 배포될 수 없습니다. 예를 들면, 특정한 특허 관련 허가가 프로그램의 복제물을 직접 또는 간접적인 방법으로 양도받은 임의의 제3자에게 해당 프로그램을 무상으로 재배포할 수 있게 허용하지 않는다면, 그러한 허가와 본 사용 허가를 동시에 만족시키면서 프로그램을 배포할 수 있는 방법은 없습니다. + +본 조항은 특정한 상황에서 본 조항의 일부가 유효하지 않거나 적용될 수 없을 경우에도 본 조항의 나머지 부분들을 적용하기 위한 의도로 만들어 졌습니다. 따라서 그 이외의 상황에서는 본 조항을 전체적으로 적용하면 됩니다. + +본 조항의 목적은 특허나 저작권 침해 등의 행위를 조장하거나 해당 권리를 인정하지 않으려는 것이 아니라, GPL을 통해서 구현되어 있는 자유 소프트웨어의 배포 체계를 통합적으로 보호하기 위한 것입니다. 많은 사람들이 배포 체계에 대한 신뢰있는 지원을 계속해 줌으로써 소프트웨어의 다양한 분야에 많은 공헌을 해 주었습니다. 소프트웨어를 어떠한 배포 체계로 배포할 것인가를 결정하는 것은 전적으로 저작자와 기증자들의 의지에 달려있는 것이지, 일반 사용자들이 강요할 수 있는 문제는 아닙니다. + +본 조항은 본 허가서의 다른 조항들에서 무엇이 중요하게 고려되어야 하는 지를 명확하게 설명하기 위한 목적으로 만들어진 것입니다. + +제 8 조. 특허나 저작권이 설정된 인터페이스로 인해서 특정 국가에서 프로그램의 배포와 사용이 함께 또는 개별적으로 제한되어 있는 경우, 본 사용 허가서를 프로그램에 적용한 최초의 저작권자는 문제가 발생하지 않는 국가에 한해서 프로그램을 배포한다는 배포상의 지역적 제한 조건을 명시적으로 설정할 수 있으며, 이러한 사항은 본 허가서의 일부로 간주됩니다. + +제 9 조. 자유 소프트웨어 재단은 때때로 본 사용 허가서의 개정판이나 신판을 공표할 수 있습니다. 새롭게 공표될 판은 당면한 문제나 현안을 처리하기 위해서 세부적인 내용에 차이가 발생할 수 있지만, 그 근본 정신에는 변함이 없을 것입니다. + +각각의 판들은 판번호를 사용해서 구별됩니다. 특정한 판번호와 그 이후 판을 따른다는 사항이 명시된 프로그램에는 해당 판이나 그 이후에 발행된 어떠한 판을 선택해서 적용해도 무방하고, 판번호를 명시하고 있지 않은 경우에는 자유 소프트웨어 재단이 공표한 어떠한 판번호의 판을 적용해도 무방합니다. + +제 10 조. 프로그램의 일부를 본 허가서와 배포 기준이 다른 자유 프로그램과 함께 결합하고자 할 경우에는 해당 프로그램의 저작자로부터 서면 승인을 받아야 합니다. 자유 소프트웨어 재단이 저작권을 갖고 있는 소프트웨어의 경우에는 자유 소프트웨어 재단의 승인을 얻어야 합니다. 우리는 이러한 요청을 수락하기 위해서 때때로 예외 기준을 만들기도 합니다. 자유 소프트웨어 재단은 일반적으로 자유 소프트웨어의 2차적 저작물들을 모두 자유로운 상태로 유지시키려는 목적과 소프트웨어의 공유와 재활용을 증진시키려는 두가지 목적을 기준으로 승인 여부를 결정할 것입니다. + +보증의 결여 (제11조, 제12조) + +제 11 조. 본 허가서를 따르는 프로그램은 무상으로 양도되기 때문에 관련 법률이 허용하는 한도 내에서 어떠한 형태의 보증도 제공되지 않습니다. 프로그램의 저작권자와 배포자가 공동 또는 개별적으로 별도의 보증을 서면으로 제공할 때를 제외하면, 특정한 목적에 대한 프로그램의 적합성이나 상업성 여부에 대한 보증을 포함한 어떠한 형태의 보증도 명시적이나 묵시적으로 설정되지 않은 ``있는 그대로의'' 상태로 이 프로그램을 배포합니다. 프로그램과 프로그램의 실행에 따라 발생할 수 있는 모든 위험은 피양도자에게 인수되며 이에 따른 보수 및 복구를 위한 제반 경비 또한 피양도자가 모두 부담해야 합니다. + +제 12 조. 저작권자나 배포자가 프로그램의 손상 가능성을 사전에 알고 있었다 하더라도 발생된 손실이 관련 법규에 의해 보호되고 있거나 이에 대한 별도의 서면 보증이 설정된 경우가 아니라면, 저작권자나 프로그램을 원래의 상태 또는 개작한 상태로 제공한 배포자는 프로그램의 사용이나 비작동으로 인해 발생된 손실이나 프로그램 자체의 손실에 대해 책임지지 않습니다. 이러한 면책 조건은 사용자나 제3자가 프로그램을 조작함으로써 발생된 손실이나 다른 소프트웨어와 프로그램을 함께 동작시키는 것으로 인해서 발생된 데이터의 상실 및 부정확한 산출 결과에만 국한되는 것이 아닙니다. 발생된 손실의 일반성이나 특수성 뿐 아니라 원인의 우발성 및 필연성도 전혀 고려되지 않습니다. + +복제와 개작 및 배포에 관한 조건과 규정의 끝. + +GNU 일반 공중 사용 허가서 - 원문 + +GNU GENERAL PUBLIC LICENSE + +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification follow. +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. +b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. +c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, +b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, +c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +END OF TERMS AND CONDITIONS + + + + + +EndOfLicense; + + $lang->install_condition_title = "필수 설치조건을 확인하세요."; + + $lang->install_checklist_title = array( + 'php_version' => 'PHP Version', + 'permission' => '퍼미션', + 'xml' => 'XML 라이브러리', + 'iconv' => 'ICONV 라이브러리', + 'gd' => 'GD 라이브러리', + 'session' => 'Session.auto_start 설정', + ); + + $lang->install_checklist_desc = array( + 'php_version' => '[필수] PHP버전이 5.2.2일 경우 PHP의 버그로 인하여 설치되지 않습니다', + 'permission' => '[필수] 제로보드의 설치 경로 또는 ./files 디렉토리의 퍼미션이 707이어야 합니다', + 'xml' => '[필수] XML통신을 위하여 XML 라이브러리가 필요합니다', + 'session' => '[필수] 제로보드에서 세션 사용을 위해 php.ini 설정의 session.auto_start=0 이어야 합니다', + 'iconv' => 'UTF-8과 다른 언어셋의 변환을 위한 iconv설치가 필요합니다', + 'gd' => '이미지변환 기능을 사용하기 위해 GD라이브러리가 설치되어 있어야 합니다', + ); + + $lang->install_checklist_xml = 'XML라이브러리 설치'; + $lang->install_without_xml = 'xml 라이브러리가 설치되어 있지 않습니다'; + $lang->install_checklist_gd = 'GD라이브러리 설치'; + $lang->install_without_gd = '이미지 변환을 위한 gd 라이브러리가 설치되어 있지 않습니다'; + $lang->install_checklist_gd = 'GD라이브러리 설치'; + $lang->install_without_iconv = '문자열을 처리하기 위한 iconv 라이브러리가 설치되어 있지 않습니다'; + $lang->install_session_auto_start = 'php설정의 session.auto_start==1 이라 세션 처리에 문제가 발생할 수 있습니다'; + $lang->install_permission_denied = '설치대상 디렉토리의 퍼미션이 707이 아닙니다'; + + $lang->cmd_agree_license = '라이센스에 동의합니다'; + $lang->cmd_install_fix_checklist = '필수 설치조건을 설정하였습니다.'; + $lang->cmd_install_next = '설치를 진행합니다'; + + $lang->db_desc = array( + 'mysql' => 'mysql DB를 php의 mysql*()함수를 이용하여 사용합니다.
DB 파일은 myisam으로 생성되기에 트랜잭션이 이루어지지 않습니다.', + 'mysql_innodb' => 'mysql DB를 innodb를 이용하여 사용합니다.
innodb는 트랜잭션을 사용할 수 있습니다', + 'sqlite2' => '파일로 데이터를 저장하는 sqlite2를 지원합니다.
설치시 DB파일은 웹에서 접근할 수 없는 곳에 생성하여 주셔야 합니다.
(안정화 테스트가 되지 않았습니다)', + 'sqlite3_pdo' => 'PHP의 PDO로 sqlite3를 지원합니다.
설치시 DB파일은 웹에서 접근할 수 없는 곳에 생성하여 주셔야 합니다.', + 'cubrid' => 'CUBRID DB를 이용합니다.
(안정화 테스트 및 튜닝이 되지 않았습니다)', + ); + + $lang->form_title = 'DB & 관리자 정보 입력'; + $lang->db_title = 'DB정보 입력'; + $lang->db_type = 'DB 종류'; + $lang->select_db_type = '사용하시려는 DB를 선택해주세요.'; + $lang->db_hostname = 'DB 호스트네임'; + $lang->db_port = 'DB Port'; + $lang->db_userid = 'DB 아이디'; + $lang->db_password = 'DB 비밀번호'; + $lang->db_database = 'DB 데이터베이스'; + $lang->db_database_file = 'DB 데이터베이스 파일'; + $lang->db_table_prefix = '테이블 머릿말'; + + $lang->admin_title = '관리자정보'; + + $lang->env_title = '환경 설정'; + $lang->use_rewrite = 'rewrite mod 사용'; + $lang->about_rewrite = '웹서버에서 rewrite mod를 지원하면 http://주소/?document_srl=123 같이 복잡한 주소를 http://주소/123과 같이 간단하게 줄일 수 있습니다.'; + $lang->time_zone = 'time zone'; + $lang->about_time_zone = '서버의 설정시간과 사용하려는 장소의 시간이 차이가 날 경우 time zone을 지정하시면 표시되는 시간을 지정된 곳의 시간으로 사용하실 수 있습니다'; + + $lang->about_database_file = 'Sqlite는 파일에 데이터를 저장합니다. 데이터베이스 파일의 위치를 웹에서 접근할 수 없는 곳으로 하셔야 합니다
데이터 파일은 707퍼미션 설정된 곳으로 지정해주세요.'; + + $lang->success_installed = '설치가 되었습니다'; + $lang->success_updated = '업데이트가 되었습니다'; + + $lang->msg_cannot_proc = '설치 환경이 갖춰지지 않아 요청을 실행할 수가 없습니다'; + $lang->msg_already_installed = '이미 설치가 되어 있습니다'; + $lang->msg_dbconnect_failed = "DB접속 오류가 발생하였습니다.\nDB정보를 다시 확인해주세요"; + $lang->msg_table_is_exists = "이미 DB에 테이블이 생성되어 있습니다.\nconfig파일을 재생성하였습니다"; + $lang->msg_install_completed = "설치가 완료되었습니다.\n감사합니다"; + $lang->msg_install_failed = "설치 파일 생성시에 오류가 발생하였습니다."; +?> diff --git a/modules/install/lang/zh-CN.lang.php b/modules/install/lang/zh-CN.lang.php new file mode 100644 index 000000000..b638c75e0 --- /dev/null +++ b/modules/install/lang/zh-CN.lang.php @@ -0,0 +1,266 @@ +introduce_title = '安装 Zeroboard XE'; + $lang->license = <<http://www.zeroboard.com +- 原作者 : zero (zero@zeroboard.com, http://www.zeroboard.com) + +zeroboard xe遵循 通用公共许可证(GNU General Public License) 开发,任何人都可以永久免费安装使用。 + +gnu通用公共许可证 - 翻译文 +1991.6第二版 + +版权所有(c)1989,1991 free software foundation, inc. + +675 mass ave, cambridge,mao2139, usa + +允许每个人复制和发布这一许可证原始文档的副本,但绝对不允许对它进行任何修改。 + +序言 + +大多数软件许可证决意剥夺你的共享和修改软件的自由。对比之下,gnu通用公共许可证力图保证你的共享和修改自由软件的自由--保证自由软件对所有用户是自由的。gpl适用于大多数自由软件基金会的软件,以及由使用这些软件而承担义务的作者所开发的软件。(自由软件基金会的其他一些软件受 gnu库通用许可证的保护)。你也可以将它用到你的程序中。 + +当我们谈到自由软件(free software)时,我们指的是自由而不是价格。我们的 gnu通用公共许可证决意保证你有发布自由软件的自由(如果你愿意,你可以对此项服务收取一定的费用);保证你能收到源程序或者在你需要时能得到它;保证你能修改软件或将它的一部分用于新的自由软件;而且还保证你知道你能做这些事情。 + +为了保护你的权利,我们需要作出规定:禁止任何人不承认你的权利,或者要求你放弃这些权利。如果你修改了自由软件或者发布了软件的副本,这些规定就转化为你的责任。例如,如果你发布这样一个程序的副本,不管是收费的还是免费的,你必须将你具有的一切权利给予你的接受者;你必须保证他们能收到或得到源程序;并且将这些条款给他们看,使他们知道他们有这样的权利。 + +我们采取两项措施来保护你的权利。 + +(1)给软件以版权保护。 + +(2) 给你提供许可证。它给你复制,发布和修改这些软件的法律许可。同样,为了保护每个作者和我们自己,我们需要清楚地让每个人明白,自由软件没有担保(no warranty)。如果由于其他某个人修改了软件,并继续加以传播。我们需要它的接受者明白:他们所得到的并不是原来的自由软件。由其他人引人的任何问题,不应损害原作者的声誉。最后,任何自由软件不断受到软件专利的威胁。我们希望避免这样的风险,自由软件的再发布者以个人名义获得专利许可证。事实上,将软件变为私有。为防止这一点,我们必须明确:任何专利必须以允许每个人自由使用为前提,否则就不准许有专利。 + +有关复制,发布和修改的条款和条件 + +0.此许可证适用于任何包含版权所有者声明的程序和其他作品,版权所有者在声明中明确说明程序和作品可以在gpi条款的约束下发布。下面提到的"程序"指的是任何这样的程序或作品。而"基于程序的作品"指的是程序或者任何受版权法约束的衍生作品。也就是说包含程序或程序的一部分的作品。可以是原封不动的,或经过修改的和/或翻译成其他语言的(程序)。在下文中,翻译包含在修改的条款久每个许可证接受人(iicense)用你来称呼。许可证条款不适用于复制,发布和修改以外的活动。这些活动超出这些条款的范围。运行程序的活动不受条款的限止。仅当程序的输出构成基于程序作品的内容时,这一条款才适用(如果只运行程序就无关)。是否普遍适用取决于程序具体用来做什么。 + +1.只要你在每一副本上明显和恰当地出版版权声明和不承担担保的声明,保持此许可证的声明和没有担保的声明完整无损,并和程序一起给每个其他的程序接受者一份许可证的副本,你就可以用任何媒体复制和发布你收到的原始的程序的源代码。你可以为转让副本的实际行动收取一定费用。你也有权选择提供担保以换取一定费用。 + +2.你可以修改程序的一个或几个副本或程序的任何部分,以此形成基于程序的作品。只要你同时满足下面的所有条件,你就可以按前面第一款的要求复制和发布这一经过修改的程序或作品。 + +a)你必须在修改的文件中附有明确的说明:你修改了这一文件及具体的修改日期。 + +b)你必须使你发布或出版的作品(它包含程序的全部或一部分,或包含由程序的全部或部分衍生的作品)允许第三方作为整体按许可证条款免费使用。 + +c)如果修改的程序在运行时以交互方式读取命令,你必须使它在开始进入常规的交互使用方式时打印或显示声明:包括适当的版权声明和没有担保的声明(或者你提供担保的声明);用户可以按此许可证条款重新发布程序的说明;并告诉用户如何看到这一许可证的副本。(例外的情况:如果原始程序以交互方式工作,它并不打印这样的声明,你的基于程序的作品也就不用打印声明)。 + +这些要求适用于修改了的作品的整体。如果能够确定作品的一部分并非程序的衍生产品,可以合理地认为这部分是独立的,是不同的作品。当你将它作为独立作品发布时,它不受此许可证和它的条款的约束。但是当你将这部分作为基于程序的作品的一部分发布时,作为整体它将受到许可证条款约束。准予其他许可证持有人的使用范围扩大到整个产品。也就是每个部分,不管它是谁写的。因此,本条款的意图不在于索取权利;或剥夺全部由你写成的作品的权利。而是履行权利来控制基于程序的集体作品或衍生作品的发布。 + +此外,将与程序无关的作品和该程序或基于程序的作品一起放在存贮体或发布媒体的同一卷上,并不导致将其他作品置于此许可证的约束范围之内。 + +3.你可以以目标码或可执行形式复制或发布程序(或符合第2款的基于程序的作品),只要你遵守前面的第 l,2款,并同时满足下列3条中的1条。 + +a)在通常用作软件交换的媒体上,和目标码一起附有机器可读的完整的源码。这些源码的发布应符合上面第1,2款的要求。或者 + +b)在通常用作软件交换的媒体上,和目标码一起,附有给第三方提供相应的机器可读的源码的书面报价。有效期不少于3年,费用不超过实际完成源程序发布的实际成本。源码的发布应符合上面的第1,2款的要求。或者 + +c)和目标码一起,附有你收到的发布源码的报价信息。(这一条款只适用于非商业性发布,而且你只收到程序的目标码或可执行代码和按 b)款要求提供的报价)。 + +作品的源码指的是对作品进行修改最优先择取的形式。对可执行的作品讲,完整的源码包括:所有模块的所有源程序,加上有关的接口的定义,加上控制可执行作品的安装和编译的 script。作为特殊例外,发布的源码不必包含任何常规发布的供可执行代码在上面运行的操作系统的主要组成部分(如编译程序,内核等)。除非这些组成部分和可执行作品结合在一起。 + +如果采用提供对指定地点的访问和复制的方式发布可执行码或目标码,那么,提供对同一地点的访问和复制源码可以算作源码的发布,即使第三方不强求与目标码一起复制源码。 + +4.除非你明确按许可证提出的要求去做,否则你不能复制,修改,转发许可证和发布程序。任何试图用其他方式复制,修改,转发许可证和发布程序是无效的。而且将自动结束许可证赋予你的权利。然而,对那些从你那里按许可证条款得到副本和权利的人们,只要他们继续全面履行条款,许可证赋予他们的权利仍然有效。 + +5.你没有在许可证上签字,因而你没有必要一定接受这一许可证。然而,没有任何其他东西赋予你修改和发布程序及其衍生作品的权利。如果你不接受许可证,这些行为是法律禁止的。因此,如果你修改或发布程序(或任何基于程序的作品),你就表明你接受这一许可证以及它的所有有关复制,发布和修改程序或基于程序的作品的条款和条件。 + +6.每当你重新发布程序(或任何基于程序的作品)时,接受者自动从原始许可证颁发者那里接到受这些条款和条件支配的复制,发布或修改程序的许可证。你不可以对接受者履行这里赋予他们的权利强加其他限制。你也没有强求第三方履行许可证条款的义务。 + +7.如果由于法院判决或违反专利的指控或任何其他原因(不限于专利问题)的结果,强加于你的条件(不管是法院判决,协议或其他)和许可证的条件有冲突。他们也不能用许可证条款为你开脱。在你不能同时满足本许可证规定的义务及其他相关的义务时,作为结果,你可以根本不发布程序。例如,如果某一专利许可证不允许所有那些直接或间接从你那里接受副本的人们在不付专利费的情况下重新发布程序,唯一能同时满足两方面要求的办法是停止发布程序。 + +如果本条款的任何部分在特定的环境下无效或无法实施,就使用条款的其余部分。并将条款作为整体用于其他环境。 + +本条款的目的不在于引诱你侵犯专利或其他财产权的要求,或争论这种要求的有效性。本条款的主要目的在于保护自由软件发布系统的完整性。它是通过通用公共许可证的应用来实现的。许多人坚持应用这一系统,已经为通过这一系统发布大量自由软件作出慷慨的供献。作者/捐献者有权决定他/她是否通过任何其他系统发布软件。许可证待有人不能强制这种选择。 + +本节的目的在于明确说明许可证其余部分可能产生的结果。 + +8.如果由于专利或者由于有版权的接口问题使程序在某些国家的发布和使用受到限止,将此程序置于许可证约束下的原始版权拥有者可以增加限止发布地区的条款,将这些国家明确排除在外。并在这些国家以外的地区发布程序。在这种情况下,许可证包含的限止条款和许可证正文一样有效。 + +9.自由软件基金会可能随时出版通用公共许可证的修改版或新版。新版和当前的版本在原则上保持一致,但在提到新问题时或有关事项时,在细节上可能出现差别。 + +每一版本都有不同的版本号。如果程序指定适用于它的许可证版本号以及"任何更新的版本"。你有权选择遵循指定的版本或自由软件基金会以后出版的新版本,如果程序未指定许可证版本,你可选择自由软件基金会已经出版的任何版本。 + +10.如果你愿意将程序的一部分结合到其他自由程序中,而它们的发布条件不同。写信给作者,要求准予使用。如果是自由软件基金会加以版权保护的软件,写信给自由软件基金会。我们有时会作为例外的情况处理。我们的决定受两个主要目标的指导。这两个主要目标是:我们的自由软件的衍生作品继续保持自由状态。以及从整体上促进软件的共享和重复利用。 + +没有担保 + +11.由于程序准予免费使用,在适用法准许的范围内,对程序没有担保。除非另有书面说明,版权所有者和/或其他提供程序的人们"一样"不提供任何类型的担保。不论是明确的,还是隐含的。包括但不限于隐含的适销和适合特定用途的保证。全部的风险,如程序的质量和性能问题都由你来承担。如果程序出现缺陷,你承担所有必要的服务,修复和改正的费用。 + +12.除非适用法或书面协议的要求,在任何情况下,任何版权所有者或任何按许可证条款修改和发布程序的人们都不对你的损失负有任何责任。包括由于使用或不能使用程序引起的任何一般的,特殊的,偶然发生的或重大的损失(包括但不限于数据的损失,或者数据变得不精确,或者你或第三方的持续的损失,或者程序不能和其他程序协调运行等)。即使版权所有者和其他人提到这种损失的可能性也不例外。 + +条款和条件结束 + + +gnu通用公共许可证 - 原文 + +GNU GENERAL PUBLIC LICENSE + +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification follow. +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. +b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. +c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, +b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, +c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +END OF TERMS AND CONDITIONS + + + + + +EndOfLicense; + + $lang->install_condition_title = "确认安装所需环境。"; + + $lang->install_checklist_title = array( + 'php_version' => 'PHP版本', + 'permission' => '属性', + 'xml' => 'XML库', + 'iconv' => 'ICONV库', + 'gd' => 'GD库', + 'session' => 'Session.auto_start 设置', + ); + + $lang->install_checklist_desc = array( + 'php_version' => '[必须] 由于 PHP 5.2.2 版本BUG,无法安装zeroboard XE。', + 'permission' => '[必须] zeroboard的安装路径或 ./files目录属性必须是707', + 'xml' => '[必须]为了 XML通讯,将需要XML库', + 'session' => '[必须] 为了使用缓冲功能,必须在php.ini当中设置 session.auto_start=0', + 'iconv' => '为了UTF-8和其他语言环境之间的互相转换,必须安装iconv', + 'gd' => '为了使用图片转换功能,必须先得安装GD库', + ); + + $lang->install_checklist_xml = '安装XML库'; + $lang->install_without_xml = '还没有安装xml库!'; + $lang->install_checklist_gd = '安装GD库'; + $lang->install_without_gd = '还没有安装负责转换图片功能的GD库!'; + $lang->install_checklist_gd = '安装GD库'; + $lang->install_without_iconv = '还没有安装负责处理字串的iconv库!'; + $lang->install_session_auto_start = 'PHP设置中设置成session.auto_start==1,可能处理session时发生错误。'; + $lang->install_permission_denied = '安装目录属性不是707!'; + + $lang->cmd_agree_license = '同意条款'; + $lang->cmd_install_fix_checklist = '已设置了必要的安装条件。'; + $lang->cmd_install_next = '开始进行安装'; + + $lang->db_desc = array( + 'mysql' => '利用php的 mysql*()函数使用mysql DB。
DB数据是以myisam生成,因此不能实现transaction。', + 'mysql_innodb' => '利用innodb使用mysql DB。
innodb可以使用transaction。', + 'sqlite2' => '支持用文件形式保存数据的sqlite2。
安装时DB文件应在web不能访问的地方生成。
(还没有通过安全的测试)', + 'sqlite3_pdo' => '用PHP的 PDO支持 sqlite3。
安装时DB文件应在web不能访问的地方生成。', + 'cubrid' => '使用CUBRID DB。
(还没有通过安全的测试)', + ); + + $lang->form_title = '输入数据库及管理员信息'; + $lang->db_title = '输入数据库信息'; + $lang->db_type = '数据库类型'; + $lang->select_db_type = '请选择要使用的数据库。'; + $lang->db_hostname = '服务器名'; + $lang->db_port = '数据库端口'; + $lang->db_userid = '用户名'; + $lang->db_password = '密码'; + $lang->db_database = '数据库名'; + $lang->db_database_file = '数据库文件'; + $lang->db_table_prefix = '前缀'; + + $lang->admin_title = '管理员信息'; + + $lang->env_title = '环境设置'; + $lang->use_rewrite = '使用rewrite模块'; + $lang->about_rewrite = '如服务器支持rewrite模块且选择此项,可以简化复杂的网址。
例如,http://域名/?document_srl=123简化为http://域名/123。'; + $lang->time_zone = '时区'; + $lang->about_time_zone = '服务器时间和您所处的时间有差异时,可以设置时区来满足你所需要的时间显示。'; + + $lang->about_database_file = 'Sqlite是文件里保存数据。数据库的文件位置应该放在web不能访问的地方。
数据文件应放在具有707属性的位置。'; + + $lang->success_installed = '已完成安装。'; + $lang->success_updated = '已完成更新。'; + + $lang->msg_cannot_proc = '不具备安装所需环境,不能继续进行。'; + $lang->msg_already_installed = '已安装'; + $lang->msg_dbconnect_failed = "连接DB时发生错误。\n请重新确认DB信息。"; + $lang->msg_table_is_exists = "已生成数据表。\n重新生成了config文件。"; + $lang->msg_install_completed = "安装完成。\n非常感谢。"; + $lang->msg_install_failed = "生成安装文件时发生错误。"; +?> diff --git a/modules/install/schemas/sequence.xml b/modules/install/schemas/sequence.xml new file mode 100644 index 000000000..28a05541a --- /dev/null +++ b/modules/install/schemas/sequence.xml @@ -0,0 +1,3 @@ + + +
diff --git a/modules/install/tpl/check_env.html b/modules/install/tpl/check_env.html new file mode 100644 index 000000000..2877148e8 --- /dev/null +++ b/modules/install/tpl/check_env.html @@ -0,0 +1,31 @@ + + +

{$lang->install_condition_title}

+ + ++ + + + + + + +
{$lang->install_checklist_title[$key]} + + {$lang->enable} + + {$lang->disable} +
{$lang->install_checklist_desc[$key]} + +
+ + + + diff --git a/modules/install/tpl/css/install.css b/modules/install/tpl/css/install.css new file mode 100644 index 000000000..46529d679 --- /dev/null +++ b/modules/install/tpl/css/install.css @@ -0,0 +1,59 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +/* +Used Hack + +IE6 & Below +{ property:value; _property:value;} + +IE7 Only +*:first-child+html #selector + +*/ + +/* default.css - Type Selector Definition */ +body { background:#4d4d4d url(../images/installBg.gif) repeat-x;} + +/* Content */ +#box { position:relative; left:50%; margin:120px 0 0 -380px; width:750px;} +#box h1 { margin:0; } + +#content { position:relative; padding:25px 20px 20px 20px; overflow:hidden; background:#ffffff;} +#content h2 { font-size:1em; padding-left:.5em; margin:0 0 1em 0;} +#agreement { border:1px solid #c9c9c9; height:15em; padding:1.2em; overflow:auto; color:#696969; line-height:1.25em; margin-bottom:20px;} + +.iePngFix { display:block; } + +div.buttonCenter { text-align:center; } + +.tableType6 { border:2px solid #c1c0bd; border-left:none; border-right:none; width:100%; margin-bottom:20px;} +#content .tableType6 th { border-top:1px solid #fbfbfb; border-bottom:1px solid #e4e4e4; background:#f5f5f5; padding:10px 10px 10px 2em; font-weight:normal; text-align:left; color:#606060;} +#content .tableType6 td { border-bottom:1px solid #ededed; padding:10px 10px 7px 10px; color:#7b7972; line-height:1.25em;} +#content .tableType6 input, +#content .tableType6 textarea, +#content .tableType6 select { vertical-align:middle;} +#content .tableType6 td .w100 { width:100%; display:block;} +#content .tableType6 td .checkbox { margin:-3px;} +#content .tableType6 td p { line-height:1.4em;} +#content .tableType6 .borderBottomNone { border-bottom:none;} +#content .tableType6 .none { color:#c95b53;} + +#content .tableType7 { border:2px solid #c1c0bd; border-left:none; border-right:none; width:100%; margin-bottom:20px;} +#content .tableType7 th { border-bottom:1px solid #e4e4e4; background:#e8e8e8; padding:10px 10px 10px 2em; font-weight:normal; text-align:left; color:#606060;} +#content .tableType7 th.second { background:#f5f5f5;} +#content .tableType7 td { border-bottom:1px solid #ededed; padding:10px 10px 7px 10px; color:#7b7972; line-height:1.25em; font-size:.9em;} +#content .tableType7 .hr { border-bottom:1px solid #b8b8b8;} +#content .tableType7 input, +#content .tableType7 textarea, +#content .tableType7 select { vertical-align:middle;} +#content .tableType7 select { width:100%; } +#content .tableType7 select option { letter-spacing:-1px; } +#content .tableType7 td .w100 { width:100%; display:block;} +#content .tableType7 td .checkbox { margin:-3px;} +#content .tableType7 td p { line-height:1.4em; margin:5px 0 0 0; padding:0;} +#content .tableType7 .borderBottomNone { border-bottom:none;} +#content .tableType7 .none { color:#c95b53;} diff --git a/modules/install/tpl/filter/cubrid.xml b/modules/install/tpl/filter/cubrid.xml new file mode 100644 index 000000000..5046e1402 --- /dev/null +++ b/modules/install/tpl/filter/cubrid.xml @@ -0,0 +1,38 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/install/tpl/filter/mysql.xml b/modules/install/tpl/filter/mysql.xml new file mode 100644 index 000000000..8be2cdc59 --- /dev/null +++ b/modules/install/tpl/filter/mysql.xml @@ -0,0 +1,36 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/install/tpl/filter/sqlite2.xml b/modules/install/tpl/filter/sqlite2.xml new file mode 100644 index 000000000..616994ff0 --- /dev/null +++ b/modules/install/tpl/filter/sqlite2.xml @@ -0,0 +1,30 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/modules/install/tpl/footer.html b/modules/install/tpl/footer.html new file mode 100644 index 000000000..fa75930e5 --- /dev/null +++ b/modules/install/tpl/footer.html @@ -0,0 +1,3 @@ + + + diff --git a/modules/install/tpl/form.cubrid.html b/modules/install/tpl/form.cubrid.html new file mode 100644 index 000000000..0f58da3e8 --- /dev/null +++ b/modules/install/tpl/form.cubrid.html @@ -0,0 +1,49 @@ + + + + +
+ + +

{$lang->form_title}

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$db_type}
+
+ +
+ +
+ diff --git a/modules/install/tpl/form.install.html b/modules/install/tpl/form.install.html new file mode 100644 index 000000000..3692128b6 --- /dev/null +++ b/modules/install/tpl/form.install.html @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + checked="checked" /> +

{$lang->about_rewrite}

+ + + + {$lang->time_zone} + + +

{$lang->about_time_zone}

+ + diff --git a/modules/install/tpl/form.mysql.html b/modules/install/tpl/form.mysql.html new file mode 100644 index 000000000..266177983 --- /dev/null +++ b/modules/install/tpl/form.mysql.html @@ -0,0 +1,51 @@ + + + + +
+ + +

{$lang->form_title}

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$db_type}
+ +
+ +
+ +
+ + diff --git a/modules/install/tpl/form.mysql_innodb.html b/modules/install/tpl/form.mysql_innodb.html new file mode 100644 index 000000000..266177983 --- /dev/null +++ b/modules/install/tpl/form.mysql_innodb.html @@ -0,0 +1,51 @@ + + + + +
+ + +

{$lang->form_title}

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$db_type}
+ +
+ +
+ +
+ + diff --git a/modules/install/tpl/form.sqlite2.html b/modules/install/tpl/form.sqlite2.html new file mode 100644 index 000000000..20cf05c53 --- /dev/null +++ b/modules/install/tpl/form.sqlite2.html @@ -0,0 +1,38 @@ + + + + +
+ + +

{$lang->form_title}

+ + + + + + + + + + + + + + + + + + +
{$db_type} + +

{$lang->about_database_file}

+
+ +
+ +
+ +
+ + diff --git a/modules/install/tpl/form.sqlite3_pdo.html b/modules/install/tpl/form.sqlite3_pdo.html new file mode 100644 index 000000000..b905d0e20 --- /dev/null +++ b/modules/install/tpl/form.sqlite3_pdo.html @@ -0,0 +1,38 @@ + + + + +
+ + +

{$lang->form_title}

+ + + + + + + + + + + + + + + + + + +
{$db_type} + +

{$lang->about_database_file}

+
+ +
+ +
+ +
+ + diff --git a/modules/install/tpl/header.html b/modules/install/tpl/header.html new file mode 100644 index 000000000..10c6d69f5 --- /dev/null +++ b/modules/install/tpl/header.html @@ -0,0 +1,4 @@ + +
+

Zeroboard XE Install

+
diff --git a/modules/install/tpl/images/blank.gif b/modules/install/tpl/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/modules/install/tpl/images/blank.gif differ diff --git a/modules/install/tpl/images/h1.png b/modules/install/tpl/images/h1.png new file mode 100644 index 000000000..f92d4d45a Binary files /dev/null and b/modules/install/tpl/images/h1.png differ diff --git a/modules/install/tpl/images/iconCreate.gif b/modules/install/tpl/images/iconCreate.gif new file mode 100644 index 000000000..0fdecf963 Binary files /dev/null and b/modules/install/tpl/images/iconCreate.gif differ diff --git a/modules/install/tpl/images/installBg.gif b/modules/install/tpl/images/installBg.gif new file mode 100644 index 000000000..d76bd51b2 Binary files /dev/null and b/modules/install/tpl/images/installBg.gif differ diff --git a/modules/install/tpl/images/installBoxBottom.png b/modules/install/tpl/images/installBoxBottom.png new file mode 100644 index 000000000..741ae4776 Binary files /dev/null and b/modules/install/tpl/images/installBoxBottom.png differ diff --git a/modules/install/tpl/introduce.html b/modules/install/tpl/introduce.html new file mode 100644 index 000000000..44a5485ca --- /dev/null +++ b/modules/install/tpl/introduce.html @@ -0,0 +1,22 @@ + + +

{$lang->introduce_title}

+ +
{nl2br($lang->license)}
+ +
+ Select language : +
+ + + + diff --git a/modules/install/tpl/js/install_admin.js b/modules/install/tpl/js/install_admin.js new file mode 100644 index 000000000..70f9c18ea --- /dev/null +++ b/modules/install/tpl/js/install_admin.js @@ -0,0 +1,7 @@ +/** + * @brief 설치 완료후 실행될 함수 + */ +function completeInstalled(ret_obj) { + alert(ret_obj["message"]); + location.href = "./"; +} diff --git a/modules/install/tpl/select_db.html b/modules/install/tpl/select_db.html new file mode 100644 index 000000000..47e4935ad --- /dev/null +++ b/modules/install/tpl/select_db.html @@ -0,0 +1,28 @@ + + +

{$lang->select_db_type}

+ +
+ + + + + + + + + + + +
+ checked="checked"/> + + {$lang->db_desc[$val]}
+ +
+ +
+ +
+ + diff --git a/modules/integration_search/conf/info.xml b/modules/integration_search/conf/info.xml new file mode 100644 index 000000000..1895ba547 --- /dev/null +++ b/modules/integration_search/conf/info.xml @@ -0,0 +1,28 @@ + + + 통합검색 + 搜索 + 統合検索 + Integration Search + + 제로 + zero + Zero + zero + + 선택한 모듈들을 대상으로 통합검색을 지원합니다. + 선택된 모듈의 글중 비밀글만 검색을 하지 않고 나머지는 모두 검색을 하기에 공개되지 않은 모듈은 대상에 포함하지 않도록 하셔야 합니다. + + + 把被选模块作为搜索对象进行搜索。 + 被选模块当中只有密帖不会被搜索,因此请注意选择您不想搜索的模块。 + + + 選択されたモジュールを対象に統合検索を行う機能をサポートします。選択されたモジュールのコンテンツ(書き込み)の中で、非公開コンテンツのみ検索から除外されますので、未公開のモジュールは対象にしないようにしてください。 + + + It supports integration search for chosen modules. + All articles except secret articles will be searched, so you need to be careful not to include secret module to target . + + + diff --git a/modules/integration_search/conf/module.xml b/modules/integration_search/conf/module.xml new file mode 100644 index 000000000..62f01f0dd --- /dev/null +++ b/modules/integration_search/conf/module.xml @@ -0,0 +1,26 @@ + + + + + 목록 + 目录 + リスト + list + + + 관리 + 管理 + 管理 + manager + + + + + + + + + + + + diff --git a/modules/integration_search/integration_search.admin.controller.php b/modules/integration_search/integration_search.admin.controller.php new file mode 100644 index 000000000..c7f074abd --- /dev/null +++ b/modules/integration_search/integration_search.admin.controller.php @@ -0,0 +1,113 @@ +getModuleConfig('integration_search'); + + $args->skin = Context::get('skin'); + $args->target_mid = explode('|@|',Context::get('target_mid')); + $args->skin_vars = $config->skin_vars; + + $oModuleController = &getController('module'); + return $oModuleController->insertModuleConfig('integration_search',$args); + } + + /** + * @brief 스킨 정보 저장 + **/ + function procIntegration_searchAdminInsertSkin() { + // 설정 정보를 받아옴 (module model 객체를 이용) + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('integration_search'); + + $args->skin = $config->skin; + $args->target_mid = $config->target_mid; + + // 스킨의 정보를 구해옴 (extra_vars를 체크하기 위해서) + $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $config->skin); + + // 입력받은 변수들을 체크 (mo, act, module_srl, page등 기본적인 변수들 없앰) + $obj = Context::getRequestVars(); + unset($obj->act); + unset($obj->module_srl); + unset($obj->page); + + // 원 skin_info에서 extra_vars의 type이 image일 경우 별도 처리를 해줌 + if($skin_info->extra_vars) { + foreach($skin_info->extra_vars as $vars) { + if($vars->type!='image') continue; + + $image_obj = $obj->{$vars->name}; + + // 삭제 요청에 대한 변수를 구함 + $del_var = $obj->{"del_".$vars->name}; + unset($obj->{"del_".$vars->name}); + if($del_var == 'Y') { + @unlink($module_info->{$vars->name}); + continue; + } + + // 업로드 되지 않았다면 이전 데이터를 그대로 사용 + if(!$image_obj['tmp_name']) { + $obj->{$vars->name} = $module_info->{$vars->name}; + continue; + } + + // 정상적으로 업로드된 파일이 아니면 무시 + if(!is_uploaded_file($image_obj['tmp_name'])) { + unset($obj->{$vars->name}); + continue; + } + + // 이미지 파일이 아니어도 무시 + if(!eregi("\.(jpg|jpeg|gif|png)$", $image_obj['name'])) { + unset($obj->{$vars->name}); + continue; + } + + // 경로를 정해서 업로드 + $path = sprintf("./files/attach/images/%s/", $module_srl); + + // 디렉토리 생성 + if(!FileHandler::makeDir($path)) return false; + + $filename = $path.$image_obj['name']; + + // 파일 이동 + if(!move_uploaded_file($image_obj['tmp_name'], $filename)) { + unset($obj->{$vars->name}); + continue; + } + + // 변수를 바꿈 + unset($obj->{$vars->name}); + $obj->{$vars->name} = $filename; + } + } + + // serialize하여 저장 + $args->skin_vars = serialize($obj); + + $oModuleController = &getController('module'); + return $oModuleController->insertModuleConfig('integration_search',$args); + } + } +?> diff --git a/modules/integration_search/integration_search.admin.view.php b/modules/integration_search/integration_search.admin.view.php new file mode 100644 index 000000000..29d284de8 --- /dev/null +++ b/modules/integration_search/integration_search.admin.view.php @@ -0,0 +1,71 @@ +config = $oModuleModel->getModuleConfig('integration_search'); + if(!$this->config->target_mid) $this->config->target_mid = array(); + Context::set('config',$this->config); + + $this->setTemplatePath($this->module_path."/tpl/"); + } + + /** + * @brief 모듈 선정 및 스킨 설정 + **/ + function dispIntegration_searchAdminContent() { + // 스킨 목록을 구해옴 + $oModuleModel = &getModel('module'); + $skin_list = $oModuleModel->getSkins($this->module_path); + Context::set('skin_list',$skin_list); + + // 생성된 mid목록을 구함 + $mid_list = $oModuleModel->getMidList(); + Context::set('mid_list',$mid_list); + + // 샘플코드 + Context::set('sample_code', htmlspecialchars('
') ); + + $this->setTemplateFile("index"); + } + + /** + * @brief 스킨 설정 + **/ + function dispIntegration_searchAdminSkinInfo() { + $oModuleModel = &getModel('module'); + $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $this->config->skin); + $skin_vars = unserialize($this->config->skin_vars); + + // skin_info에 extra_vars 값을 지정 + if(count($skin_info->extra_vars)) { + foreach($skin_info->extra_vars as $key => $val) { + $name = $val->name; + $type = $val->type; + $value = $skin_vars->{$name}; + if($type=="checkbox"&&!$value) $value = array(); + $skin_info->extra_vars[$key]->value= $value; + } + } + Context::set('skin_info', $skin_info); + Context::set('skin_vars', $skin_vars); + + $this->setTemplateFile("skin_info"); + } + } +?> diff --git a/modules/integration_search/integration_search.class.php b/modules/integration_search/integration_search.class.php new file mode 100644 index 000000000..8356e4e50 --- /dev/null +++ b/modules/integration_search/integration_search.class.php @@ -0,0 +1,47 @@ +insertActionForward('integration_search', 'view', 'IS'); + $oModuleController->insertActionForward('integration_search', 'view', 'dispIntegration_searchAdminContent'); + $oModuleController->insertActionForward('integration_search', 'view', 'dispIntegration_searchAdminSkinInfo'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + // IS act의 여부 체크 (2007. 7. 24 추가) + $oModuleModel = &getModel('module'); + $act = $oModuleModel->getActionForward('dispIntegration_searchAdminSkinInfo'); + if(!$act) return true; + + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + $oModuleController = &getController('module'); + $oModuleController->insertActionForward('integration_search', 'view', 'IS'); + $oModuleController->insertActionForward('integration_search', 'view', 'dispIntegration_searchAdminContent'); + $oModuleController->insertActionForward('integration_search', 'view', 'dispIntegration_searchAdminSkinInfo'); + return new Object(0, 'success_updated'); + } + + } +?> diff --git a/modules/integration_search/integration_search.view.php b/modules/integration_search/integration_search.view.php new file mode 100644 index 000000000..3f70f97e2 --- /dev/null +++ b/modules/integration_search/integration_search.view.php @@ -0,0 +1,107 @@ +getModuleConfig('integration_search'); + + $this->target_mid = $config->target_mid; + if(!$this->target_mid) $this->target_mid = array(); + + $this->skin = $config->skin; + $this->module_info = unserialize($config->skin_vars); + Context::set('module_info', $this->module_info); + + $this->setTemplatePath($this->module_path."/skins/".$this->skin."/"); + } + + /** + * @brief 통합 검색 출력 + **/ + function IS() { + // 검색이 가능한 목록을 구하기 위해 전체 목록을 구해옴 + $oModuleModel = &getModel('module'); + $module_list = $oModuleModel->getMidList($args); + + // 대상 모듈을 정리함 + $module_srl_list = array(); + foreach($module_list as $mid => $val) { + $mid_list[$val->module_srl] = $val; + if(in_array($mid, $this->target_mid)) { + $module_srl_list[] = $val->module_srl; + } + } + + // 검색대상 변수 설정 + $search_target = Context::get('search_target'); + if(!in_array($search_target, array('title','content','title_content','comment'))) $search_target = 'title'; + + // 검색어 변수 설정 + $is_keyword = Context::get('is_keyword'); + + // 페이지 변수 설정 + $page = (int)Context::get('page'); + if(!$page) $page = 1; + + + $list_count = (int)Context::get('list_count'); + if(!$list_count|| $list_count>20) $list_count = 20; + + // 출력할 컨텐츠 추출을 위한 인자 정리 + $args->module_srl = implode(',',$module_srl_list); + $args->page = $page; + $args->list_count = $list_count; + $args->page_count = 10; + $args->search_target = $search_target; + $args->search_keyword = Context::get('is_keyword'); + $args->sort_index = 'list_order'; + $args->order_type = 'asc'; + + // 검색글이 있을 경우 검색 시도 + if($args->search_keyword) { + + // 대상이 comment이면 댓글 검색 시도 + if($search_target == 'comment') { + + // 그외는 문서 검색 시도 + } else { + // 대상 문서들을 가져옴 + $oDocumentModel = &getModel('document'); + $output = $oDocumentModel->getDocumentList($args); + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('document_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + } + } + + // 텍스트 생성 + if(Context::getLangType()=='en') + $result_text = sprintf(Context::getLang("is_result_text"), $output->total_count, $is_keyword); + else + $result_text = sprintf(Context::getLang("is_result_text"), $is_keyword, $output->total_count); + Context::set('result_text', $result_text); + Context::set('mid_list', $mid_list); + + // 템플릿 파일 지정 + $this->setTemplateFile('index'); + } + } +?> diff --git a/modules/integration_search/lang/en.lang.php b/modules/integration_search/lang/en.lang.php new file mode 100644 index 000000000..593e62f07 --- /dev/null +++ b/modules/integration_search/lang/en.lang.php @@ -0,0 +1,30 @@ + + * @brief English Language Pack (For only basic things) + **/ + + $lang->integration_search = "Integration Search"; + + $lang->sample_code = "Sample Code"; + $lang->about_target_module = "Only chosen modules are the target. Please be careful on setting authority"; + $lang->about_sample_code = "You can add integration search on layout by adding code above"; + $lang->msg_no_keyword = "Input keyword to search"; + + $lang->is_result_text = "There are %d result(s) for '%s'"; + + $lang->is_search_option = array( + 'title' => 'Subject', + 'content' => 'Content', + 'title_content' => 'Subject+Content', + //'comment' => '댓글', + ); + + $lang->is_sort_option = array( + 'regdate' => 'Registered Date', + 'comment_count' => 'Number of Comments', + 'readed_count' => 'Number of Hits', + 'voted_count' => 'Number of Votes', + ); +?> diff --git a/modules/integration_search/lang/jp.lang.php b/modules/integration_search/lang/jp.lang.php new file mode 100644 index 000000000..0ba414f9a --- /dev/null +++ b/modules/integration_search/lang/jp.lang.php @@ -0,0 +1,30 @@ + 翻訳:RisaPapa + * @brief 日本語言語パッケージ(基本的な内容のみう) + **/ + + $lang->integration_search = "統合検索"; + + $lang->sample_code = "サンプルコード"; + $lang->about_target_module = "選択されたモジュールのみを検索対象とします。権限設定に注意してください。"; + $lang->about_sample_code = "上のコードをレイアウトなどに追加すると統合検索が可能になります。"; + $lang->msg_no_keyword = "検索語を入力してください。"; + + $lang->is_result_text = "'%s'に対する検索結果%d件"; + + $lang->is_search_option = array( + 'title' => 'タイトル', + 'content' => '内容', + 'title_content' => 'タイトル+内容', + //'comment' => 'コメント', + ); + + $lang->is_sort_option = array( + 'regdate' => '登録日', + 'comment_count' => 'コメント数', + 'readed_count' => '照合数', + 'voted_count' => '推薦数', + ); +?> diff --git a/modules/integration_search/lang/ko.lang.php b/modules/integration_search/lang/ko.lang.php new file mode 100644 index 000000000..ff308ab0d --- /dev/null +++ b/modules/integration_search/lang/ko.lang.php @@ -0,0 +1,30 @@ + + * @brief 한국어 언어팩 (기본적인 내용만 수록) + **/ + + $lang->integration_search = "통합검색"; + + $lang->sample_code = "샘플코드"; + $lang->about_target_module = "선택된 모듈만 검색 대상으로 정합니다. 권한설정에 대한 주의를 바랍니다"; + $lang->about_sample_code = "위 코드를 레이아웃등에 추가하시면 통합검색이 가능합니다"; + $lang->msg_no_keyword = "검색어를 입력해주세요"; + + $lang->is_result_text = "'%s' 에 대한 검색결과 %d건"; + + $lang->is_search_option = array( + 'title' => '제목', + 'content' => '내용', + 'title_content' => '제목+내용', + //'comment' => '댓글', + ); + + $lang->is_sort_option = array( + 'regdate' => '등록일', + 'comment_count' => '댓글수', + 'readed_count' => '조회수', + 'voted_count' => '추천수', + ); +?> diff --git a/modules/integration_search/lang/zh-CN.lang.php b/modules/integration_search/lang/zh-CN.lang.php new file mode 100644 index 000000000..55aff7b1f --- /dev/null +++ b/modules/integration_search/lang/zh-CN.lang.php @@ -0,0 +1,29 @@ + + * @brief 简体中文语言包 + **/ + + $lang->integration_search = "搜索"; + + $lang->sample_code = "代码"; + $lang->about_target_module = "只把被选模块作为搜索对象。请注意权限设置。"; + $lang->about_sample_code = "可把上述代码插入到相应布局当中即可实现搜索功能。"; + + $lang->is_result_text = "符合'%s'的搜索结果约有%d项"; + + $lang->is_search_option = array( + 'title' => '标题', + 'content' => '内容', + 'title_content' => '标题+内容', + //'comment' => '评论', + ); + + $lang->is_sort_option = array( + 'regdate' => '日期', + 'comment_count' => '评论', + 'readed_count' => '查看', + 'voted_count' => '推荐', + ); +?> diff --git a/modules/integration_search/skins/default/css/white.css b/modules/integration_search/skins/default/css/white.css new file mode 100644 index 000000000..0206005c7 --- /dev/null +++ b/modules/integration_search/skins/default/css/white.css @@ -0,0 +1,49 @@ +@charset "utf-8"; +#spot { border:8px solid #cecece; width:754px; height:64px; position:relative; margin:0 -15px 30px 0;} +#spot h2 { position:absolute; top:24px; left:-8px;} +#spot .search { text-align:center; position:relative; top:22px;} +#spot .search * { vertical-align:middle;} +#spot .search select { margin-top:1px;} +#spot .search .inputText { border:1px solid #b6b6b6; padding:2px 3px; width:252px; height:14px;} +#spot .search .submit {} + +#content { width:100%; overflow:hidden; position:relative;} +#content h3.result { width:100%; height:23px; border-bottom:1px solid #cecece; _margin-top:-2px; margin-bottom:23px; margin-left:15px;} +*:first-child+html #content h3.result { margin-top:-2px;} +#content h3.result strong { color:#ff1a00;} +#content .sortBy { position:absolute; top:0; right:0; overflow:hidden;} +#content .sortBy li { list-style:none; float:left; padding:0 6px; position:relative; right:-6px; background:url(../images/white/vrType2.gif) no-repeat right 1px;} +#content .sortBy li a { display:block; float:left; padding-left:9px; color:#3e3e3e; white-space:nowrap; background:url(../images/white/bulletSortBy.gif) no-repeat left 4px; text-decoration:none; } +#content .sortBy li.on a { color:#ff1a00; background:url(../images/white/bulletSortByOn.gif) no-repeat left 4px;} + +.searchResult { margin-left:15px;} +.searchResult li { width:100%; margin-bottom:29px; clear:both; overflow:hidden;list-style:none; } +.searchResult li .thumb { display:block; float:left; margin-right:14px;} +.searchResult li dl {} +.searchResult li dl dt { color:#d8d8d8; margin-bottom:1px;} +.searchResult li dl dt a { color:#1a3588; text-decoration:underline;} +.searchResult li dl dt .reply { color:#fe6700; font:.9em Tahoma;} +.searchResult li dl dt .reply em { color:#fe6700; font:bold 1em Tahoma;} +.searchResult li dl dt .category { color:#818181;} +.searchResult li dl dt .category a { color:#818181; border:none; text-decoration:none;} +.searchResult li dl dd { line-height:18px; color:#555555; margin-bottom:4px;} +.searchResult li address { color:#d8d8d8; font-size:11px;} +.searchResult li address strong { color:#3e3e3e; font-size:1em; font-weight:normal;} +.searchResult li address img { vertical-align:middle; margin-right:2px;} +.searchResult li address .time { color:#818181; font:.8em Tahoma;} +.searchResult li address .read { font:11px "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; color:#818181;} +.searchResult li address .readNum { color:#818181; font:.8em Tahoma;} +.searchResult li address .recom { font:11px "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; color:#818181;} +.searchResult li address .recomNum { color:#fe6700; font:bold .8em Tahoma;} + +/* pageNavigation */ +.pageNavigation { position:relative; display:block; text-align:center; font:bold .8em Tahoma; } +.pageNavigation a { position:relative; margin-left:-4px; font:bold 1em Tahoma; color:#666666; display:inline-block; padding:1px 7px 2px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } +.pageNavigation a:hover { background:#F7F7F7; text-decoration:none; } +.pageNavigation a:visited { color:#999999;} +.pageNavigation a.goToFirst, +.pageNavigation a.goToLast { border:none; border-right:1px solid #ffffff; border-left:1px solid #ffffff; z-index:99; vertical-align:top; padding:0px 7px 4px 6px;} +.pageNavigation a.goToFirst img, +.pageNavigation a.goToLast img { display:inline-block; padding:2px 0; position:relative; top:2px; _top:1px;} +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 1em Tahoma; color:#ff6600; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + diff --git a/modules/integration_search/skins/default/images/white/bottomGotoFirst.gif b/modules/integration_search/skins/default/images/white/bottomGotoFirst.gif new file mode 100644 index 000000000..e0297fecb Binary files /dev/null and b/modules/integration_search/skins/default/images/white/bottomGotoFirst.gif differ diff --git a/modules/integration_search/skins/default/images/white/bottomGotoLast.gif b/modules/integration_search/skins/default/images/white/bottomGotoLast.gif new file mode 100644 index 000000000..0a7141d0d Binary files /dev/null and b/modules/integration_search/skins/default/images/white/bottomGotoLast.gif differ diff --git a/modules/integration_search/skins/default/images/white/bulletSortBy.gif b/modules/integration_search/skins/default/images/white/bulletSortBy.gif new file mode 100644 index 000000000..d90dcc88a Binary files /dev/null and b/modules/integration_search/skins/default/images/white/bulletSortBy.gif differ diff --git a/modules/integration_search/skins/default/images/white/bulletSortByOn.gif b/modules/integration_search/skins/default/images/white/bulletSortByOn.gif new file mode 100644 index 000000000..a1d5c3244 Binary files /dev/null and b/modules/integration_search/skins/default/images/white/bulletSortByOn.gif differ diff --git a/modules/integration_search/skins/default/images/white/buttonSearch2.gif b/modules/integration_search/skins/default/images/white/buttonSearch2.gif new file mode 100644 index 000000000..65e49c9dd Binary files /dev/null and b/modules/integration_search/skins/default/images/white/buttonSearch2.gif differ diff --git a/modules/integration_search/skins/default/images/white/h2Search.gif b/modules/integration_search/skins/default/images/white/h2Search.gif new file mode 100644 index 000000000..fba3fb0f5 Binary files /dev/null and b/modules/integration_search/skins/default/images/white/h2Search.gif differ diff --git a/modules/integration_search/skins/default/images/white/vrType2.gif b/modules/integration_search/skins/default/images/white/vrType2.gif new file mode 100644 index 000000000..a5e4df11d Binary files /dev/null and b/modules/integration_search/skins/default/images/white/vrType2.gif differ diff --git a/modules/integration_search/skins/default/index.html b/modules/integration_search/skins/default/index.html new file mode 100644 index 000000000..5deecb5e1 --- /dev/null +++ b/modules/integration_search/skins/default/index.html @@ -0,0 +1,74 @@ + + + {@$module_info->colorset = "white"} + + + + + + + +
+

검색하기

+ + + + + + + +
+ + +
+ +

{$lang->msg_no_keyword}

+ +

{$lang->msg_no_result}

+ +
+ +
+

{$result_text}

+ +
  • {$val}
  • + + + --> + + +
    + + + diff --git a/modules/integration_search/skins/default/skin.xml b/modules/integration_search/skins/default/skin.xml new file mode 100644 index 000000000..6a060b334 --- /dev/null +++ b/modules/integration_search/skins/default/skin.xml @@ -0,0 +1,37 @@ + + + 통합 검색 기본 스킨 + 搜索默认皮肤 + 統合検索のデフォルトスキン + Default Skin of Integration Search + + 제로 + zero + Zero + zero + 통합검색 모듈의 기본 스킨 + 搜索模块的默认皮肤。 + 統合検索モジュールのデフォルトスキンです。 + Default skin of integration search module + + + + 기본 + 默认 + デフォルト + Default + + + + + 설명 + 说明 + 説明 + Description + 검색결과 상단에 결과가 출력됩니다. + 显示在搜索结果上端。 + 検索結果が上段に表示されます。 + Result will be displayed on top of search result. + + + diff --git a/modules/integration_search/tpl/filter/insert_config.xml b/modules/integration_search/tpl/filter/insert_config.xml new file mode 100644 index 000000000..e3caf4cb0 --- /dev/null +++ b/modules/integration_search/tpl/filter/insert_config.xml @@ -0,0 +1,5 @@ + +
    + + + diff --git a/modules/integration_search/tpl/header.html b/modules/integration_search/tpl/header.html new file mode 100644 index 000000000..4aa4c9868 --- /dev/null +++ b/modules/integration_search/tpl/header.html @@ -0,0 +1,14 @@ + + +

    {$lang->integration_search} {$lang->cmd_management}

    + +
    + +
    + diff --git a/modules/integration_search/tpl/index.html b/modules/integration_search/tpl/index.html new file mode 100644 index 000000000..dd7aeaf80 --- /dev/null +++ b/modules/integration_search/tpl/index.html @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + +
    {$lang->sample_code} + +

    {$lang->about_sample_code}

    +
    {$lang->skin} + +

    {$lang->about_skin}

    +
    {$lang->module} +

    {$lang->about_target_module}

    + +

    target_mid))-->checked="checked" />

    + +
    + +
    + +
    + diff --git a/modules/integration_search/tpl/js/integration_search_admin.js b/modules/integration_search/tpl/js/integration_search_admin.js new file mode 100644 index 000000000..b2bf3b494 --- /dev/null +++ b/modules/integration_search/tpl/js/integration_search_admin.js @@ -0,0 +1,31 @@ +/** + * @file modules/board/js/board_admin.js + * @author zero (zero@nzeo.com) + * @brief integration_search 모듈의 관리자용 javascript + **/ + +/* 권한 관련 */ +function doSelectAll(obj, key) { + var fo_obj = obj.parentNode; + while(fo_obj.nodeName != 'FORM') { + fo_obj = fo_obj.parentNode; + } + + for(var i=0;i + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->skin_default_info}
    {$lang->skin}{$skin_info->title}
    {$lang->skin_maker}{$skin_info->maker->name} ({$skin_info->maker->email_address})
    {$lang->skin_maker_homepage}{$skin_info->maker->homepage}
    {$lang->date}{$skin_info->maker->date}
    {$lang->description}{nl2br($skin_info->maker->description)}
    + + + + + + + + + + + + + + + + + + +
    {$lang->extra_vars}
    {$lang->colorset} + +
    + + {$val->title} + + + colorset==$val->name)-->checked="checked"/> + +
    + +
    {$val->title} + + + + + + + + + + + + + value))-->checked="checked" class="checkbox" /> + + + + + + + + value)-->checked="checked"/> + + + + + + + +
    +
    + + +
    + + + + + + +

    {nl2br($val->description)}

    + +
    + +
    + +
    +
    + + diff --git a/modules/krzip/conf/info.xml b/modules/krzip/conf/info.xml new file mode 100644 index 000000000..026942d6a --- /dev/null +++ b/modules/krzip/conf/info.xml @@ -0,0 +1,29 @@ + + + 한국 우편번호 + Korean Zip Code + 韩国邮编 + 韓国郵便番号 + + 제로 + Zero + zero + Zero + + 제로보드에서 운영하는 우편번호서버를 이용하여 우편번호 검색을 합니다. + 우편번호 검색 서버는 설정을 통해 변경하실 수 있습니다. + + + Searching the zip code via zip code server operated by zeroboard. + You can change the zip code server by setting. + + + 利用zeroboard运营的邮编服务器搜索邮编。 + 通过设置可以修改邮编搜索服务器。 + + + ゼロボードで運用している郵便番号サーバを利用して韓国の郵便番号を検索します。 + 郵便番号検索サーバは設定によって変更することができます。 + + + diff --git a/modules/krzip/conf/module.xml b/modules/krzip/conf/module.xml new file mode 100644 index 000000000..9aef3127e --- /dev/null +++ b/modules/krzip/conf/module.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/modules/krzip/krzip.admin.controller.php b/modules/krzip/krzip.admin.controller.php new file mode 100644 index 000000000..31e33907d --- /dev/null +++ b/modules/krzip/krzip.admin.controller.php @@ -0,0 +1,33 @@ +krzip_server_hostname) $args->krzip_server_hostname = $this->hostname; + if(!$args->krzip_server_port) $args->krzip_server_port = $this->port; + if(!$args->krzip_server_query) $args->krzip_server_query = $this->query; + + // module Controller 객체 생성하여 입력 + $oModuleController = &getController('module'); + $output = $oModuleController->insertModuleConfig('krzip',$args); + return $output; + } + + } +?> diff --git a/modules/krzip/krzip.admin.view.php b/modules/krzip/krzip.admin.view.php new file mode 100644 index 000000000..cff50dcdb --- /dev/null +++ b/modules/krzip/krzip.admin.view.php @@ -0,0 +1,32 @@ +getModuleConfig('krzip'); + Context::set('config',$config); + + // 템플릿 파일 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('index'); + } + + + } +?> diff --git a/modules/krzip/krzip.class.php b/modules/krzip/krzip.class.php new file mode 100644 index 000000000..1a2eb1a23 --- /dev/null +++ b/modules/krzip/krzip.class.php @@ -0,0 +1,40 @@ +insertActionForward('krzip', 'view', 'dispKrzipAdminConfig'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + + } +?> diff --git a/modules/krzip/krzip.model.php b/modules/krzip/krzip.model.php new file mode 100644 index 000000000..f119cbbea --- /dev/null +++ b/modules/krzip/krzip.model.php @@ -0,0 +1,56 @@ +getModuleConfig('krzip'); + if($args->krzip_server_hostname) $this->hostname = $args->krzip_server_hostname; + if($args->krzip_server_port) $this->port = $args->krzip_server_port; + if($args->krzip_server_query) $this->query = $args->krzip_server_query; + + // 동네 이름을 받음 + $addr = trim(Context::get('addr')); + if(!$addr) return new Object(-1,'msg_not_exists_addr'); + + // 지정된 서버에 요청을 시도한다 + $query_string = $this->query.urlencode($addr); + + $fp = fsockopen($this->hostname, $this->port, $errno, $errstr); + if(!$fp) return new Object(-1, 'msg_fail_to_socket_open'); + + fputs($fp, "GET {$query_string} HTTP/1.0\r\n"); + fputs($fp, "Host: {$this->hostname}\r\n\r\n"); + + $buff = ''; + while(!feof($fp)) { + $str = fgets($fp, 1024); + if(trim($str)=='') $start = true; + if($start) $buff .= $str; + } + + fclose($fp); + + $address_list = unserialize(base64_decode($buff)); + if(!$address_list) return new Object(-1, 'msg_no_result'); + + $this->add('address_list', implode("\n",$address_list)); + } + } +?> diff --git a/modules/krzip/lang/en.lang.php b/modules/krzip/lang/en.lang.php new file mode 100644 index 000000000..707df2108 --- /dev/null +++ b/modules/krzip/lang/en.lang.php @@ -0,0 +1,22 @@ + + * @brief English language pack (Only basic contents are listed) + **/ + + // normal words + $lang->krzip = "Korean Zip code"; + $lang->krzip_server_hostname = "Server name for zip code checking"; + $lang->krzip_server_port = "Server port for zip code checking"; + $lang->krzip_server_query = "Server path for zip code checking"; + + // descriptions + $lang->about_krzip_server_hostname = "Input the server's domain for checking zip codes and receiving the result list"; + $lang->about_krzip_server_port = "Input the server's port number for checking the zip code"; + $lang->about_krzip_server_query = "Input the query url that will be requested for checking the zip code"; + + // error messages + $lang->msg_not_exists_addr = "Target for searching doesn't exist"; + $lang->msg_fail_to_socket_open = "Unabled to connect to zip code checking server"; +?> diff --git a/modules/krzip/lang/jp.lang.php b/modules/krzip/lang/jp.lang.php new file mode 100644 index 000000000..275ecdb6d --- /dev/null +++ b/modules/krzip/lang/jp.lang.php @@ -0,0 +1,22 @@ + 翻訳:RisaPapa + * @brief 日本語言語パッケージ(基本的な内容のみ) + **/ + + // 一般用語 + $lang->krzip = "韓国郵便番号"; + $lang->krzip_server_hostname = "郵便番号検索サーバ名"; + $lang->krzip_server_port = "郵便番号検索サーバのポート"; + $lang->krzip_server_query = "郵便番号検索サーバのクエリ"; + + // 설명문 + $lang->about_krzip_server_hostname = "郵便番号を検索して結果を取り寄せるサーバのドメインを入力してください。"; + $lang->about_krzip_server_port = "郵便番号検索サーバのポート番号を入力してください。"; + $lang->about_krzip_server_query = "郵便番号検索サーバに問い合わせるクエリのURLを入力してください。"; + + // 에러 메세지들 + $lang->msg_not_exists_addr = "入力された文字列では郵便番号が見つかりませんでした"; + $lang->msg_fail_to_socket_open = "郵便番号サーバとの接続に失敗しました"; +?> diff --git a/modules/krzip/lang/ko.lang.php b/modules/krzip/lang/ko.lang.php new file mode 100644 index 000000000..59a02a445 --- /dev/null +++ b/modules/krzip/lang/ko.lang.php @@ -0,0 +1,22 @@ + + * @brief 한국어 언어팩 (기본적인 내용만 수록) + **/ + + // 일반 단어들 + $lang->krzip = "한국 우편번호"; + $lang->krzip_server_hostname = "우편번호 검사 서버의 이름"; + $lang->krzip_server_port = "우편번호 검사 서버 포트"; + $lang->krzip_server_query = "우편번호 검사 서버 경로"; + + // 설명문 + $lang->about_krzip_server_hostname = "우편번호를 검사하여 결과 목록을 가져올 서버의 도메인을 입력해주세요"; + $lang->about_krzip_server_port = "우편번호를 검사서버의 포트 번호를 입력해주세요"; + $lang->about_krzip_server_query = "우편번호를 검사서버에 요청할 query url을 입력해 주세요"; + + // 에러 메세지들 + $lang->msg_not_exists_addr = "검색하려는 대상이 없습니다"; + $lang->msg_fail_to_socket_open = "우편번호 검색 대상 서버 접속이 실패하였습니다"; +?> diff --git a/modules/krzip/lang/zh-CN.lang.php b/modules/krzip/lang/zh-CN.lang.php new file mode 100644 index 000000000..80a924f2f --- /dev/null +++ b/modules/krzip/lang/zh-CN.lang.php @@ -0,0 +1,22 @@ + + * @brief 简体中文语言包(收录了基本内容) + **/ + + // 一般单词 + $lang->krzip = "韩国邮编"; + $lang->krzip_server_hostname = "邮编检测服务器名"; + $lang->krzip_server_port = "邮编检测服务器端口"; + $lang->krzip_server_query = "邮编检测服务器路径"; + + // 说明文 + $lang->about_krzip_server_hostname = "请输入要导入的检测结果目录服务器域名。"; + $lang->about_krzip_server_port = "请输入邮编检测服务器端口。"; + $lang->about_krzip_server_query = "请输入向邮编检测服务器发出请求的 query url。"; + + // 错误提示 + $lang->msg_not_exists_addr = "没有要搜索的对象!"; + $lang->msg_fail_to_socket_open = "连接邮编搜索对象服务器失败!"; +?> diff --git a/modules/krzip/tpl/filter/insert_config.xml b/modules/krzip/tpl/filter/insert_config.xml new file mode 100644 index 000000000..5b8a8a547 --- /dev/null +++ b/modules/krzip/tpl/filter/insert_config.xml @@ -0,0 +1,11 @@ + +
    + + + + + + + + +
    diff --git a/modules/krzip/tpl/index.html b/modules/krzip/tpl/index.html new file mode 100644 index 000000000..3a147f85b --- /dev/null +++ b/modules/krzip/tpl/index.html @@ -0,0 +1,37 @@ + + +

    {$lang->krzip} {$lang->cmd_management}

    + +
    + +++ + + + + + + + + + + + + +
    {$lang->krzip_server_hostname} + +

    {$lang->about_krzip_server_hostname}

    +
    {$lang->krzip_server_port} + +

    {$lang->about_krzip_server_port}

    +
    {$lang->krzip_server_query} + +

    {$lang->about_krzip_server_query}

    +
    + + +
    + +
    +
    diff --git a/modules/layout/conf/info.xml b/modules/layout/conf/info.xml new file mode 100644 index 000000000..a500872be --- /dev/null +++ b/modules/layout/conf/info.xml @@ -0,0 +1,17 @@ + + + 레이아웃 + 布局 + レイアウト + Layout + + 제로 + zero + Zero + zero + 레이아웃을 생성/관리하는 모듈입니다. + 生成/管理布局的模块。 + レイアウトを生成・管理するモジュールです。 + This module is for creating/managing. + + diff --git a/modules/layout/conf/module.xml b/modules/layout/conf/module.xml new file mode 100644 index 000000000..4c4ea1050 --- /dev/null +++ b/modules/layout/conf/module.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/modules/layout/lang/en.lang.php b/modules/layout/lang/en.lang.php new file mode 100644 index 000000000..1cd888894 --- /dev/null +++ b/modules/layout/lang/en.lang.php @@ -0,0 +1,32 @@ + + * @brief Layout module's basic language pack + **/ + + $lang->cmd_layout_management = 'Layout Setting'; + $lang->cmd_layout_edit = 'Edit Layout'; + + $lang->layout_name = 'Layout Name'; + $lang->layout_maker = "Layout Developer"; + $lang->layout_history = "Updates"; + $lang->layout_info = "Layout Info"; + $lang->layout_list = 'Layout List'; + $lang->menu_count = 'Menus'; + $lang->downloaded_list = 'Download List'; + $lang->layout_preview_content = 'The content gets displayed here'; + $lang->not_apply_menu = 'Apply Layouts'; + + $lang->cmd_move_to_installed_list = "View created list"; + + $lang->about_downloaded_layouts = "List of downloaded layouts"; + $lang->about_title = 'Please input the title that is easy to verify when connecting to module'; + $lang->about_not_apply_menu = 'All connected module\'s layout will be changed by checking this option.'; + + $lang->about_layout = "Layout module helps you to create the site's layout easily.
    By using layout setting and menu connection, website's completed shape will display with various modules.
    * Those layouts which are unabled to delete or modify are the blog or other module's layout. "; + $lang->about_layout_code = + "It will be applied to the service when you save the layout code after editing it. + You must previous the result before saving it. + Refer to ZeroboardXE Pamphlet for ZeroboardXE's grammer of pamphlet."; +?> diff --git a/modules/layout/lang/jp.lang.php b/modules/layout/lang/jp.lang.php new file mode 100644 index 000000000..003137a7a --- /dev/null +++ b/modules/layout/lang/jp.lang.php @@ -0,0 +1,32 @@ + 翻訳:RisaPapa + * @brief レイアウト(layout)モジュールの基本言語パッケージ + **/ + + $lang->cmd_layout_management = 'レイアウト設定'; + $lang->cmd_layout_edit = 'レイアウト編集'; + + $lang->layout_name = 'レイアウト名'; + $lang->layout_maker = "レイアウト作者"; + $lang->layout_history = "変更内容 "; + $lang->layout_info = "レイアウト情報"; + $lang->layout_list = 'レイアウトリスト'; + $lang->menu_count = 'メニュー数'; + $lang->downloaded_list = 'ダウンロードリスト'; + $lang->layout_preview_content = '内容が出力される部分です。'; + $lang->not_apply_menu = 'レイアウトの一括適用'; + + $lang->cmd_move_to_installed_list = "作成されたリスト表示"; + + $lang->about_downloaded_layouts = "ダウンロードのレイアウトリスト"; + $lang->about_title = 'モジュールとの連動をわかりやすく区分するためのタイトルを入力してください。'; + $lang->about_not_apply_menu = 'チェックを入れると連動するすべてのメニューのモジュールのレイアウトを一括変更します。'; + + $lang->about_layout = "レイアウトのモジュールはサイトのレイアウトを分かりやすく作成できるようにします。レイアウトの設定とメニューのリンクで様々なモジュールで完成されたサイトデザインができます。
    ★削除・修正ができないレイアウトはブログまたは他のモジュールのレイアウトであるため、該当するモジュールで設定を行ってください。"; + $lang->about_layout_code = + "下のレイアウトコードを修正して保存するとサービスに反映されます。 + 必ずプレビューで確認した上で保存してください。 + ゼロボードXEのテンプレート文法はゼロボードXEテンプレートを参考してください。"; +?> diff --git a/modules/layout/lang/ko.lang.php b/modules/layout/lang/ko.lang.php new file mode 100644 index 000000000..1fba3d8e9 --- /dev/null +++ b/modules/layout/lang/ko.lang.php @@ -0,0 +1,32 @@ + + * @brief 레이아웃(layout) 모듈의 기본 언어팩 + **/ + + $lang->cmd_layout_management = '레이아웃 설정'; + $lang->cmd_layout_edit = '레이아웃 편집'; + + $lang->layout_name = '레이아웃 이름'; + $lang->layout_maker = "레이아웃 제작자"; + $lang->layout_history = "변경 사항 "; + $lang->layout_info = "레이아웃 정보"; + $lang->layout_list = '레이아웃 목록'; + $lang->menu_count = '메뉴수'; + $lang->downloaded_list = '다운로드 목록'; + $lang->layout_preview_content = '내용이 출력되는 부분입니다'; + $lang->not_apply_menu = '레이아웃 일괄 적용'; + + $lang->cmd_move_to_installed_list = "생성된 목록 보기"; + + $lang->about_downloaded_layouts = "다운로드 되어 있는 레이아웃 목록"; + $lang->about_title = '모듈에 연결시 쉽게 구분할 수 있는 제목을 입력해주세요'; + $lang->about_not_apply_menu = '체크를 하시면 연결된 모든 메뉴의 모듈 레이아웃을 일괄 변경합니다.'; + + $lang->about_layout = "레이아웃 모듈은 사이트의 레이아웃을 쉽게 만들 수 있도록 도와줍니다.
    레이아웃 설정과 메뉴의 연결을 통해서 다양한 모듈이 완성된 사이트의 모습으로 보여줄 수 있도록 합니다.
    * 삭제나 수정이 불가능한 레이아웃은 블로그나 기타 모듈의 자체 레이아웃이므로 해당 모듈로 가서 설정하셔야 합니다."; + $lang->about_layout_code = + "아래 레이아웃의 코드를 직접 수정후 저장하시면 서비스에 반영이 됩니다. + 꼭 미리보기를 하신 후에 저장을 하세요. + 제로보드XE의 템플릿 문법은 제로보드XE 템플릿 을 참고하시면 됩니다."; +?> diff --git a/modules/layout/lang/zh-CN.lang.php b/modules/layout/lang/zh-CN.lang.php new file mode 100644 index 000000000..83b2bed91 --- /dev/null +++ b/modules/layout/lang/zh-CN.lang.php @@ -0,0 +1,34 @@ + + * @brief 布局(layout) 模块语言包 + **/ + + $lang->cmd_layout_management = '布局设置'; + $lang->cmd_layout_edit = '布局编辑'; + $lang->cmd_preview = '预览'; + $lang->cmd_reset = '初始化'; + + $lang->layout_name = '布局名'; + $lang->layout_maker = "布局作者"; + $lang->layout_history = "更新记录 "; + $lang->layout_info = "布局信息"; + $lang->layout_list = '布局目录'; + $lang->menu_count = '菜单数'; + $lang->downloaded_list = '下载目录'; + $lang->layout_preview_content = '显示内容的部分。'; + $lang->not_apply_menu = '布局共享'; + + $lang->cmd_move_to_installed_list = "查看生成目录"; + + $lang->about_downloaded_layouts = "已下载的布局目录"; + $lang->about_title = '请输入连接模块时容易区分的标题。'; + $lang->about_not_apply_menu = '更新所有被连接到菜单的模块布局。'; + + $lang->about_layout = "布局模块是使制作网站变得更简单。
    通过布局设定和菜单的链接可以展示多种模块组成的网站。
    * 不能删除和修改的布局是博客或其他模块自带的布局,要设定到相关模块设置。"; + $lang->about_layout_code = + "修改下面的布局代码,保存后即可生效。 + 保存之前请必须先预览后再保存。 + Zeroboard XE 模板语法请参考 zeroboard XE 模板。"; +?> diff --git a/modules/layout/layout.admin.controller.php b/modules/layout/layout.admin.controller.php new file mode 100644 index 000000000..7c4f5612a --- /dev/null +++ b/modules/layout/layout.admin.controller.php @@ -0,0 +1,194 @@ +layout_srl = getNextSequence(); + $args->layout = Context::get('layout'); + $args->title = Context::get('title'); + + $output = $this->insertLayout($args); + if(!$output->toBool()) return $output; + + $this->add('layout_srl', $args->layout_srl); + } + + function insertLayout($args) { + $output = executeQuery("layout.insertLayout", $args); + return $output; + } + + /** + * @brief 레이아웃 정보 변경 + * 생성된 레이아웃의 제목과 확장변수(extra_vars)를 적용한다 + **/ + function procLayoutAdminUpdate() { + // module, act, layout_srl, layout, title을 제외하면 확장변수로 판단.. 좀 구리다.. + $extra_vars = Context::getRequestVars(); + unset($extra_vars->module); + unset($extra_vars->act); + unset($extra_vars->layout_srl); + unset($extra_vars->layout); + unset($extra_vars->title); + unset($extra_vars->apply_layout); + + $args = Context::gets('layout_srl','title'); + + // 레이아웃의 정보를 가져옴 + $oLayoutModel = &getModel('layout'); + $layout_info = $oLayoutModel->getLayout($args->layout_srl); + $menus = get_object_vars($layout_info->menu); + if(count($menus)) { + foreach($menus as $menu_id => $val) { + $menu_srl = Context::get($menu_id); + if(!$menu_srl) continue; + $menu_srl_list[] = $menu_srl; + } + + // 정해진 메뉴가 있으면 모듈 및 메뉴에 대한 레이아웃 연동 + if(count($menu_srl_list) && Context::get('apply_layout')=='Y') { + // 해당 메뉴와 레이아웃 값을 매핑 + $oMenuAdminController = &getAdminController('menu'); + $oMenuAdminController->updateMenuLayout($args->layout_srl, $menu_srl_list); + + // 해당 메뉴에 속한 mid의 layout값을 모두 변경 + $oModuleController = &getController('module'); + $oModuleController->updateModuleLayout($args->layout_srl, $menu_srl_list); + } + } + + // extra_vars의 type이 image일 경우 별도 처리를 해줌 + if($layout_info->extra_var) { + foreach($layout_info->extra_var as $name => $vars) { + if($vars->type!='image') continue; + + $image_obj = $extra_vars->{$name}; + $extra_vars->{$name} = $layout_info->extra_var->{$name}->value; + + // 삭제 요청에 대한 변수를 구함 + $del_var = $extra_vars->{"del_".$name}; + unset($extra_vars->{"del_".$name}); + if($del_var == 'Y') { + $extra_vars->{$name} = ''; + @unlink($extra_vars->{$name}); + continue; + } + + // 정상적으로 업로드된 파일이 아니면 무시 + if(!$image_obj['tmp_name'] || !is_uploaded_file($image_obj['tmp_name'])) continue; + + // 이미지 파일이 아니어도 무시 (swf는 패스~) + if(!eregi("\.(jpg|jpeg|gif|png|swf)$", $image_obj['name'])) continue; + + // 경로를 정해서 업로드 + $path = sprintf("./files/attach/images/%s/", $args->layout_srl); + + // 디렉토리 생성 + if(!FileHandler::makeDir($path)) continue; + + $filename = $path.$image_obj['name']; + + // 파일 이동 + if(!move_uploaded_file($image_obj['tmp_name'], $filename)) continue; + + $extra_vars->{$name} = $filename; + } + } + + // DB에 입력하기 위한 변수 설정 + $args->extra_vars = serialize($extra_vars); + + $output = $this->updateLayout($args); + if(!$output->toBool()) return $output; + + $this->setLayoutPath('./common/tpl'); + $this->setLayoutFile('default_layout.html'); + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile("top_refresh.html"); + } + + function updateLayout($args) { + $output = executeQuery('layout.updateLayout', $args); + if($output->toBool()) { + $cache_file = sprintf('./files/cache/layout/%s.%s.cache.php', $args->layout_srl, Context::getLangType()); + @unlink($cache_file); + } + return $output; + } + + /** + * @brief 레이아웃 삭제 + * 삭제시 메뉴 xml 캐시 파일도 삭제 + **/ + function procLayoutAdminDelete() { + $layout_srl = Context::get('layout_srl'); + + // 캐시 파일 삭제 + $cache_list = FileHandler::readDir("./files/cache/layout","",false,true); + if(count($cache_list)) { + foreach($cache_list as $cache_file) { + $pos = strpos($cache_file, $layout_srl.'_'); + if($pos>0) unlink($cache_file); + } + } + + $layout_file = sprintf('./files/cache/layout/%d.html', $layout_srl); + if(file_exists($layout_file)) @unlink($layout_file); + + // 레이아웃 삭제 + $args->layout_srl = $layout_srl; + + $output = $this->deleteLayout($args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_deleted'); + } + + function deleteLayout($args) { + $output = executeQuery("layout.deleteLayout", $args); + return $output; + } + + /** + * @brief 레이아웃 코드 추가 + **/ + function procLayoutAdminCodeUpdate() { + $layout_srl = Context::get('layout_srl'); + $code = Context::get('code'); + if(!$layout_srl || !$code) return new Object(-1, 'msg_invalid_request'); + + $layout_file = sprintf('./files/cache/layout/%d.html', $layout_srl); + FileHandler::writeFile($layout_file, $code); + + $this->setMessage('success_updated'); + } + + /** + * @brief 레이아웃 코드 초기화 + **/ + function procLayoutAdminCodeReset() { + $layout_srl = Context::get('layout_srl'); + if(!$layout_srl) return new Object(-1, 'msg_invalid_request'); + + $layout_file = sprintf('./files/cache/layout/%d.html', $layout_srl); + @unlink($layout_file); + + $this->setMessage('success_reset'); + } + } +?> diff --git a/modules/layout/layout.admin.view.php b/modules/layout/layout.admin.view.php new file mode 100644 index 000000000..f29142a7e --- /dev/null +++ b/modules/layout/layout.admin.view.php @@ -0,0 +1,179 @@ +setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 레이아웃 관리의 첫 페이지 + **/ + function dispLayoutAdminContent() { + $oLayoutModel = &getModel('layout'); + $layout_list = $oLayoutModel->getLayoutList(); + Context::set('layout_list', $layout_list); + + $this->setTemplateFile('index'); + } + + /** + * @brief 레이아웃 등록 페이지 + * 1차적으로 레이아웃만 선택한 후 DB 에 빈 값을 넣고 그 후 상세 값 설정하는 단계를 거침 + **/ + function dispLayoutAdminInsert() { + // 레이아웃 목록을 세팅 + $oLayoutModel = &getModel('layout'); + $layout_list = $oLayoutModel->getDownloadedLayoutList(); + Context::set('layout_list', $layout_list); + + $this->setTemplateFile('insert_layout'); + } + + /** + * @brief 레이아웃 세부 정보 입력 + **/ + function dispLayoutAdminModify() { + // 선택된 레이아웃의 정보르 구해서 세팅 + $layout_srl = Context::get('layout_srl'); + + // 레이아웃의 정보를 가져옴 + $oLayoutModel = &getModel('layout'); + $layout_info = $oLayoutModel->getLayout($layout_srl); + + // 등록된 레이아웃이 없으면 오류 표시 + if(!$layout_info) return $this->dispLayoutAdminContent(); + + Context::set('selected_layout', $layout_info); + + // 메뉴 목록을 가져옴 + $oMenuAdminModel = &getAdminModel('menu'); + $menu_list = $oMenuAdminModel->getMenus(); + Context::set('menu_list', $menu_list); + + $this->setTemplateFile('layout_modify'); + } + + /** + * @brief 레이아웃 코드 편집 + **/ + function dispLayoutAdminEdit() { + // 선택된 레이아웃의 정보르 구해서 세팅 + $layout_srl = Context::get('layout_srl'); + + // 레이아웃의 정보를 가져옴 + $oLayoutModel = &getModel('layout'); + $layout_info = $oLayoutModel->getLayout($layout_srl); + + // 등록된 레이아웃이 없으면 오류 표시 + if(!$layout_info) return $this->dispLayoutAdminContent(); + Context::set('selected_layout', $layout_info); + + // 레이아웃 코드 가져오기 + $layout_file = sprintf('./files/cache/layout/%d.html', $layout_info->layout_srl); + if(!file_exists($layout_file)) $layout_file = sprintf('%s%s', $layout_info->path, 'layout.html'); + + $layout_code = FileHandler::readFile($layout_file); + Context::set('layout_code', $layout_code); + + // 위젯 목록을 세팅 + $oWidgetModel = &getModel('widget'); + $widget_list = $oWidgetModel->getDownloadedWidgetList(); + Context::set('widget_list', $widget_list); + + $this->setTemplateFile('layout_edit'); + } + + /** + * @brief 레이아웃 목록을 보여줌 + **/ + function dispLayoutAdminDownloadedList() { + // 레이아웃 목록을 세팅 + $oLayoutModel = &getModel('layout'); + $layout_list = $oLayoutModel->getDownloadedLayoutList(); + Context::set('layout_list', $layout_list); + + $this->setTemplateFile('downloaded_layout_list'); + } + + /** + * @brief 레이아웃 미리 보기 + **/ + function dispLayoutAdminPreview() { + $layout_srl = Context::get('layout_srl'); + $code = Context::get('code'); + + if(!$layout_srl || !$code) return new Object(-1, 'msg_invalid_request'); + //$code = str_replace(array('<','>','"'), array('<','>','"'), $code); + + // 레이아웃 정보 가져오기 + $oLayoutModel = &getModel('layout'); + $layout_info = $oLayoutModel->getLayout($layout_srl); + if(!$layout_info) return new Object(-1, 'msg_invalid_request'); + + // 레이아웃 정보중 extra_vars의 이름과 값을 $layout_info에 입력 + if($layout_info->extra_var_count) { + foreach($layout_info->extra_var as $var_id => $val) { + $layout_info->{$var_id} = $val->value; + } + } + + // 레이아웃 정보중 menu를 Context::set + if($layout_info->menu_count) { + foreach($layout_info->menu as $menu_id => $menu) { + if(file_exists($menu->php_file)) @include($menu->php_file); + Context::set($menu_id, $menu); + } + } + + Context::set('layout_info', $layout_info); + Context::set('content', Context::getLang('layout_preview_content')); + + // 코드를 임시로 저장 + $edited_layout_file = sprintf('./files/cache/layout/tmp.tpl'); + FileHandler::writeFile($edited_layout_file, $code); + + // 컴파일 + $oTemplate = &TemplateHandler::getInstance(); + + $layout_path = $layout_info->path; + $layout_file = 'layout'; + + $layout_tpl = $oTemplate->compile($layout_path, $layout_file, $edited_layout_file); + + // 위젯등을 변환 + $oContext = &Context::getInstance(); + $layout_tpl = $oContext->transContent($layout_tpl); + Context::set('layout_tpl', $layout_tpl); + + // 임시 파일 삭제 + @unlink($edited_layout_file); + + $this->setTemplateFile('layout_preview'); + } + + /** + * @brief 레이아웃의 상세 정보(conf/info.xml)를 팝업 출력 + **/ + function dispLayoutAdminInfo() { + // 선택된 레이아웃 정보를 구함 + $oLayoutModel = &getModel('layout'); + $layout_info = $oLayoutModel->getLayoutInfo(Context::get('selected_layout')); + Context::set('layout_info', $layout_info); + + // 레이아웃을 팝업으로 지정 + $this->setLayoutFile('popup_layout'); + + // 템플릿 파일 지정 + $this->setTemplateFile('layout_detail_info'); + } + } +?> diff --git a/modules/layout/layout.class.php b/modules/layout/layout.class.php new file mode 100644 index 000000000..614fbead3 --- /dev/null +++ b/modules/layout/layout.class.php @@ -0,0 +1,43 @@ +insertActionForward('layout', 'view', 'dispLayoutAdminContent'); + $oModuleController->insertActionForward('layout', 'view', 'dispLayoutAdminInsert'); + $oModuleController->insertActionForward('layout', 'view', 'dispLayoutAdminModify'); + $oModuleController->insertActionForward('layout', 'view', 'dispLayoutAdminEdit'); + $oModuleController->insertActionForward('layout', 'view', 'dispLayoutAdminDownloadedList'); + $oModuleController->insertActionForward('layout', 'view', 'dispLayoutAdminInfo'); + + // 레이아웃에서 사용할 디렉토리 생성 + FileHandler::makeDir('./files/cache/layout'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + } +?> diff --git a/modules/layout/layout.model.php b/modules/layout/layout.model.php new file mode 100644 index 000000000..a5d1ffeec --- /dev/null +++ b/modules/layout/layout.model.php @@ -0,0 +1,206 @@ +data) return; + + if(is_array($output->data)) return $output->data; + return array($output->data); + } + + /** + * @brief DB 에 생성된 한개의 레이아웃 정보를 구함 + * 생성된 레이아웃의 DB정보+XML정보를 return + **/ + function getLayout($layout_srl) { + // 일단 DB에서 정보를 가져옴 + $args->layout_srl = $layout_srl; + $output = executeQuery('layout.getLayout', $args); + if(!$output->data) return; + + // layout, extra_vars를 정리한 후 xml 파일 정보를 정리해서 return + $layout_info = $this->getLayoutInfo($layout, $output->data); + return $layout_info; + } + + /** + * @brief 레이아웃의 경로를 구함 + **/ + function getLayoutPath($layout_name) { + $class_path = sprintf('./layouts/%s/', $layout_name); + if(is_dir($class_path)) return $class_path; + + return ""; + } + + /** + * @brief 레이아웃의 종류와 정보를 구함 + * 다운로드되어 있는 레이아웃의 종류 (생성과 다른 의미) + **/ + function getDownloadedLayoutList() { + // 다운받은 레이아웃과 설치된 레이아웃의 목록을 구함 + $searched_list = FileHandler::readDir('./layouts'); + $searched_count = count($searched_list); + if(!$searched_count) return; + + // 찾아진 레이아웃 목록을 loop돌면서 필요한 정보를 간추려 return + for($i=0;$i<$searched_count;$i++) { + // 레이아웃의 이름 + $layout = $searched_list[$i]; + + // 해당 레이아웃의 정보를 구함 + $layout_info = $this->getLayoutInfo($layout); + + $list[] = $layout_info; + } + return $list; + } + + /** + * @brief 모듈의 conf/info.xml 을 읽어서 정보를 구함 + * 이것 역시 캐싱을 통해서 xml parsing 시간을 줄인다.. + **/ + function getLayoutInfo($layout, $info = null) { + if($info) { + $layout_title = $info->title; + $layout = $info->layout; + $layout_srl = $info->layout_srl; + $vars = unserialize($info->extra_vars); + + if($info->module_srl) { + $layout_path = preg_replace('/([a-zA-Z0-9\_\.]+)(\.html)$/','',$info->layout_path); + $xml_file = sprintf('%sskin.xml', $layout_path); + } + } + + // 요청된 모듈의 경로를 구한다. 없으면 return + if(!$layout_path) $layout_path = $this->getLayoutPath($layout); + if(!is_dir($layout_path)) return; + + // 현재 선택된 모듈의 스킨의 정보 xml 파일을 읽음 + if(!$xml_file) $xml_file = sprintf("%sconf/info.xml", $layout_path); + if(!file_exists($xml_file)) { + $layout_info->layout = $layout; + $layout_info->path = $layout_path; + $layout_info->layout_title = $layout_title; + return $layout_info; + } + + // cache 파일을 비교하여 문제 없으면 include하고 $layout_info 변수를 return + if(!$layout_srl) $cache_file = sprintf('./files/cache/layout/%s.%s.cache.php', $layout, Context::getLangType()); + else $cache_file = sprintf('./files/cache/layout/%s.%s.cache.php', $layout_srl, Context::getLangType()); + + if(file_exists($cache_file)&&filectime($cache_file)>filectime($xml_file)) { + @include($cache_file); + + if($layout_info->extra_var && $vars) { + foreach($vars as $key => $value) { + if(!$layout_info->extra_var->{$key} && !$layout_info->{$key}) { + $layout_info->{$key} = $value; + } + } + } + return $layout_info; + } + + // cache 파일이 없으면 xml parsing하고 변수화 한 후에 캐시 파일에 쓰고 변수 바로 return + $oXmlParser = new XmlParser(); + $tmp_xml_obj = $oXmlParser->loadXmlFile($xml_file); + if($tmp_xml_obj->layout) $xml_obj = $tmp_xml_obj->layout; + elseif($tmp_xml_obj->skin) $xml_obj = $tmp_xml_obj->skin; + + if(!$xml_obj) return; + + $buff = ''; + + // 레이아웃의 제목, 버전 + $buff .= sprintf('$layout_info->layout = "%s";', $layout); + $buff .= sprintf('$layout_info->path = "%s";', $layout_path); + $buff .= sprintf('$layout_info->title = "%s";', $xml_obj->title->body); + $buff .= sprintf('$layout_info->version = "%s";', $xml_obj->attrs->version); + $buff .= sprintf('$layout_info->layout_srl = $layout_srl;'); + $buff .= sprintf('$layout_info->layout_title = $layout_title;'); + + // 작성자 정보 + $buff .= sprintf('$layout_info->author->name = "%s";', $xml_obj->author->name->body); + $buff .= sprintf('$layout_info->author->email_address = "%s";', $xml_obj->author->attrs->email_address); + $buff .= sprintf('$layout_info->author->homepage = "%s";', $xml_obj->author->attrs->link); + $buff .= sprintf('$layout_info->author->date = "%s";', $xml_obj->author->attrs->date); + $buff .= sprintf('$layout_info->author->description = "%s";', $xml_obj->author->description->body); + + // 추가 변수 (템플릿에서 사용할 제작자 정의 변수) + $extra_vars = $xml_obj->extra_vars->var; + if($extra_vars) { + if(!is_array($extra_vars)) $extra_vars = array($extra_vars); + + $extra_var_count = count($extra_vars); + + $buff .= sprintf('$layout_info->extra_var_count = "%s";', $extra_var_count); + for($i=0;$i<$extra_var_count;$i++) { + unset($var); + unset($options); + $var = $extra_vars[$i]; + $name = $var->attrs->name; + + $buff .= sprintf('$layout_info->extra_var->%s->title = "%s";', $name, $var->title->body); + $buff .= sprintf('$layout_info->extra_var->%s->type = "%s";', $name, $var->attrs->type); + $buff .= sprintf('$layout_info->extra_var->%s->value = $vars->%s;', $name, $name); + $buff .= sprintf('$layout_info->extra_var->%s->description = "%s";', $name, str_replace('"','\"',$var->description->body)); + + $options = $var->options; + if(!$options) continue; + + if(!is_array($options)) $options = array($options); + $options_count = count($options); + for($j=0;$j<$options_count;$j++) { + $buff .= sprintf('$layout_info->extra_var->%s->options["%s"] = "%s";', $var->attrs->name, $options[$j]->value->body, $options[$j]->title->body); + } + } + } + + // 메뉴 + if($xml_obj->menus->menu) { + $menus = $xml_obj->menus->menu; + if(!is_array($menus)) $menus = array($menus); + + $menu_count = count($menus); + $buff .= sprintf('$layout_info->menu_count = "%s";', $menu_count); + for($i=0;$i<$menu_count;$i++) { + $name = $menus[$i]->attrs->name; + if($menus[$i]->attrs->default == "true") $buff .= sprintf('$layout_info->default_menu = "%s";', $name); + $buff .= sprintf('$layout_info->menu->%s->name = "%s";',$name, $menus[$i]->attrs->name); + $buff .= sprintf('$layout_info->menu->%s->title = "%s";',$name, $menus[$i]->title->body); + $buff .= sprintf('$layout_info->menu->%s->maxdepth = "%s";',$name, $menus[$i]->maxdepth->body); + + $buff .= sprintf('$layout_info->menu->%s->menu_srl = $vars->%s;', $name, $name); + $buff .= sprintf('$layout_info->menu->%s->xml_file = "./files/cache/menu/".$vars->%s.".xml.php";',$name, $name); + $buff .= sprintf('$layout_info->menu->%s->php_file = "./files/cache/menu/".$vars->%s.".php";',$name, $name); + } + } + + $buff = ''; + FileHandler::writeFile($cache_file, $buff); + if(file_exists($cache_file)) @include($cache_file); + return $layout_info; + } + + } +?> diff --git a/modules/layout/queries/deleteLayout.xml b/modules/layout/queries/deleteLayout.xml new file mode 100644 index 000000000..ef2274982 --- /dev/null +++ b/modules/layout/queries/deleteLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/layout/queries/getLayout.xml b/modules/layout/queries/getLayout.xml new file mode 100644 index 000000000..9fd528605 --- /dev/null +++ b/modules/layout/queries/getLayout.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/layout/queries/getLayoutList.xml b/modules/layout/queries/getLayoutList.xml new file mode 100644 index 000000000..d71c2db7d --- /dev/null +++ b/modules/layout/queries/getLayoutList.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/layout/queries/insertLayout.xml b/modules/layout/queries/insertLayout.xml new file mode 100644 index 000000000..a191a1923 --- /dev/null +++ b/modules/layout/queries/insertLayout.xml @@ -0,0 +1,13 @@ + + +
    + + + + + + + + + + diff --git a/modules/layout/queries/updateLayout.xml b/modules/layout/queries/updateLayout.xml new file mode 100644 index 000000000..6c768ddf4 --- /dev/null +++ b/modules/layout/queries/updateLayout.xml @@ -0,0 +1,13 @@ + + +
    + + + + + + + + + + diff --git a/modules/layout/schemas/layouts.xml b/modules/layout/schemas/layouts.xml new file mode 100644 index 000000000..c28425343 --- /dev/null +++ b/modules/layout/schemas/layouts.xml @@ -0,0 +1,9 @@ +
    + + + + + + + +
    diff --git a/modules/layout/tpl/downloaded_layout_list.html b/modules/layout/tpl/downloaded_layout_list.html new file mode 100644 index 000000000..d0cf55b66 --- /dev/null +++ b/modules/layout/tpl/downloaded_layout_list.html @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->layout_name}{$lang->version}{$lang->author}{$lang->menu_count}{$lang->date}{$lang->path}{$lang->cmd_make}
    + {$val->title}
    + ({$val->layout}) +
    {$val->version}{$val->author->name}{$val->menu_count}{$val->author->date}{$val->path}{$lang->cmd_make}
    + {nl2br($val->author->description)} +
    {$val->layout}{$val->path}{$lang->cmd_make}
    diff --git a/modules/layout/tpl/filter/delete_layout.xml b/modules/layout/tpl/filter/delete_layout.xml new file mode 100644 index 000000000..1e2961876 --- /dev/null +++ b/modules/layout/tpl/filter/delete_layout.xml @@ -0,0 +1,9 @@ + +
    + + + + + + +
    diff --git a/modules/layout/tpl/filter/insert_layout.xml b/modules/layout/tpl/filter/insert_layout.xml new file mode 100644 index 000000000..9b5b52c1a --- /dev/null +++ b/modules/layout/tpl/filter/insert_layout.xml @@ -0,0 +1,14 @@ + +
    + + + + + + + + + + + +
    diff --git a/modules/layout/tpl/filter/reset_layout_code.xml b/modules/layout/tpl/filter/reset_layout_code.xml new file mode 100644 index 000000000..84137846d --- /dev/null +++ b/modules/layout/tpl/filter/reset_layout_code.xml @@ -0,0 +1,10 @@ + +
    + + + + + + + +
    diff --git a/modules/layout/tpl/filter/update_layout_code.xml b/modules/layout/tpl/filter/update_layout_code.xml new file mode 100644 index 000000000..10a7ffae8 --- /dev/null +++ b/modules/layout/tpl/filter/update_layout_code.xml @@ -0,0 +1,10 @@ + +
    + + + + + + + +
    diff --git a/modules/layout/tpl/filter/update_layout_info.xml b/modules/layout/tpl/filter/update_layout_info.xml new file mode 100644 index 000000000..1cf5f5dc6 --- /dev/null +++ b/modules/layout/tpl/filter/update_layout_info.xml @@ -0,0 +1,9 @@ + +
    + + + + + + +
    diff --git a/modules/layout/tpl/header.html b/modules/layout/tpl/header.html new file mode 100644 index 000000000..1be97ddcb --- /dev/null +++ b/modules/layout/tpl/header.html @@ -0,0 +1,15 @@ + + +

    {$lang->layout} {$lang->cmd_management}

    + +
    {nl2br($lang->about_layout)}
    + + + +
    + +
    + diff --git a/modules/layout/tpl/index.html b/modules/layout/tpl/index.html new file mode 100644 index 000000000..3cfdf16b2 --- /dev/null +++ b/modules/layout/tpl/index.html @@ -0,0 +1,60 @@ + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->no}{$lang->layout}{$lang->title}{$lang->regdate}{$lang->cmd_layout_management}{$lang->cmd_layout_edit}{$lang->cmd_delete}
    {$no+1} + {$val->layout} + + (module) + + {htmlspecialchars($val->title)}{zdate($val->regdate,"Y-m-d")} + + {$lang->cmd_layout_management} + +   + + + {$lang->cmd_layout_edit} + + + {$lang->cmd_delete} + +   + +
    + + + diff --git a/modules/layout/tpl/insert_layout.html b/modules/layout/tpl/insert_layout.html new file mode 100644 index 000000000..ea982589f --- /dev/null +++ b/modules/layout/tpl/insert_layout.html @@ -0,0 +1,33 @@ + + + + +
    + + + + + + + + + + + + +
    {$lang->layout_name} + +
    {$lang->title} + +

    {$lang->about_title}

    +
    + +
    + +
    + +
    diff --git a/modules/layout/tpl/js/layout_admin.js b/modules/layout/tpl/js/layout_admin.js new file mode 100644 index 000000000..d15b35c79 --- /dev/null +++ b/modules/layout/tpl/js/layout_admin.js @@ -0,0 +1,44 @@ +/* 레이아웃 신규 생성시 완료 후 요청하는 함수 */ +function completeInsertLayout(ret_obj) { + var layout_srl = ret_obj['layout_srl']; + var url = current_url.setQuery('act','dispLayoutAdminModify').setQuery('layout_srl',layout_srl); + location.href = url; +} + +/* 레이아웃 삭제 */ +function doDeleteLayout(layout_srl) { + var fo_obj = xGetElementById("fo_layout"); + if(!fo_obj) return; + fo_obj.layout_srl.value = layout_srl; + + procFilter(fo_obj, delete_layout); +} + +/* 수정된 레이아웃을 원본으로 돌림 */ +function doResetLayoutCode(layout_srl) { + var fo_obj = xGetElementById('fo_layout'); + procFilter(fo_obj, reset_layout_code); + return false; +} + +/* 수정중인 레이아웃 미리보기 */ +function doPreviewLayoutCode() { + var fo_obj = xGetElementById('fo_layout'); + fo_obj.target = "_LayoutPreview"; + fo_obj.act.value = "dispLayoutAdminPreview"; + fo_obj.submit(); + fo_obj.act.value = ""; + fo_obj.target = ""; +} + + +/* 메뉴 관리로 이동 */ +function doMenuManagement(menu_id) { + var fo_obj = xGetElementById("fo_layout"); + var sel_obj = fo_obj[menu_id]; + if(sel_obj.selectedIndex == 0) return; + var menu_srl = sel_obj.options[sel_obj.selectedIndex].value; + + var url = current_url.setQuery('act','dispMenuAdminManagement').setQuery('menu_srl',menu_srl); + winopen(url,'MenuManage','width=850,height=800,resizable=yes,scrollbars=yes,toolbars=no'); +} diff --git a/modules/layout/tpl/layout_detail_info.html b/modules/layout/tpl/layout_detail_info.html new file mode 100644 index 000000000..5be1f16d9 --- /dev/null +++ b/modules/layout/tpl/layout_detail_info.html @@ -0,0 +1,36 @@ +
    +

    {$lang->layout_maker}

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->title}{$layout_info->title} ver {$layout_info->version}
    {$lang->author}{$layout_info->author->name}
    {$lang->homepage}{$layout_info->author->homepage}
    {$lang->regdate}{$layout_info->author->date}
    {$lang->description}{nl2br($layout_info->author->description)}
    +
    + + diff --git a/modules/layout/tpl/layout_edit.html b/modules/layout/tpl/layout_edit.html new file mode 100644 index 000000000..0005b2739 --- /dev/null +++ b/modules/layout/tpl/layout_edit.html @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + +
    {$selected_layout->title} ver {$selected_layout->version} ({$selected_layout->layout})
    {nl2br($lang->about_layout_code)}
    + + +++ + + + +
    {$lang->widget} + + + +
    + +
    +
    + + + + +
    + +
    + + +
    +
    diff --git a/modules/layout/tpl/layout_modify.html b/modules/layout/tpl/layout_modify.html new file mode 100644 index 000000000..5c6fdc38c --- /dev/null +++ b/modules/layout/tpl/layout_modify.html @@ -0,0 +1,114 @@ + + + + + +++ + + + + + + + + + + + + + + + + + + + +
    {$lang->layout}{$selected_layout->title} ver {$selected_layout->version} ({$selected_layout->layout})
    {$lang->path}{$selected_layout->path}
    {$lang->author}{$selected_layout->author->name}
    {$lang->description}{nl2br($selected_layout->author->description)}
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->title} + +

    {$lang->about_title}

    +
    {$var->title} + + + + + + + + + +
    + image
    + + +
    + + + + + + + +

    {$var->description}

    +
    {$menu_info->title}
    ({$menu_name})
    + + {$lang->cmd_management} +
    {$lang->not_apply_menu} + + {$lang->about_not_apply_menu} +
    + + +
    + + diff --git a/modules/layout/tpl/layout_preview.html b/modules/layout/tpl/layout_preview.html new file mode 100644 index 000000000..a90895a2b --- /dev/null +++ b/modules/layout/tpl/layout_preview.html @@ -0,0 +1 @@ +{$layout_tpl} diff --git a/modules/layout/tpl/top_refresh.html b/modules/layout/tpl/top_refresh.html new file mode 100644 index 000000000..1c4d1632d --- /dev/null +++ b/modules/layout/tpl/top_refresh.html @@ -0,0 +1,4 @@ + diff --git a/modules/member/conf/info.xml b/modules/member/conf/info.xml new file mode 100644 index 000000000..84578db6b --- /dev/null +++ b/modules/member/conf/info.xml @@ -0,0 +1,17 @@ + + + 회원 + 会员 + 会員 + Member + + 제로 + zero + Zero + zero + 회원 관리 및 회원 관련 설정등을 하는 모듈입니다. + 对会员进行管理及相关设置的模块。 + 会員管理及び会員関連設定などを行うためのモジュールです。 + This module is for managing or configuring members. + + diff --git a/modules/member/conf/module.xml b/modules/member/conf/module.xml new file mode 100644 index 000000000..fa0e0df43 --- /dev/null +++ b/modules/member/conf/module.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/member/lang/en.lang.php b/modules/member/lang/en.lang.php new file mode 100644 index 000000000..92bb759b6 --- /dev/null +++ b/modules/member/lang/en.lang.php @@ -0,0 +1,173 @@ +member = 'Member'; + $lang->member_default_info = 'Basic Info'; + $lang->member_extend_info = 'Additional Info'; + $lang->default_group_1 = "Associate Member"; + $lang->default_group_2 = "Regular Member"; + $lang->admin_group = "Managing Group"; + $lang->remember_user_id = 'Save ID'; + $lang->already_logged = "You're already logged on"; + $lang->denied_user_id = 'Sorry. This ID is prohibited.'; + $lang->null_user_id = 'Please input user ID'; + $lang->null_password = 'Please input password'; + $lang->invalid_authorization = 'It is not certificated'; + $lang->invalid_user_id= "This ID doesn't exist"; + $lang->invalid_password = 'This is wrong password'; + $lang->allow_mailing = 'Join Mailing'; + $lang->allow_message = 'Allow Message Reception'; + $lang->allow_message_type = array( + 'Y' => 'Receive All', + 'N' => 'Reject All', + 'F' => 'Only Friends', + ); + $lang->denied = 'Prohibited'; + $lang->is_admin = 'Superadmin Permission'; + $lang->group = 'Assigned Group'; + $lang->group_title = 'Group Name'; + $lang->group_srl = 'Group Number'; + $lang->signature = 'Signature'; + $lang->image_name = 'Image Name'; + $lang->image_name_max_width = 'Max Width'; + $lang->image_name_max_height = 'Max Height'; + $lang->image_mark = 'Image Mark'; + $lang->image_mark_max_width = 'Max Width'; + $lang->image_mark_max_height = 'Max Height'; + $lang->enable_openid = 'Enable OpenID'; + $lang->enable_join = 'Allow Member Join'; + $lang->limit_day = 'Temporary Limit Date'; + $lang->limit_date = 'Limit Date'; + $lang->redirect_url = 'URL after Join'; + $lang->agreement = 'Member Join Agreement'; + $lang->accept_agreement = 'Agree'; + $lang->sender = 'Sender'; + $lang->receiver = 'Receiver'; + $lang->friend_group = 'Friend Group'; + $lang->default_friend_group = 'Unassigned Group'; + $lang->member_info = 'Member Info'; + $lang->current_password = 'Current Password'; + $lang->openid = 'OpenID'; + + $lang->search_target_list = array( + 'user_id' => 'ID', + 'user_name' => 'Name', + 'nick_name' => 'Nickname', + 'email_address' => 'Email Address', + 'regdate' => 'Join Date', + 'last_login' => 'Latest Login Date', + ); + + $lang->message_box = array( + 'R' => 'Received', + 'S' => 'Sent', + 'T' => 'Mailbox', + ); + + $lang->readed_date = "Read Date"; + + $lang->cmd_login = 'Login'; + $lang->cmd_logout = 'Logout'; + $lang->cmd_signup = 'Join'; + $lang->cmd_modify_member_info = 'Modify Member Info'; + $lang->cmd_modify_member_password = 'Change Password'; + $lang->cmd_view_member_info = 'View Member Info'; + $lang->cmd_leave = 'Leave'; + + $lang->cmd_member_list = 'Member List'; + $lang->cmd_module_config = 'Default Setting'; + $lang->cmd_member_group = 'Manage Group'; + $lang->cmd_send_mail = 'Send Mail'; + $lang->cmd_manage_id = 'Manage Prohibited ID'; + $lang->cmd_manage_form = 'Manage Join Form'; + $lang->cmd_view_own_document = 'View Written Articles'; + $lang->cmd_view_scrapped_document = 'View Scraps'; + $lang->cmd_send_email = 'Send Mail'; + $lang->cmd_send_message = 'Send Message'; + $lang->cmd_reply_message = 'Reply Message'; + $lang->cmd_view_friend = 'View Friends'; + $lang->cmd_add_friend = 'Register as Friend'; + $lang->cmd_view_message_box = 'View Message Box'; + $lang->cmd_store = "Save"; + $lang->cmd_add_friend_group = 'Add Friend Group'; + $lang->cmd_rename_friend_group = 'Change Name of Friend Group'; + + $lang->msg_alreay_scrapped = 'This article is already scrapped'; + + $lang->msg_cart_is_null = 'Please select the target'; + $lang->msg_checked_file_is_deleted = '%d attached files are deleted'; + + $lang->msg_no_message = 'There are no messages'; + $lang->message_received = 'You got a new message'; + + $lang->msg_new_member = 'Add Member'; + $lang->msg_update_member = 'Modify Member Info'; + $lang->msg_leave_member = 'Leave'; + $lang->msg_group_is_null = 'There is no registered group'; + $lang->msg_not_delete_default = 'Default items cannot be deleted'; + $lang->msg_not_exists_member = "This member doesn't exist"; + $lang->msg_cannot_delete_admin = 'Admin ID cannot be deleted. Please remove the ID from administration and try again.'; + $lang->msg_exists_user_id = 'This ID already exists. Please try with another ID'; + $lang->msg_exists_email_address = 'This email address already exists. Please try with another email address.'; + $lang->msg_exists_nick_name = 'This nickname already exists. Please try with another nickname.'; + $lang->msg_signup_disabled = 'You are not able to join'; + $lang->msg_already_logged = 'You have already joined'; + $lang->msg_not_logged = 'Please login first'; + $lang->msg_title_is_null = 'Please input title of message'; + $lang->msg_content_is_null = 'Please input content'; + $lang->msg_allow_message_to_friend = "Failed to send because receiver only allows friends' messages"; + $lang->msg_disallow_message = 'Failed to send because receiver rejects message reception'; + $lang->msg_insert_group_name = 'Please input name of group'; + + $lang->msg_not_uploaded_image_name = 'Image name could not be registered'; + $lang->msg_not_uploaded_image_mark = 'Image mark could not be registered'; + + $lang->msg_accept_agreement = 'You have to agree to agreement first'; + + $lang->msg_user_denied = 'Inputted ID is now prohibited'; + $lang->msg_user_limited = 'Inputted ID can be used after %s'; + + $lang->about_user_id = 'User ID should be 3~20 letters long and consist of alphabet+number with alphabet as first letter.'; + $lang->about_password = 'Password should be 6~20 letters long'; + $lang->about_user_name = 'Name should be 2~20 letters long'; + $lang->about_nick_name = 'Nickname should be 2~20 letters long'; + $lang->about_email_address = 'Email address is used to modify/find password after email certification'; + $lang->about_homepage = 'Please input if you have your websites'; + $lang->about_blog_url = 'Please input if you have your blogs'; + $lang->about_birthday = 'Please input your birth date'; + $lang->about_allow_mailing = "If you don't join mailing, you will not able to receive group mail"; + $lang->about_allow_message = 'You can decide message reception'; + $lang->about_denied = 'Check to prohibit the ID'; + $lang->about_is_admin = 'Check to give Superadmin permission'; + $lang->about_description = "Administrator's memo about members"; + $lang->about_group = 'An ID can belong to many groups'; + + $lang->about_column_type = 'Please set the format of additional join form'; + $lang->about_column_name = 'Please input English name that can be used in template (name as variable)'; + $lang->about_column_title = 'This will be displayed when member joining or modifing/viewing member info'; + $lang->about_default_value = 'You can set default values'; + $lang->about_active = 'You have to check on active items to show on join form'; + $lang->about_form_description = 'If you input in description form, it will be displayed on join form'; + $lang->about_required = 'If you check, it will be essential item for join'; + + $lang->about_enable_openid = 'Allow users to join as OpenID'; + $lang->about_enable_join = 'Allow users to join'; + $lang->about_limit_day = 'You can limit certification date after join'; + $lang->about_limit_date = 'User cannot login until assigned date'; + $lang->about_redirect_url = 'Please input URL where users will go after join. When this is empty, it will be set as the previous page of join page.'; + $lang->about_agreement = "Join agreement will only be displayed when it's not empty"; + + $lang->about_image_name = "Allow users to use image name instead of text name"; + $lang->about_image_mark = "Allow users to use mark in front of their names"; + $lang->about_accept_agreement = "I've read the agreement all and agree"; + + $lang->about_member_default = 'It will be set as default group on join'; + + $lang->about_openid = 'When you join as OpenID, basic info like ID or email address will be saved on this site, but password and certification management will be done on current OpenID offering service'; + + $lang->about_member = "This is a module for creating/modifing/deleting members and managing group or join form.\nYou can manage members by creating new groups, and get additional information by managing join form"; +?> diff --git a/modules/member/lang/jp.lang.php b/modules/member/lang/jp.lang.php new file mode 100644 index 000000000..e251de9fe --- /dev/null +++ b/modules/member/lang/jp.lang.php @@ -0,0 +1,173 @@ +member = '会員'; + $lang->member_default_info = '基本情報'; + $lang->member_extend_info = '追加情報'; + $lang->default_group_1 = "準会員"; + $lang->default_group_2 = "正会員"; + $lang->admin_group = "管理グループ"; + $lang->remember_user_id = 'ID保存'; + $lang->already_logged = '既にログインされています。'; + $lang->denied_user_id = '使用が禁じられているIDです。'; + $lang->null_user_id = 'ユーザIDをもう一度入力してください。'; + $lang->null_password = 'パスワードを入力してください。'; + $lang->invalid_authorization = '認証できませんでした。'; + $lang->invalid_user_id= '存在しないユーザIDです。'; + $lang->invalid_password = '無効なパスワードです。'; + $lang->allow_mailing = 'メーリングリスト'; + $lang->allow_message = 'メッセージの受信'; + $lang->allow_message_type = array( + 'Y' => '全て受信', + 'N' => '全て受信しない', + 'F' => '友達からのみ受信する', + ); + $lang->denied = '使用中止'; + $lang->is_admin = '最高管理権限'; + $lang->group = '所属グループ'; + $lang->group_title = 'グループタイトル'; + $lang->group_srl = 'グループ番号'; + $lang->signature = '著名'; + $lang->image_name = 'イメージ名'; + $lang->image_name_max_width = '横幅制限サイズ'; + $lang->image_name_max_height = '立幅制限サイズ'; + $lang->image_mark = 'イメージマーク'; + $lang->image_mark_max_width = '横幅制限サイズ'; + $lang->image_mark_max_height = '立幅制限サイズ'; + $lang->enable_openid = 'OpenIDを使用する'; + $lang->enable_join = '会員加入を許可する'; + $lang->limit_day = '臨時制限日'; + $lang->limit_date = '制限日'; + $lang->redirect_url = '加入後移動ページ'; + $lang->agreement = '会員加入規約'; + $lang->accept_agreement = '規約に同意する'; + $lang->sender = '送信者'; + $lang->receiver = '受信者'; + $lang->friend_group = '友達グループ'; + $lang->default_friend_group = 'グループ未指定'; + $lang->member_info = '会員情報'; + $lang->current_password = '現在のパスワード'; + $lang->openid = 'OpenID'; + + $lang->search_target_list = array( + 'user_id' => 'ユーザID', + 'user_name' => '名前', + 'nick_name' => 'ニックネーム', + 'email_address' => 'メールアドレス', + 'regdate' => '加入日', + 'last_login' => '最近のログイン', + ); + + $lang->message_box = array( + 'R' => 'メッセージ受信ボックス', + 'S' => 'メッセージ送信ボックス', + 'T' => '保存ボックス', + ); + + $lang->readed_date = "開封時間"; + + $lang->cmd_login = 'ログイン'; + $lang->cmd_logout = 'ログアウト'; + $lang->cmd_signup = '会員加入'; + $lang->cmd_modify_member_info = '会員情報修正'; + $lang->cmd_modify_member_password = 'パスワード変更'; + $lang->cmd_view_member_info = '会員情報表示'; + $lang->cmd_leave = '脱会'; + + $lang->cmd_member_list = '会員リスト'; + $lang->cmd_module_config = '基本設定'; + $lang->cmd_member_group = 'グループ管理'; + $lang->cmd_send_mail = 'メール送信'; + $lang->cmd_manage_id = '禁止ID管理'; + $lang->cmd_manage_form = '加入フォーム管理'; + $lang->cmd_view_own_document = 'プレビュー'; + $lang->cmd_view_scrapped_document = 'スクラップ表示'; + $lang->cmd_send_email = 'メール送信'; + $lang->cmd_send_message = 'メッセージ送信'; + $lang->cmd_reply_message = 'メッセージへの返信'; + $lang->cmd_view_friend = '友達表示'; + $lang->cmd_add_friend = '友達登録'; + $lang->cmd_view_message_box = 'メッセージ表示'; + $lang->cmd_store = "保存"; + $lang->cmd_add_friend_group = '友達グループ追加'; + $lang->cmd_rename_friend_group = '友達グループ名変更'; + + $lang->msg_alreay_scrapped = '既にスクラップされたコンテンツです。'; + + $lang->msg_cart_is_null = '対象を選択してください。'; + $lang->msg_checked_file_is_deleted = '%d個の添付ファイルが削除されました。'; + + $lang->msg_no_message = 'メッセージがありません。'; + $lang->message_received = 'メッセージが届きました。'; + + $lang->msg_new_member = '会員追加'; + $lang->msg_update_member = '会員情報修正'; + $lang->msg_leave_member = '会員脱会'; + $lang->msg_group_is_null = '登録されたグループがありません。'; + $lang->msg_not_delete_default = '基本項目は削除できません。'; + $lang->msg_not_exists_member = '存在しないユーザIDです。'; + $lang->msg_cannot_delete_admin = '管理者IDは削除できません。管理者権限を解除した上で削除してみてください。'; + $lang->msg_exists_user_id = '既に存在するユーザIDです。他のIDを入力してください。'; + $lang->msg_exists_email_address = '既に存在するメールアドレスです。他のメールアドレスを入力してください。'; + $lang->msg_exists_nick_name = '既に存在するニックネームです。他のニックネームを入力してください。'; + $lang->msg_signup_disabled = '会員に加入することができません。'; + $lang->msg_already_logged = '既に会員に加入されています。'; + $lang->msg_not_logged = 'ログインしていません。'; + $lang->msg_title_is_null = 'メッセージのタイトルを入力してください。'; + $lang->msg_content_is_null = '内容を入力してください。'; + $lang->msg_allow_message_to_friend = '友達からのみメッセージを受信できるように設定したユーザであるため、送信できませんでした。'; + $lang->msg_disallow_message = 'メッセージの受信を拒否している受信者であるため、送信できませんでした。'; + $lang->msg_insert_group_name = 'グループ名を入力してください。'; + + $lang->msg_not_uploaded_image_name = 'イメージ名を登録することができません。'; + $lang->msg_not_uploaded_image_mark = 'イメージマークを登録することができません。'; + + $lang->msg_accept_agreement = '規約に同意しなければなりません。'; + + $lang->msg_user_denied = '入力されたユーザIDは使用が中止されました。'; + $lang->msg_user_limited = '入力されたユーザIDは%s以降から使用できます。'; + + $lang->about_user_id = 'ユーザIDは3~20の英数文字で構成され、最先頭の文字は英字でなければなりません。'; + $lang->about_password = 'パスワードは6~20文字です。'; + $lang->about_user_name = '名前は2~20文字です。'; + $lang->about_nick_name = 'ニックネームは2~20文字です。'; + $lang->about_email_address = 'メールアドレスはメール認証後、パスワード変更または検索などに使用されます。'; + $lang->about_homepage = 'ホームページがある場合は入力してください。'; + $lang->about_blog_url = '運用しているブログがあれば入力してください。'; + $lang->about_birthday = '生年月日を入力してください。'; + $lang->about_allow_mailing = 'メーリングリストにチェックされていない場合は、全体メールの送信時にメールを受け取りません。'; + $lang->about_allow_message = 'メッセージを受信するかを設定します。'; + $lang->about_denied = 'チェックするとユーザIDを使用できないようにします。'; + $lang->about_is_admin = 'チェックすると最高管理者権限が取得できます。'; + $lang->about_description = '会員に対する管理者のメモ帳です。'; + $lang->about_group = '一つのユーザIDは多数のグループに属することができます。'; + + $lang->about_column_type = '追加する加入フォームのタイプを指定してください。'; + $lang->about_column_name = 'テンプレートで使用できる英文字の名前を入力してください(変数名)。'; + $lang->about_column_title = '加入または情報修正・照合時に表示されるタイトルです。'; + $lang->about_default_value = 'デフォルトで入力される値を指定することができます。'; + $lang->about_active = '活性化(有効化)にチェックを入れないと正常に表示されません。'; + $lang->about_form_description = '説明欄に入力すると加入時に表示されます。'; + $lang->about_required = 'チェックを入れると会員加入時に必須入力項目として設定されます。'; + + $lang->about_enable_openid = 'OpenIDをサポートする際にチェックを入れます。'; + $lang->about_enable_join = 'チェックを入れないとユーザが会員に加入できません。'; + $lang->about_limit_day = '会員加入後一定の期間中、認証制限を行うことができます。'; + $lang->about_limit_date = '指定された期間まで該当ユーザはログインできなくします。'; + $lang->about_redirect_url = '会員加入後、移動するURLを入力してください。空の場合は会員加入する前のページに戻ります。'; + $lang->about_agreement = '会員加入規約がない場合は表示されません。'; + + $lang->about_image_name = 'ユーザの名前を文字の代わりにイメージで表示させることができます。'; + $lang->about_image_mark = '使用者の名前の前にマークを付けることができます。'; + $lang->about_accept_agreement = '加入規約をすべて読んだ上で同意します。'; + + $lang->about_member_default = '会員加入時に基本グループとして設定されます。'; + + $lang->about_openid = 'OpenIDで加入する際、IDとメールなどの基本情報は、このサイトに保存されますが、パスワードと認証のための処理用の情報は該当するOpenID提供サービス側で行われます。'; + + $lang->about_member = "会員の作成・修正・削除することができ、グループの管理、加入フォームの管理などが行える会員管理モジュールです。デフォルトで作成されたグループにグループを追加作成して会員管理ができるようにし、加入フォーム管理では基本情報の他、フォームの入力情報を追加することができます。"; +?> diff --git a/modules/member/lang/ko.lang.php b/modules/member/lang/ko.lang.php new file mode 100644 index 000000000..9e88e50dc --- /dev/null +++ b/modules/member/lang/ko.lang.php @@ -0,0 +1,173 @@ +member = '회원'; + $lang->member_default_info = '기본 정보'; + $lang->member_extend_info = '추가 정보'; + $lang->default_group_1 = "준회원"; + $lang->default_group_2 = "정회원"; + $lang->admin_group = "관리그룹"; + $lang->remember_user_id = '아이디 저장'; + $lang->already_logged = '이미 로그인되어 있습니다'; + $lang->denied_user_id = '사용금지된 아이디입니다'; + $lang->null_user_id = '사용자 아이디를 입력해주세요'; + $lang->null_password = '비밀번호를 입력해주세요'; + $lang->invalid_authorization = '인증이 되지 않았습니다'; + $lang->invalid_user_id= '존재하지 않는 사용자 아이디입니다'; + $lang->invalid_password = '잘못된 비밀번호입니다'; + $lang->allow_mailing = '메일링 가입'; + $lang->allow_message = '쪽지 수신 허용'; + $lang->allow_message_type = array( + 'Y' => '전체 수신', + 'N' => '거부', + 'F' => '친구만 허용', + ); + $lang->denied = '사용중지'; + $lang->is_admin = '최고관리 권한'; + $lang->group = '소속 그룹'; + $lang->group_title = '그룹제목'; + $lang->group_srl = '그룹번호'; + $lang->signature = '서명'; + $lang->image_name = '이미지 이름'; + $lang->image_name_max_width = '가로 제한 크기'; + $lang->image_name_max_height = '세로 제한 크기'; + $lang->image_mark = '이미지 마크'; + $lang->image_mark_max_width = '가로 제한 크기'; + $lang->image_mark_max_height = '세로 제한 크기'; + $lang->enable_openid = 'OpenID 지원'; + $lang->enable_join = '회원 가입 허가'; + $lang->limit_day = '임시 제한 일자'; + $lang->limit_date = '제한일'; + $lang->redirect_url = '회원 가입후 이동할 페이지'; + $lang->agreement = '회원 가입 약관'; + $lang->accept_agreement = '약관동의'; + $lang->sender = '보낸이'; + $lang->receiver = '받는이'; + $lang->friend_group = '친구 그룹'; + $lang->default_friend_group = '그룹 미지정'; + $lang->member_info = '회원 정보'; + $lang->current_password = '현재 비밀번호'; + $lang->openid = 'OpenID'; + + $lang->search_target_list = array( + 'user_id' => '아이디', + 'user_name' => '이름', + 'nick_name' => '닉네임', + 'email_address' => '메일주소', + 'regdate' => '가입일시', + 'last_login' => '최근로그인일시', + ); + + $lang->message_box = array( + 'R' => '받은 쪽지함', + 'S' => '보낸 쪽지함', + 'T' => '보관함', + ); + + $lang->readed_date = "읽은 시간"; + + $lang->cmd_login = '로그인'; + $lang->cmd_logout = '로그아웃'; + $lang->cmd_signup = '회원 가입'; + $lang->cmd_modify_member_info = '회원 정보 수정'; + $lang->cmd_modify_member_password = '비밀번호 변경'; + $lang->cmd_view_member_info = '회원 정보 보기'; + $lang->cmd_leave = '탈퇴'; + + $lang->cmd_member_list = '회원 목록'; + $lang->cmd_module_config = '기본 설정'; + $lang->cmd_member_group = '그룹 관리'; + $lang->cmd_send_mail = '메일발송'; + $lang->cmd_manage_id = '금지아이디관리'; + $lang->cmd_manage_form = '가입폼관리'; + $lang->cmd_view_own_document = '작성글 보기'; + $lang->cmd_view_scrapped_document = '스크랩 보기'; + $lang->cmd_send_email = '메일 보내기'; + $lang->cmd_send_message = '쪽지 보내기'; + $lang->cmd_reply_message = '쪽지 답장'; + $lang->cmd_view_friend = '친구 보기'; + $lang->cmd_add_friend = '친구 등록'; + $lang->cmd_view_message_box = '쪽지함 보기'; + $lang->cmd_store = "보관"; + $lang->cmd_add_friend_group = '친구 그룹 추가'; + $lang->cmd_rename_friend_group = '친구 그룹 이름 변경'; + + $lang->msg_alreay_scrapped = '이미 스크랩된 게시물입니다'; + + $lang->msg_cart_is_null = '대상을 선택해주세요'; + $lang->msg_checked_file_is_deleted = '%d개의 첨부파일이 삭제되었습니다'; + + $lang->msg_no_message = '쪽지가 없습니다'; + $lang->message_received = '쪽지가 왔습니다'; + + $lang->msg_new_member = '회원 추가'; + $lang->msg_update_member = '회원 정보 수정'; + $lang->msg_leave_member = '회원 탈퇴'; + $lang->msg_group_is_null = '등록된 그룹이 없습니다'; + $lang->msg_not_delete_default = '기본 항목을 삭제할 수 없습니다'; + $lang->msg_not_exists_member = '존재하지 않는 사용자입니다'; + $lang->msg_cannot_delete_admin = '관리자 아이디는 삭제할 수 없습니다. 관리자 해제후 다시 삭제시도해주세요'; + $lang->msg_exists_user_id = '이미 존재하는 아이디입니다. 다른 아이디를 입력해주세요'; + $lang->msg_exists_email_address = '이미 존재하는 메일주소입니다. 다른 메일주소를 입력해주세요'; + $lang->msg_exists_nick_name = '이미 존재하는 닉네임입니다. 다른 닉네임을 입력해주세요'; + $lang->msg_signup_disabled = '회원 가입을 하실 수 없습니다'; + $lang->msg_already_logged = '이미 회원 가입을 하신 상태입니다'; + $lang->msg_not_logged = '로그인을 하지 않으셨습니다'; + $lang->msg_title_is_null = '쪽지 제목을 입력해주세요'; + $lang->msg_content_is_null = '내용을 입력해주세요'; + $lang->msg_allow_message_to_friend = '친구에게만 쪽지 수신을 허용한 사용자라서 쪽지 발송을 하지 못했습니다'; + $lang->msg_disallow_message = '쪽지 수신을 거부한 사용자라서 쪽지 발송을 하지 못했습니다'; + $lang->msg_insert_group_name = '그룹명을 입력해 주세요'; + + $lang->msg_not_uploaded_image_name = '이미지 이름을 등록할 수가 없습니다'; + $lang->msg_not_uploaded_image_mark = '이미지 마크를 등록할 수가 없습니다'; + + $lang->msg_accept_agreement = '약관에 동의하셔야 합니다'; + + $lang->msg_user_denied = '입력하신 아이디의 사용이 중지되셨습니다'; + $lang->msg_user_limited = '입력하신 아이디는 %s 이후부터 사용하실 수 있습니다'; + + $lang->about_user_id = '사용자 ID는 3~20자 사이의 영문+숫자로 이루어져야 하며 영문으로 시작되어야 합니다'; + $lang->about_password = '비밀번호는 6~20자로 되어야 합니다'; + $lang->about_user_name = '이름은 2~20자 이내여야 합니다'; + $lang->about_nick_name = '닉네임은 2~20자 이내여야 합니다'; + $lang->about_email_address = '메일주소는 메일인증 후 비밀번호 변경이나 찾기등에 사용됩니다.'; + $lang->about_homepage = '홈페이지가 있을 경우 입력해주세요'; + $lang->about_blog_url = '운영하는 블로그가 있을 경우 입력해주세요'; + $lang->about_birthday = '생년월일을 입력해주세요'; + $lang->about_allow_mailing = '메일링 가입이 체크되지 않으면 단체메일 발송시 메일을 받지 않습니다'; + $lang->about_allow_message = '쪽시 수신 여부를 결정할 수 있습니다'; + $lang->about_denied = '체크시 아이디를 사용할 수 없도록 합니다'; + $lang->about_is_admin = '체크시 최고 관리자 권한을 가지게 됩니다'; + $lang->about_description = '회원에 대한 관리자 메모입니다'; + $lang->about_group = '한 아이디는 여러개의 group에 속할 수 있습니다'; + + $lang->about_column_type = '추가하실 가입폼의 형식을 지정해주세요'; + $lang->about_column_name = '템플릿에서 사용할수 있는 영문으로 된 이름을 적어주세요 (변수명)'; + $lang->about_column_title = '가입 또는 정보 수정/조회시에 표시될 제목입니다'; + $lang->about_default_value = '기본으로 입력될 값을 정하실 수 있습니다'; + $lang->about_active = '활성 항목에 체크를 하셔야 가입시 정상적으로 노출됩니다'; + $lang->about_form_description = '설명란에 입력을 하시면 가입시 표시가 됩니다'; + $lang->about_required = '체크하시면 회원가입시 필수항목으로 입력하도록 됩니다'; + + $lang->about_enable_openid = 'OpenID 지원을 할 경우 체크하시면 됩니다'; + $lang->about_enable_join = '체크를 하셔야 사용자들이 회원가입을 할 수 있습니다'; + $lang->about_limit_day = '회원 가입후 정해진 일자동안 인증 제한을 할 수 있습니다'; + $lang->about_limit_date = '지정된 일자까지 해당 사용자는 로그인을 할 수 없습니다'; + $lang->about_redirect_url = '회원 가입후 이동할 url을 입력해 주세요. 비어 있으면 가입 이전 페이지로 돌아갑니다'; + $lang->about_agreement = '회원가입약관이 없을 경우 표시되지 않습니다'; + + $lang->about_image_name = '사용자의 이름을 글자 대신 이미지로 사용할 수 있게 합니다'; + $lang->about_image_mark = '사용자의 이름앞에 마크를 달 수 있습니다'; + $lang->about_accept_agreement = '약관을 모두 읽었으며 동의합니다'; + + $lang->about_member_default = '회원가입시 기본 그룹으로 설정됩니다'; + + $lang->about_openid = '오픈아이디로 가입시 아이디와 메일등의 기본 정보는 이 사이트에 저장이 되지만 비밀번호와 인증을 위한 처리는 해당 오픈아이디 제공서비스에서 이루어집니다.'; + + $lang->about_member = "회원을 생성/수정/삭제 할 수 있고 그룹관리나 가입폼 관리등을 할 수 있는 회원 관리 모듈입니다.\n기본으로 생성된 그룹외의 그룹을 생성하여 회원 관리가 가능하고 가입폼관리를 통한 기본 정보외의 추가 정보를 요구받을 수도 있습니다."; +?> diff --git a/modules/member/lang/zh-CN.lang.php b/modules/member/lang/zh-CN.lang.php new file mode 100644 index 000000000..9556a4e1f --- /dev/null +++ b/modules/member/lang/zh-CN.lang.php @@ -0,0 +1,173 @@ +member = '会员'; + $lang->member_default_info = '基本信息'; + $lang->member_extend_info = '扩展信息'; + $lang->default_group_1 = "准会员"; + $lang->default_group_2 = "正会员"; + $lang->admin_group = "管理组"; + $lang->remember_user_id = '保存ID'; + $lang->already_logged = '您已经登录!'; + $lang->denied_user_id = '被禁止的用户名。'; + $lang->null_user_id = '请输入用户名。'; + $lang->null_password = '请输入密码。'; + $lang->invalid_authorization = '还没有认证!'; + $lang->invalid_user_id= '该用户名不存在,请检查您的输入是否有误!'; + $lang->invalid_password = '您的密码不正确!'; + $lang->allow_mailing = '接收邮件'; + $lang->allow_message = '允许接收短消息'; + $lang->allow_message_type = array( + 'Y' => '全部接收', + 'N' => '拒收', + 'F' => '只允许好友', + ); + $lang->denied = '禁止使用'; + $lang->is_admin = '最高管理权限'; + $lang->group = '用户组'; + $lang->group_title = '用户组标题'; + $lang->group_srl = '用户组编号'; + $lang->signature = '签名'; + $lang->image_name = '昵称图片'; + $lang->image_name_max_width = '宽度限制'; + $lang->image_name_max_height = '高度限制'; + $lang->image_mark = '用户图标'; + $lang->image_mark_max_width = '宽度限制'; + $lang->image_mark_max_height = '高度限制'; + $lang->enable_openid = '支持OpenID'; + $lang->enable_join = '允许会员注册'; + $lang->limit_day = '认证限制'; + $lang->limit_date = '限制日期'; + $lang->redirect_url = '注册会员后页面转向'; + $lang->agreement = '会员注册条款'; + $lang->accept_agreement = '同意条款'; + $lang->sender = '寄件人'; + $lang->receiver = '收件人'; + $lang->friend_group = '好友组'; + $lang->default_friend_group = '组未指定'; + $lang->member_info = '会员信息'; + $lang->current_password = '当前密码'; + $lang->openid = 'OpenID'; + + $lang->search_target_list = array( + 'user_id' => '用户名', + 'user_name' => '姓名', + 'nick_name' => '昵称', + 'email_address' => '邮箱地址', + 'regdate' => '注册日期', + 'last_login' => '最近登录', + ); + + $lang->message_box = array( + 'R' => '收件箱', + 'S' => '发件箱', + 'T' => '保管箱', + ); + + $lang->readed_date = "阅读日期"; + + $lang->cmd_login = '登录'; + $lang->cmd_logout = '退出'; + $lang->cmd_signup = '新会员注册'; + $lang->cmd_modify_member_info = '修改会员信息'; + $lang->cmd_modify_member_password = '修改密码'; + $lang->cmd_view_member_info = '查看会员信息'; + $lang->cmd_leave = '注销'; + + $lang->cmd_member_list = '会员目录'; + $lang->cmd_module_config = '基本设置'; + $lang->cmd_member_group = '用户组管理'; + $lang->cmd_send_mail = '发送邮件'; + $lang->cmd_manage_id = '禁止用户名管理'; + $lang->cmd_manage_form = '注册表单管理'; + $lang->cmd_view_own_document = '查看我的帖子'; + $lang->cmd_view_scrapped_document = '查看收藏'; + $lang->cmd_send_email = '发送邮件'; + $lang->cmd_send_message = '发送短消息'; + $lang->cmd_reply_message = '回复短消息'; + $lang->cmd_view_friend = '查看好友'; + $lang->cmd_add_friend = '加为好友'; + $lang->cmd_view_message_box = '查看短信箱'; + $lang->cmd_store = "保管"; + $lang->cmd_add_friend_group = '添加好友组'; + $lang->cmd_rename_friend_group = '修改好友组名称'; + + $lang->msg_alreay_scrapped = '已收藏的主题!'; + + $lang->msg_cart_is_null = '请选择对象。'; + $lang->msg_checked_file_is_deleted = '已删除%d个附件。'; + + $lang->msg_no_message = '没有短消息。'; + $lang->message_received = '您有新消息。'; + + $lang->msg_new_member = '添加会员'; + $lang->msg_update_member = '修改会员信息'; + $lang->msg_leave_member = '注销会员'; + $lang->msg_group_is_null = '没有用户组。'; + $lang->msg_not_delete_default = '不能删除基本项目'; + $lang->msg_not_exists_member = '不存在的用户'; + $lang->msg_cannot_delete_admin = '不能删除管理员 ID .解除管理后再删除'; + $lang->msg_exists_user_id = '重复的用户名 ,请重新输入用户名。'; + $lang->msg_exists_email_address = '重复的电子邮件地址,请重新输入电子邮件地址。'; + $lang->msg_exists_nick_name = '重复的昵称,请重新输入昵称。'; + $lang->msg_signup_disabled = '不能注册会员'; + $lang->msg_already_logged = '您是注册会员。'; + $lang->msg_not_logged = '您还没有登录。'; + $lang->msg_title_is_null = '请输入短消息标题。'; + $lang->msg_content_is_null = '请输入内容。'; + $lang->msg_allow_message_to_friend = '因其为只允许接收好友短消息的用户,所以不能发送短消息。'; + $lang->msg_disallow_message = '因其为拒绝接收短消息的用户,所以不能发送短消息。'; + $lang->msg_insert_group_name = '请输入组名称'; + + $lang->msg_not_uploaded_image_name = '不能登录昵称图像!'; + $lang->msg_not_uploaded_image_mark = '不能登录用户图标!'; + + $lang->msg_accept_agreement = '您必须同意条款。'; + + $lang->msg_user_denied = '您输入的用户名已禁止使用!'; + $lang->msg_user_limited = '您输入的用户名%s以后才可以开始使用。'; + + $lang->about_user_id = '用户名长度必须由 3 ~20 字以内的英文+数字组成,且首个字母必须是英文字母。'; + $lang->about_password = '密码长度必须在6~20字以内。'; + $lang->about_user_name = '姓名必须是2~20字以内。'; + $lang->about_nick_name = '昵称必须是2~20字以内。'; + $lang->about_email_address = '电子邮件地址除邮件认证外,在修改密码或找回密码时使用。'; + $lang->about_homepage = '请输入您的主页地址。'; + $lang->about_blog_url = '请输入博客地址。'; + $lang->about_birthday = '请输入您的出生年月日。'; + $lang->about_allow_mailing = '如不选择此项,以后不能接收站内发送的重要信息。'; + $lang->about_allow_message = '可以选择短消息接收与否。'; + $lang->about_denied = '选择时不能使用此用户名。'; + $lang->about_is_admin = '选择时将具有最高管理权限。'; + $lang->about_description = '管理员对会员的笔记。'; + $lang->about_group = '一个用户名可属多个用户组。'; + + $lang->about_column_type = '请选择要添加的注册表单格式。'; + $lang->about_column_name = '请输入在模板中可以使用的英文名称。(变数名)'; + $lang->about_column_title = '注册或修改/查看信息时要显示的标题。'; + $lang->about_default_value = '可以设置缺省值。'; + $lang->about_active = '必须选择此项后才可以正常启用。'; + $lang->about_form_description = '说明栏里输入的内容,注册时将会显示。'; + $lang->about_required = '注册时成为必填项目。'; + + $lang->about_enable_openid = '支持 OpenID 时请选择此项。'; + $lang->about_enable_join = '选择此项后用户才可以注册。'; + $lang->about_limit_day = '注册会员后的认证有效期限。'; + $lang->about_limit_date = '直到指定日期该用户不能登录。'; + $lang->about_redirect_url = '请输入注册会员后的页面转向 url。(留空为返回前页)'; + $lang->about_agreement = '没有会员条款时不显示。'; + + $lang->about_image_name = '用户昵称可以用小图片来替代显示。'; + $lang->about_image_mark = '显示在用户昵称前的小图标。'; + $lang->about_accept_agreement = '已阅读全部条款并同意。'; + + $lang->about_member_default = '将成为注册会员时的默认用户组。'; + + $lang->about_openid = '用OpenID注册时该网站只保存用户名和 邮件等基本信息,密码和认证处理是在提供OpenID服务的站点中得到解决。'; + + $lang->about_member = "可以添加/修改/删除会员及管理用户组或注册表单的会员管理模块。\n此模块不仅可以生成缺省用户组以外的其他用户组来管理会员,并且通过注册表单的管理获得除会员基本信息以外的扩展信息。"; +?> \ No newline at end of file diff --git a/modules/member/member.admin.controller.php b/modules/member/member.admin.controller.php new file mode 100644 index 000000000..876a69cbc --- /dev/null +++ b/modules/member/member.admin.controller.php @@ -0,0 +1,436 @@ +module); + unset($all_args->act); + + // 모든 request argument에서 필수 정보만 제외 한 후 추가 데이터로 입력 + $extra_vars = delObjectVars($all_args, $args); + $args->extra_vars = serialize($extra_vars); + + // member_srl이 넘어오면 원 회원이 있는지 확인 + if($args->member_srl) { + // 멤버 모델 객체 생성 + $oMemberModel = &getModel('member'); + + // 회원 정보 구하기 + $member_info = $oMemberModel->getMemberInfoByMemberSrl($args->member_srl); + + // 만약 원래 회원이 없으면 새로 입력하기 위한 처리 + if($member_info->member_srl != $args->member_srl) unset($args->member_srl); + } + + $oMemberController = &getController('member'); + + // member_srl의 값에 따라 insert/update + if(!$args->member_srl) { + $output = $oMemberController->insertMember($args); + $msg_code = 'success_registed'; + } else { + $output = $oMemberController->updateMember($args); + $msg_code = 'success_updated'; + } + + if(!$output->toBool()) return $output; + + // 서명 저장 + $signature = Context::get('signature'); + $oMemberController->putSignature($args->member_srl, $signature); + + // 결과 리턴 + $this->add('member_srl', $args->member_srl); + $this->setMessage($msg_code); + } + + /** + * @brief 사용자 삭제 (관리자용) + **/ + function procMemberAdminDelete() { + // 일단 입력된 값들을 모두 받아서 db 입력항목과 그외 것으로 분리 + $member_srl = Context::get('member_srl'); + + $oMemberController = &getController('member'); + $output = $oMemberController->deleteMember($member_srl); + if(!$output->toBool()) return $output; + + $this->add('page',Context::get('page')); + $this->setMessage("success_deleted"); + } + + /** + * @brief 회원 관리용 기본 정보의 추가 + **/ + function procMemberAdminInsertConfig() { + // 기본 정보를 받음 + $args = Context::gets('skin','colorset','enable_openid','enable_join','limit_day','redirect_url','content','image_name','image_mark', 'image_name_max_width', 'image_name_max_height','image_mark_max_width','image_mark_max_height'); + if(!$args->skin) $args->skin = "default"; + if(!$args->colorset) $args->colorset = "white"; + if($args->enable_join!='Y') $args->enable_join = 'N'; + if($args->enable_openid!='Y') $args->enable_openid= 'N'; + if($args->image_name!='Y') $args->image_name = 'N'; + if($args->image_mark!='Y') $args->image_mark = 'N'; + $args->limit_day = (int)$args->limit_day; + $args->agreement = $args->content; + unset($args->content); + + // module Controller 객체 생성하여 입력 + $oModuleController = &getController('module'); + $output = $oModuleController->insertModuleConfig('member',$args); + return $output; + } + + /** + * @brief 사용자 그룹 추가 + **/ + function procMemberAdminInsertGroup() { + $args = Context::gets('title','description','is_default'); + $output = $this->insertGroup($args); + if(!$output->toBool()) return $output; + + $this->add('group_srl',''); + $this->add('page',Context::get('page')); + $this->setMessage('success_registed'); + } + + /** + * @brief 사용자 그룹 정보 수정 + **/ + function procMemberAdminUpdateGroup() { + $group_srl = Context::get('group_srl'); + $mode = Context::get('mode'); + + switch($mode) { + case 'delete' : + $output = $this->deleteGroup($group_srl); + if(!$output->toBool()) return $output; + $msg_code = 'success_deleted'; + break; + case 'update' : + $args = Context::gets('group_srl','title','description','is_default'); + $output = $this->updateGroup($args); + if(!$output->toBool()) return $output; + $msg_code = 'success_updated'; + break; + } + + $this->add('group_srl',''); + $this->add('page',Context::get('page')); + $this->setMessage($msg_code); + } + + /** + * @brief 가입 항목 추가 + **/ + function procMemberAdminInsertJoinForm() { + $args->member_join_form_srl = Context::get('member_join_form_srl'); + + $args->column_type = Context::get('column_type'); + $args->column_name = Context::get('column_name'); + $args->column_title = Context::get('column_title'); + $args->default_value = explode('|@|', Context::get('default_value')); + $args->is_active = Context::get('is_active'); + if(!in_array(strtoupper($args->is_active), array('Y','N'))) $args->is_active = 'N'; + $args->required = Context::get('required'); + if(!in_array(strtoupper($args->required), array('Y','N'))) $args->required = 'N'; + $args->description = Context::get('description'); + $args->list_order = getNextSequence(); + + // 기본값의 정리 + if(in_array($args->column_type, array('checkbox','select')) && count($args->default_value) ) { + $args->default_value = serialize($args->default_value); + } else { + $args->default_value = ''; + } + + // member_join_form_srl이 있으면 수정, 없으면 추가 + if(!$args->member_join_form_srl) $output = executeQuery('member.insertJoinForm', $args); + else $output = executeQuery('member.updateJoinForm', $args); + + if(!$output->toBool()) return $output; + + $this->add('act','dispJoinForm'); + $this->setMessage('success_registed'); + } + + /** + * @brief 가입 항목의 상/하 이동 및 내용 수정 + **/ + function procMemberAdminUpdateJoinForm() { + $member_join_form_srl = Context::get('member_join_form_srl'); + $mode = Context::get('mode'); + + switch($mode) { + case 'up' : + $output = $this->moveJoinFormUp($member_join_form_srl); + $msg_code = 'success_moved'; + break; + case 'down' : + $output = $this->moveJoinFormDown($member_join_form_srl); + $msg_code = 'success_moved'; + break; + case 'delete' : + $output = $this->deleteJoinForm($member_join_form_srl); + $msg_code = 'success_deleted'; + break; + case 'update' : + break; + } + if(!$output->toBool()) return $output; + + $this->setMessage($msg_code); + } + + /** + * @brief 금지 아이디 추가 + **/ + function procMemberAdminInsertDeniedID() { + $user_id = Context::get('user_id'); + $description = Context::get('description'); + + $output = $this->insertDeniedID($user_id, $description); + if(!$output->toBool()) return $output; + + $this->add('group_srl',''); + $this->add('page',Context::get('page')); + $this->setMessage('success_registed'); + } + + /** + * @brief 금지 아이디 업데이트 + **/ + function procMemberAdminUpdateDeniedID() { + $user_id = Context::get('user_id'); + $mode = Context::get('mode'); + + switch($mode) { + case 'delete' : + $output = $this->deleteDeniedID($user_id); + if(!$output->toBool()) return $output; + $msg_code = 'success_deleted'; + break; + } + + $this->add('page',Context::get('page')); + $this->setMessage($msg_code); + } + + /** + * @brief 관리자를 추가한다 + **/ + function insertAdmin($args) { + // 관리자임을 설정 + $args->is_admin = 'Y'; + + // 관리자 그룹을 구해와서 설정 + $oMemberModel = &getModel('member'); + $admin_group = $oMemberModel->getAdminGroup(); + $args->group_srl_list = $admin_group->group_srl; + + $oMemberController = &getController('member'); + return $oMemberController->insertMember($args); + } + + /** + * @brief 회원의 그룹값을 변경 + **/ + function changeGroup($source_group_srl, $target_group_srl) { + $args->source_group_srl = $source_group_srl; + $args->target_group_srl = $target_group_srl; + + return executeQuery('member.changeGroup', $args); + } + + /** + * @brief 그룹 등록 + **/ + function insertGroup($args) { + // is_default값을 체크, Y일 경우 일단 모든 is_default에 대해서 N 처리 + if($args->is_default!='Y') { + $args->is_default = 'N'; + } else { + $output = executeQuery('member.updateGroupDefaultClear'); + if(!$output->toBool()) return $output; + } + + return executeQuery('member.insertGroup', $args); + } + + /** + * @brief 그룹 정보 수정 + **/ + function updateGroup($args) { + // is_default값을 체크, Y일 경우 일단 모든 is_default에 대해서 N 처리 + if($args->is_default!='Y') $args->is_default = 'N'; + else { + $output = executeQuery('member.updateGroupDefaultClear'); + if(!$output->toBool()) return $output; + } + + return executeQuery('member.updateGroup', $args); + } + + /** + * 그룹 삭제 + **/ + function deleteGroup($group_srl) { + // 멤버모델 객체 생성 + $oMemberModel = &getModel('member'); + + // 삭제 대상 그룹을 가져와서 체크 (is_default == 'Y'일 경우 삭제 불가) + $group_info = $oMemberModel->getGroup($group_srl); + + if(!$group_info) return new Object(-1, 'lang->msg_not_founded'); + if($group_info->is_default == 'Y') return new Object(-1, 'msg_not_delete_default'); + + // is_default == 'Y'인 그룹을 가져옴 + $default_group = $oMemberModel->getDefaultGroup(); + $default_group_srl = $default_group->group_srl; + + // default_group_srl로 변경 + $this->changeGroup($group_srl, $default_group_srl); + + $args->group_srl = $group_srl; + return executeQuery('member.deleteGroup', $args); + } + + /** + * @brief 금지아이디 등록 + **/ + function insertDeniedID($user_id, $desription = '') { + $args->user_id = $user_id; + $args->description = $description; + $args->list_order = -1*getNextSequence(); + + return executeQuery('member.insertDeniedID', $args); + } + + /** + * @brief 금지아이디 삭제 + **/ + function deleteDeniedID($user_id) { + $args->user_id = $user_id; + return executeQuery('member.deleteDeniedID', $args); + } + + /** + * @brief 가입폼 항목을 삭제 + **/ + function deleteJoinForm($member_join_form_srl) { + $args->member_join_form_srl = $member_join_form_srl; + $output = executeQuery('member.deleteJoinForm', $args); + return $output; + } + + /** + * @brief 가입항목을 상단으로 이동 + **/ + function moveJoinFormUp($member_join_form_srl) { + $oMemberModel = &getModel('member'); + + // 선택된 가입항목의 정보를 구한다 + $args->member_join_form_srl = $member_join_form_srl; + $output = executeQuery('member.getJoinForm', $args); + + $join_form = $output->data; + $list_order = $join_form->list_order; + + // 전체 가입항목 목록을 구한다 + $join_form_list = $oMemberModel->getJoinFormList(); + $join_form_srl_list = array_keys($join_form_list); + if(count($join_form_srl_list)<2) return new Object(); + + $prev_member_join_form = NULL; + foreach($join_form_list as $key => $val) { + if($val->member_join_form_srl == $member_join_form_srl) break; + $prev_member_join_form = $val; + } + + // 이전 가입항목가 없으면 그냥 return + if(!$prev_member_join_form) return new Object(); + + // 선택한 가입항목의 정보 + $cur_args->member_join_form_srl = $member_join_form_srl; + $cur_args->list_order = $prev_member_join_form->list_order; + + // 대상 가입항목의 정보 + $prev_args->member_join_form_srl = $prev_member_join_form->member_join_form_srl; + $prev_args->list_order = $list_order; + + // DB 처리 + $output = executeQuery('member.updateMemberJoinFormListorder', $cur_args); + if(!$output->toBool()) return $output; + + executeQuery('member.updateMemberJoinFormListorder', $prev_args); + if(!$output->toBool()) return $output; + + return new Object(); + } + + /** + * @brief 가입항목을 하단으로 이동 + **/ + function moveJoinFormDown($member_join_form_srl) { + $oMemberModel = &getModel('member'); + + // 선택된 가입항목의 정보를 구한다 + $args->member_join_form_srl = $member_join_form_srl; + $output = executeQuery('member.getJoinForm', $args); + + $join_form = $output->data; + $list_order = $join_form->list_order; + + // 전체 가입항목 목록을 구한다 + $join_form_list = $oMemberModel->getJoinFormList(); + $join_form_srl_list = array_keys($join_form_list); + if(count($join_form_srl_list)<2) return new Object(); + + for($i=0;$imember_join_form_srl = $member_join_form_srl; + $cur_args->list_order = $next_member_join_form->list_order; + + // 대상 가입항목의 정보 + $next_args->member_join_form_srl = $next_member_join_form->member_join_form_srl; + $next_args->list_order = $list_order; + + // DB 처리 + $output = executeQuery('member.updateMemberJoinFormListorder', $cur_args); + if(!$output->toBool()) return $output; + + $output = executeQuery('member.updateMemberJoinFormListorder', $next_args); + if(!$output->toBool()) return $output; + + return new Object(); + } + } +?> diff --git a/modules/member/member.admin.model.php b/modules/member/member.admin.model.php new file mode 100644 index 000000000..dd4548037 --- /dev/null +++ b/modules/member/member.admin.model.php @@ -0,0 +1,102 @@ +is_admin = Context::get('is_admin')=='Y'?'Y':''; + $args->is_denied = Context::get('is_denied')=='Y'?'Y':''; + $args->selected_group_srl = Context::get('selected_group_srl'); + + $search_target = trim(Context::get('search_target')); + $search_keyword = trim(Context::get('search_keyword')); + + if($search_target && $search_keyword) { + switch($search_target) { + case 'user_id' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_user_id = $search_keyword; + break; + case 'user_name' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_user_name = $search_keyword; + break; + case 'nick_name' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_nick_name = $search_keyword; + break; + case 'email_address' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_email_address = $search_keyword; + break; + case 'regdate' : + $args->s_regdate = $search_keyword; + break; + case 'last_login' : + $args->s_last_login = $search_keyword; + break; + } + } + + // selected_group_srl이 있으면 query id를 변경 (table join때문에) + if($args->selected_group_srl) { + $query_id = 'member.getMemberListWithinGroup'; + $args->sort_index = "member.member_srl"; + } else { + $query_id = 'member.getMemberList'; + $args->sort_index = "member_srl"; + } + + // 기타 변수들 정리 + $args->page = Context::get('page'); + $args->list_count = 40; + $args->page_count = 10; + return executeQuery($query_id, $args); + } + + /** + * @brief 회원 모듈의 특정 스킨에 속한 컬러셋 목록을 return + **/ + function getMemberAdminColorset() { + $skin = Context::get('skin'); + if(!$skin) $tpl = ""; + else { + $oModuleModel = &getModel('module'); + $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin); + Context::set('skin_info', $skin_info); + + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if(!$config->colorset) $config->colorset = "white"; + Context::set('config', $config); + + $oTemplate = &TemplateHandler::getInstance(); + $tpl = $oTemplate->compile($this->module_path.'tpl', 'colorset_list'); + } + + $this->add('tpl', $tpl); + } + + } +?> diff --git a/modules/member/member.admin.view.php b/modules/member/member.admin.view.php new file mode 100644 index 000000000..b1904b17a --- /dev/null +++ b/modules/member/member.admin.view.php @@ -0,0 +1,200 @@ +member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + if(!$this->member_info) Context::set('member_srl',''); + else Context::set('member_info',$this->member_info); + } + + // group 목록 가져오기 + $this->group_list = $oMemberModel->getGroups(); + Context::set('group_list', $this->group_list); + + // template path 지정 + $this->setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 회원 목록 출력 + **/ + function dispMemberAdminList() { + + // member model 객체 생성후 목록을 구해옴 + $oMemberModel = &getAdminModel('member'); + $output = $oMemberModel->getMemberList(); + + // 템플릿에 쓰기 위해서 context::set + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('member_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + // 템플릿 파일 지정 + $this->setTemplateFile('member_list'); + } + + /** + * @brief 회원 관리에 필요한 기본 설정들 + **/ + function dispMemberAdminConfig() { + // 설정 정보를 받아옴 (module model 객체를 이용) + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if(!$config->image_name_max_width) $config->image_name_max_width = 90; + if(!$config->image_name_max_height) $config->image_name_max_height = 20; + if(!$config->image_mark_max_width) $config->image_mark_max_width = 20; + if(!$config->image_mark_max_height) $config->image_mark_max_height = 20; + if(!$config->skin) $config->skin = "default"; + Context::set('config',$config); + + // 회원 관리 모듈의 스킨 목록을 구함 + $skin_list = $oModuleModel->getSkins($this->module_path); + Context::set('skin_list', $skin_list); + + // 에디터를 받음 + $oEditorModel = &getModel('editor'); + $option->allow_fileupload = false; + $option->enable_autosave = false; + $option->enable_default_component = true; + $option->enable_component = true; + $option->resizable = true; + $option->height = 300; + $editor = $oEditorModel->getEditor(0, $option); + Context::set('editor', $editor); + + // 템플릿 파일 지정 + $this->setTemplateFile('member_config'); + } + + /** + * @brief 회원 정보 출력 + **/ + function dispMemberAdminInfo() { + // 추가 가입폼 목록을 받음 + $oMemberModel = &getModel('member'); + Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($this->member_info)); + + $this->setTemplateFile('member_info'); + } + + /** + * @brief 회원 정보 입력 화면 출력 + **/ + function dispMemberAdminInsert() { + // 추가 가입폼 목록을 받음 + $oMemberModel = &getModel('member'); + Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($this->member_info)); + + $member_info = Context::get('member_info'); + $member_info->signature = $oMemberModel->getSignature($this->member_info->member_srl); + Context::set('member_info', $member_info); + + // 에디터 모듈의 getEditor를 호출하여 서명용으로 세팅 + if($this->member_info->member_srl) { + $oEditorModel = &getModel('editor'); + $option->allow_fileupload = false; + $option->enable_autosave = false; + $option->enable_default_component = true; + $option->enable_component = true; + $option->resizable = false; + $option->height = 200; + $editor = $oEditorModel->getEditor($this->member_info->member_srl, $option); + Context::set('editor', $editor); + } + + // 템플릿 파일 지정 + $this->setTemplateFile('insert_member'); + } + + /** + * @brief 회원 삭제 화면 출력 + **/ + function dispMemberAdminDeleteForm() { + if(!Context::get('member_srl')) return $this->dispContent(); + $this->setTemplateFile('delete_form'); + } + + /** + * @brief 그룹 목록 출력 + **/ + function dispMemberAdminGroupList() { + $group_srl = Context::get('group_srl'); + + if($group_srl && $this->group_list[$group_srl]) { + Context::set('selected_group', $this->group_list[$group_srl]); + $this->setTemplateFile('group_update_form'); + } else { + $this->setTemplateFile('group_list'); + } + } + + /** + * @brief 회원 가입 폼 목록 출력 + **/ + function dispMemberAdminJoinFormList() { + // 멤버모델 객체 생성 + $oMemberModel = &getModel('member'); + + // 추가로 설정한 가입 항목 가져오기 + $form_list = $oMemberModel->getJoinFormList(); + Context::set('form_list', $form_list); + + $this->setTemplateFile('join_form_list'); + } + + /** + * @brief 회원 가입 폼 관리 화면 출력 + **/ + function dispMemberAdminInsertJoinForm() { + // 수정일 경우 대상 join_form의 값을 구함 + $member_join_form_srl = Context::get('member_join_form_srl'); + if($member_join_form_srl) { + $oMemberModel = &getModel('member'); + $join_form = $oMemberModel->getJoinForm($member_join_form_srl); + if(!$join_form) Context::set('member_join_form_srl','',true); + else Context::set('join_form', $join_form); + } + $this->setTemplateFile('insert_join_form'); + } + + /** + * @brief 금지 목록 아이디 출력 + **/ + function dispMemberAdminDeniedIDList() { + // 멤버모델 객체 생성 + $oMemberModel = &getModel('member'); + + // 사용금지 목록 가져오기 + $output = $oMemberModel->getDeniedIDList(); + + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('member_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + $this->setTemplateFile('denied_id_list'); + } + + } +?> diff --git a/modules/member/member.class.php b/modules/member/member.class.php new file mode 100644 index 000000000..067522101 --- /dev/null +++ b/modules/member/member.class.php @@ -0,0 +1,152 @@ +insertActionForward('member', 'view', 'dispMemberInfo'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberSignUpForm'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberModifyInfo'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberModifyPassword'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberLeave'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberLoginForm'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberLogout'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberOwnDocument'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberScrappedDocument'); + + $oModuleController->insertActionForward('member', 'view', 'dispMemberMessages'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberSendMessage'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberNewMessage'); + + $oModuleController->insertActionForward('member', 'view', 'dispMemberFriend'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberAddFriend'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberAddFriendGroup'); + + $oModuleController->insertActionForward('member', 'view', 'dispMemberAdminList'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberAdminConfig'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberAdminInsert'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberAdminDeleteForm'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberAdminGroupList'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberAdminJoinFormList'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberAdminInfo'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberAdminInsertJoinForm'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberAdminDeniedIDList'); + + $oModuleController->insertActionForward('member', 'controller', 'procMemberInsertImageName'); + $oModuleController->insertActionForward('member', 'controller', 'procMemberInsertImageMark'); + $oModuleController->insertActionForward('member', 'controller', 'procMemberDeleteImageName'); + $oModuleController->insertActionForward('member', 'controller', 'procMemberDeleteImageMark'); + + // 기본 정보를 세팅 + $args->enable_join = 'Y'; + $args->enable_openid = 'N'; + $args->image_name = 'Y'; + $args->image_mark = 'Y'; + $args->image_name_max_width = '90'; + $args->image_name_max_height = '20'; + $args->image_mark_max_width = '20'; + $args->image_mark_max_width = '20'; + $oModuleController->insertModuleConfig('member',$args); + + // 멤버 컨트롤러 객체 생성 + $oMemberController = &getController('member'); + $oMemberAdminController = &getAdminController('member'); + + // 관리자, 정회원, 준회원 그룹을 입력 + $group_args->title = Context::getLang('admin_group'); + $group_args->is_default = 'N'; + $group_args->is_admin = 'Y'; + $output = $oMemberAdminController->insertGroup($group_args); + + unset($group_args); + $group_args->title = Context::getLang('default_group_1'); + $group_args->is_default = 'Y'; + $group_args->is_admin = 'N'; + $output = $oMemberAdminController->insertGroup($group_args); + + unset($group_args); + $group_args->title = Context::getLang('default_group_2'); + $group_args->is_default = 'N'; + $group_args->is_admin = 'N'; + $oMemberAdminController->insertGroup($group_args); + + // 관리자 정보 세팅 + $admin_info = Context::gets('user_id','password','nick_name','user_name', 'email_address'); + if($admin_info->user_id) { + // 관리자 정보 입력 + $oMemberAdminController->insertAdmin($admin_info); + + // 로그인 처리시킴 + $output = $oMemberController->doLogin($admin_info->user_id); + } + + // 금지 아이디 등록 (기본 + 모듈명) + $oModuleModel = &getModel('module'); + $module_list = $oModuleModel->getModuleList(); + foreach($module_list as $key => $val) { + $oMemberAdminController->insertDeniedID($val->module,''); + } + $oMemberAdminController->insertDeniedID('www',''); + $oMemberAdminController->insertDeniedID('root',''); + $oMemberAdminController->insertDeniedID('administrator',''); + $oMemberAdminController->insertDeniedID('telnet',''); + $oMemberAdminController->insertDeniedID('ftp',''); + $oMemberAdminController->insertDeniedID('http',''); + + // member 에서 사용할 cache디렉토리 생성 + FileHandler::makeDir('./files/member_extra_info/image_name'); + FileHandler::makeDir('./files/member_extra_info/image_mark'); + FileHandler::makeDir('./files/member_extra_info/signature'); + FileHandler::makeDir('./files/member_extra_info/new_message_flags'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + $oModuleModel = &getModel('module'); + + // dispMemberOwnDocument act의 여부 체크 (2007. 7. 24 추가) + $act = $oModuleModel->getActionForward('dispMemberOwnDocument'); + if(!$act) return true; + + // dispMemberScrappedDocument act의 여부 체크 (2007. 7. 25 추가) + $act = $oModuleModel->getActionForward('dispMemberScrappedDocument'); + if(!$act) return true; + + // member 디렉토리 체크 (2007. 8. 11 추가) + if(!is_dir("./files/member_extra_info")) return true; + + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + // act 추가 + $oModuleController = &getController('module'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberOwnDocument'); + $oModuleController->insertActionForward('member', 'view', 'dispMemberScrappedDocument'); + + // member 디렉토리 체크 + FileHandler::makeDir('./files/member_extra_info/image_name'); + FileHandler::makeDir('./files/member_extra_info/image_mark'); + FileHandler::makeDir('./files/member_extra_info/signature'); + FileHandler::makeDir('./files/member_extra_info/new_message_flags'); + + return new Object(0, 'success_updated'); + } + } +?> diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php new file mode 100644 index 000000000..eda1be4e3 --- /dev/null +++ b/modules/member/member.controller.php @@ -0,0 +1,1254 @@ +doLogin($user_id, $password); + } + + /** + * @brief openid로그인 + **/ + function procMemberOpenIDLogin() { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if($config->enable_openid != 'Y') $this->stop('msg_invalid_request'); + + ob_start(); + require('./modules/member/openid_lib/class.openid.php'); + require_once('./modules/member/openid_lib/libcurlemu.inc.php'); + + $user_id = Context::get('user_id'); + + $openid = new SimpleOpenID(); + + $openid->SetIdentity($user_id); + $openid->SetTrustRoot('http://' . $_SERVER["HTTP_HOST"]); + + $openid->SetRequiredFields(array('email')); + $openid->SetOptionalFields(array('dob')); + + if (!$openid->GetOpenIDServer()) { + $error = $openid->GetError(); + $this->setError(-1); + $this->setMessage($error['description']); + } else { + $openid->SetApprovedURL( sprintf('%s?module=member&act=procMemberOpenIDValidate', Context::getRequestUri()) ); + $url = $openid->GetRedirectURL(); + $this->add('redirect_url', $url); + } + ob_clean(); + } + + /** + * @brief openid 인증 체크 + **/ + function procMemberOpenIDValidate() { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if($config->enable_openid != 'Y') $this->stop('msg_invalid_request'); + + ob_start(); + require('./modules/member/openid_lib/class.openid.php'); + require_once('./modules/member/openid_lib/libcurlemu.inc.php'); + + $openid = new SimpleOpenID; + $openid->SetIdentity($_GET['openid_identity']); + $openid_validation_result = $openid->ValidateWithServer(); + ob_clean(); + + // 인증 성공 + if ($openid_validation_result == true) { + // 기본 정보들을 받음 + $args->user_id = $args->nick_name = preg_replace('/^http:\/\//i','',Context::get('openid_identity')); + $args->email_address = Context::get('openid_sreg_email'); + $args->user_name = Context::get('openid_sreg_fullname'); + if(!$args->user_name) list($args->user_name) = explode('@', $args->email_address); + $args->birthday = Context::get('openid_sreg_dob'); + + // 자체 인증 시도 + $output = $this->doLogin($args->user_id); + + // 자체 인증 실패시 회원 가입시킴 + if(!$output->toBool()) { + $args->password = md5(getmicrotime()); + $output = $this->insertMember($args); + if(!$output->toBool()) return $this->stop($output->getMessage()); + $output = $this->doLogin($args->user_id); + if(!$output->toBool()) return $this->stop($output->getMessage()); + } + + // 페이지 이동 + header("location:./"); + exit(); + + + // 인증 실패 + } else if($openid->IsError() == true) { + $error = $openid->GetError(); + return $this->stop($error['description']); + } else { + return $this->stop('invalid_authorization'); + } + } + + /** + * @brief 로그아웃 + **/ + function procMemberLogout() { + $_SESSION['is_logged'] = false; + $_SESSION['ipaddress'] = $_SERVER['REMOTE_ADDR']; + $_SESSION['logged_info'] = NULL; + $_SESSION['member_srl'] = NULL; + $_SESSION['group_srls'] = array(); + $_SESSION['is_admin'] = NULL; + return new Object(); + } + + /** + * @brief 쪽지 발송 + **/ + function procMemberSendMessage() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + + // 변수 검사 + $receiver_srl = Context::get('receiver_srl'); + if(!$receiver_srl) return new Object(-1, 'msg_not_exists_member'); + + $title = trim(Context::get('title')); + if(!$title) return new Object(-1, 'msg_title_is_null'); + + $content = trim(Context::get('content')); + if(!$content) return new Object(-1, 'msg_content_is_null'); + + // 받을 회원이 있는지에 대한 검사 + $oMemberModel = &getModel('member'); + $receiver_member_info = $oMemberModel->getMemberInfoByMemberSrl($receiver_srl); + if($receiver_member_info->member_srl != $receiver_srl) return new Object(-1, 'msg_not_exists_member'); + + // 받을 회원의 쪽지 수신여부 검사 + if($receiver_member_info->allow_message == 'F') { + if(!$oMemberModel->isFriend($receiver_member_info->member_srl)) return new object(-1, 'msg_allow_message_to_friend'); + } elseif($receiver_member_info->allow_messge == 'N') { + return new object(-1, 'msg_disallow_message'); + } + + // 쪽지 발송 + return $this->sendMessage($logged_info->member_srl, $receiver_srl, $title, $content); + } + + function sendMessage($sender_srl, $receiver_srl, $title, $content, $sender_log = true) { + $content = removeHackTag($content); + + // 보내는 사용자의 쪽지함에 넣을 쪽지 + $sender_args->sender_srl = $sender_srl; + $sender_args->receiver_srl = $receiver_srl; + $sender_args->message_type = 'S'; + $sender_args->title = $title; + $sender_args->content = $content; + $sender_args->readed = 'N'; + $sender_args->regdate = date("YmdHis"); + $sender_args->related_srl = getNextSequence(); + $sender_args->message_srl = getNextSequence(); + $sender_args->list_order = getNextSequence()*-1; + + // 받는 회원의 쪽지함에 넣을 쪽지 + $receiver_args->message_srl = $sender_args->related_srl; + $receiver_args->related_srl = 0; + $receiver_args->list_order = $sender_args->related_srl*-1; + $receiver_args->sender_srl = $sender_srl; + if(!$receiver_args->sender_srl) $receiver_args->sender_srl = $receiver_srl; + $receiver_args->receiver_srl = $receiver_srl; + $receiver_args->message_type = 'R'; + $receiver_args->title = $title; + $receiver_args->content = $content; + $receiver_args->readed = 'N'; + $receiver_args->regdate = date("YmdHis"); + + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 발송하는 회원의 쪽지함에 넣을 쪽지 + if($sender_srl && $sender_log) { + $output = executeQuery('member.sendMessage', $sender_args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + } + + // 받을 회원의 쪽지함에 넣을 쪽지 + $output = executeQuery('member.sendMessage', $receiver_args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 받는 회원의 쪽지 발송 플래그 생성 (파일로 생성) + $flag_path = './files/member_extra_info/new_message_flags/'.getNumberingPath($receiver_srl); + FileHandler::makeDir($flag_path); + $flag_file = sprintf('%s%s', $flag_path, $receiver_srl); + FileHandler::writeFile($flag_file,'1'); + + $oDB->commit(); + + return new Object(0,'success_sended'); + } + + /** + * @brief 특정 쪽지를 보관함으로 보냄 + **/ + function procMemberStoreMessage() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + + // 변수 체크 + $message_srl = Context::get('message_srl'); + if(!$message_srl) return new Object(-1,'msg_invalid_request'); + + // 쪽지를 가져옴 + $oMemberModel = &getModel('member'); + $message = $oMemberModel->getSelectedMessage($message_srl); + if(!$message || $message->message_type != 'R') return new Object(-1,'msg_invalid_request'); + + $args->message_srl = $message_srl; + $args->receiver_srl = $logged_info->member_srl; + $output = executeQuery('member.setMessageStored', $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_registed'); + } + + /** + * @brief 쪽지 삭제 + **/ + function procMemberDeleteMessage() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + // 변수 체크 + $message_srl = Context::get('message_srl'); + if(!$message_srl) return new Object(-1,'msg_invalid_request'); + + // 쪽지를 가져옴 + $oMemberModel = &getModel('member'); + $message = $oMemberModel->getSelectedMessage($message_srl); + if(!$message) return new Object(-1,'msg_invalid_request'); + + // 발송인+type=S or 수신인+type=R 검사 + if($message->sender_srl == $member_srl && $message->message_type == 'S') { + $args->message_srl = $message_srl; + } elseif($message->receiver_srl == $member_srl && $message->message_type == 'R') { + $args->message_srl = $message_srl; + } + if(!$args->message_srl) return new Object(-1, 'msg_invalid_request'); + + // 삭제 + $output = executeQuery('member.deleteMessage', $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_deleted'); + } + + /** + * @brief 선택된 다수의 쪽지 삭제 + **/ + function procMemberDeleteMessages() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + // 변수 체크 + $message_srl_list = trim(Context::get('message_srl_list')); + if(!$message_srl_list) return new Object(-1, 'msg_cart_is_null'); + + $message_srl_list = explode('|@|', $message_srl_list); + if(!count($message_srl_list)) return new Object(-1, 'msg_cart_is_null'); + + $message_type = Context::get('message_type'); + if(!$message_type || !in_array($message_type, array('R','S','T'))) return new Object(-1, 'msg_invalid_request'); + + $message_count = count($message_srl_list); + $target = array(); + for($i=0;$i<$message_count;$i++) { + $message_srl = (int)trim($message_srl_list[$i]); + if(!$message_srl) continue; + $target[] = $message_srl; + } + if(!count($target)) return new Object(-1,'msg_cart_is_null'); + + // 삭제 + $args->message_srls = implode(',',$target); + $args->message_type = $message_type; + + if($message_type == 'S') $args->sender_srl = $member_srl; + else $args->receiver_srl = $member_srl; + + $output = executeQuery('member.deleteMessages', $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_deleted'); + } + + /** + * @brief 스크랩 기능 + **/ + function procMemberScrapDocument() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + + $document_srl = (int)Context::get('document_srl'); + if(!$document_srl) return new Object(-1,'msg_invalid_request'); + + // 문서 가져오기 + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + + // 변수 정리 + $args->document_srl = $document_srl; + $args->member_srl = $logged_info->member_srl; + $args->user_id = $oDocument->get('user_id'); + $args->user_name = $oDocument->get('user_name'); + $args->nick_name = $oDocument->get('nick_name'); + $args->target_member_srl = $oDocument->get('member_srl'); + $args->title = $oDocument->get('title'); + + // 있는지 조사 + $output = executeQuery('member.getScrapDocument', $args); + if($output->data->count) return new Object(-1, 'msg_alreay_scrapped'); + + // 입력 + $output = executeQuery('member.addScrapDocument', $args); + if(!$output->toBool()) return $output; + + $this->setError(-1); + $this->setMessage('success_registed'); + } + + /** + * @brief 스크랩 삭제 + **/ + function procMemberDeleteScrap() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + + $document_srl = (int)Context::get('document_srl'); + if(!$document_srl) return new Object(-1,'msg_invalid_request'); + + // 변수 정리 + $args->member_srl = $logged_info->member_srl; + $args->document_srl = $document_srl; + return executeQuery('member.deleteScrapDocument', $args); + } + + /** + * @brief 친구 추가 + **/ + function procMemberAddFriend() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + + $target_srl = (int)trim(Context::get('target_srl')); + if(!$target_srl) return new Object(-1,'msg_invalid_request'); + + // 변수 정리 + $args->friend_srl = getNextSequence(); + $args->list_order = $args->friend_srl * -1; + $args->friend_group_srl = Context::get('friend_group_srl'); + $args->member_srl = $logged_info->member_srl; + $args->target_srl = $target_srl; + $output = executeQuery('member.addFriend', $args); + if(!$output->toBool()) return $output; + + $this->add('member_srl', $target_srl); + $this->setMessage('success_registed'); + } + + /** + * @brief 등록된 친구의 그룹 이동 + **/ + function procMemberMoveFriend() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + + // 변수 체크 + $friend_srl_list = trim(Context::get('friend_srl_list')); + if(!$friend_srl_list) return new Object(-1, 'msg_cart_is_null'); + + $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); + $target = array(); + for($i=0;$i<$friend_count;$i++) { + $friend_srl = (int)trim($friend_srl_list[$i]); + if(!$friend_srl) continue; + $target[] = $friend_srl; + } + if(!count($target)) return new Object(-1,'msg_cart_is_null'); + + // 변수 정리 + $args->friend_srls = implode(',',$target); + $args->member_srl = $logged_info->member_srl; + $args->friend_group_srl = Context::get('target_friend_group_srl'); + + $output = executeQuery('member.moveFriend', $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_moved'); + } + + /** + * @brief 친구 삭제 + **/ + function procMemberDeleteFriend() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + // 변수 체크 + $friend_srl_list = trim(Context::get('friend_srl_list')); + if(!$friend_srl_list) return new Object(-1, 'msg_cart_is_null'); + + $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); + $target = array(); + for($i=0;$i<$friend_count;$i++) { + $friend_srl = (int)trim($friend_srl_list[$i]); + if(!$friend_srl) continue; + $target[] = $friend_srl; + } + if(!count($target)) return new Object(-1,'msg_cart_is_null'); + + // 삭제 + $args->friend_srls = implode(',',$target); + $args->member_srl = $logged_info->member_srl; + $output = executeQuery('member.deleteFriend', $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_deleted'); + } + + /** + * @brief 친구 그룹 추가 + **/ + function procMemberAddFriendGroup() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + + // 변수 정리 + $args->friend_group_srl = trim(Context::get('friend_group_srl')); + $args->member_srl = $logged_info->member_srl; + $args->title = Context::get('title'); + if(!$args->title) return new Object(-1, 'msg_invalid_request'); + + // friend_group_srl이 있으면 수정 + if($args->friend_group_srl) { + $output = executeQuery('member.renameFriendGroup', $args); + $msg_code = 'success_updated'; + + // 아니면 입력 + } else { + $output = executeQuery('member.addFriendGroup', $args); + $msg_code = 'success_registed'; + } + + if(!$output->toBool()) return $output; + + $this->setMessage($msg_code); + } + + /** + * @brief 친구 그룹 이름 변경 + **/ + function procMemberRenameFriendGroup() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + + // 변수 정리 + $args->friend_group_srl= Context::get('friend_group_srl'); + $args->member_srl = $logged_info->member_srl; + $args->title = Context::get('title'); + if(!$args->title) return new Object(-1, 'msg_invalid_request'); + + $output = executeQuery('member.renameFriendGroup', $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_updated'); + } + + /** + * @brief 친구 그룹 삭제 + **/ + function procMemberDeleteFriendGroup() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + + // 변수 정리 + $args->friend_group_srl = Context::get('friend_group_srl'); + $args->member_srl = $logged_info->member_srl; + $output = executeQuery('member.deleteFriendGroup', $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_deleted'); + } + + /** + * @brief 특정 쪽지의 상태를 읽은 상태로 변경 + **/ + function setMessageReaded($message_srl) { + $args->message_srl = $message_srl; + $args->related_srl = $message_srl; + return executeQuery('member.setMessageReaded', $args); + } + + /** + * @brief 회원 가입 + **/ + function procMemberInsert() { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + + // 관리자가 회원가입을 허락하였는지 검사 + if($config->enable_join != 'Y') return $this->stop('msg_signup_disabled'); + + // 약관에 동의하였는지 검사 (약관이 있을 경우만) + if($config->agreement && Context::get('accept_agreement')!='Y') return $this->stop('msg_accept_agreement'); + + // 필수 정보들을 미리 추출 + $args = Context::gets('user_id','user_name','nick_name','homepage','blog','birthday','email_address','password','allow_mailing','allow_message'); + $args->member_srl = getNextSequence(); + + // 넘어온 모든 변수중에서 몇가지 불필요한 것들 삭제 + $all_args = Context::getRequestVars(); + unset($all_args->module); + unset($all_args->act); + unset($all_args->is_admin); + unset($all_args->description); + unset($all_args->group_srl_list); + + // 모든 request argument에서 필수 정보만 제외 한 후 추가 데이터로 입력 + $extra_vars = delObjectVars($all_args, $args); + $args->extra_vars = serialize($extra_vars); + + // member_srl의 값에 따라 insert/update + $output = $this->insertMember($args); + if(!$output->toBool()) return $output; + + // 로그인 시킴 + $this->doLogin($args->user_id); + + $this->add('member_srl', $args->member_srl); + if($config->redirect_url) $this->add('redirect_url', $config->redirect_url); + $this->setMessage('success_registed'); + } + + /** + * @brief 회원 정보 수정 + **/ + function procMemberModifyInfo() { + if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); + + // 필수 정보들을 미리 추출 + $args = Context::gets('user_name','nick_name','homepage','blog','birthday','email_address','allow_mailing','allow_message'); + + // 로그인 정보 + $logged_info = Context::get('logged_info'); + $args->member_srl = $logged_info->member_srl; + + // 넘어온 모든 변수중에서 몇가지 불필요한 것들 삭제 + $all_args = Context::getRequestVars(); + unset($all_args->module); + unset($all_args->act); + unset($all_args->is_admin); + unset($all_args->description); + unset($all_args->group_srl_list); + + // 모든 request argument에서 필수 정보만 제외 한 후 추가 데이터로 입력 + $extra_vars = delObjectVars($all_args, $args); + $args->extra_vars = serialize($extra_vars); + + // 멤버 모델 객체 생성 + $oMemberModel = &getModel('member'); + + // member_srl의 값에 따라 insert/update + $output = $this->updateMember($args); + if(!$output->toBool()) return $output; + + // 서명 저장 + $signature = Context::get('signature'); + $this->putSignature($args->member_srl, $signature); + + $this->setSessionInfo($args); + + // 결과 리턴 + $this->add('member_srl', $args->member_srl); + $this->setMessage('success_updated'); + } + + /** + * @brief 회원 비밀번호 수정 + **/ + function procMemberModifyPassword() { + if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); + + // 필수 정보들을 미리 추출 + $current_password = trim(Context::get('current_password')); + $password = trim(Context::get('password')); + + // 로그인한 유저의 정보를 가져옴 + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + // member model 객체 생성 + $oMemberModel = &getModel('member'); + + // member_srl 에 따른 정보 가져옴 + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + + // 현재 비밀번호가 맞는지 확인 + if(!$current_password || ($member_info->password != md5($current_password) && $this->mysql_pre4_hash_password($current_password) != $member_info->password)) { + return new Object(-1, 'invalid_password'); + } + + // member_srl의 값에 따라 insert/update + $args->member_srl = $member_srl; + $args->password = $password; + $output = $this->updateMemberPassword($args); + if(!$output->toBool()) return $output; + + $this->add('member_srl', $args->member_srl); + $this->setMessage('success_updated'); + } + + /** + * @brief 탈퇴 + **/ + function procMemberLeave() { + if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); + + // 필수 정보들을 미리 추출 + $password = trim(Context::get('password')); + + // 로그인한 유저의 정보를 가져옴 + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + // member model 객체 생성 + $oMemberModel = &getModel('member'); + + // member_srl 에 따른 정보 가져옴 + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + + // 현재 비밀번호가 맞는지 확인 + if(!$password || ($member_info->password != md5($password) && $this->mysql_pre4_hash_password($password) != $member_info->password)) { + return new Object(-1, 'invalid_password'); + } + + $output = $this->deleteMember($member_srl); + if(!$output->toBool()) return $output; + + $_SESSION['is_logged'] = false; + $_SESSION['logged_info'] = null; + + $this->setMessage('success_leaved'); + } + + /** + * @brief 이미지 이름을 추가 + **/ + function procMemberInsertImageName() { + // 정상적으로 업로드 된 파일인지 검사 + $file = $_FILES['image_name']; + if(!is_uploaded_file($file['tmp_name'])) return $this->stop('msg_not_uploaded_image_name'); + + // 회원 정보를 검사해서 회원번호가 없거나 관리자가 아니고 회원번호가 틀리면 무시 + $member_srl = Context::get('member_srl'); + if(!$member_srl) return $this->stop('msg_not_uploaded_image_name'); + + $logged_info = Context::get('logged_info'); + if($logged_info->is_admin != 'Y' && $logged_info->member_srl != $member_srl) return $this->stop('msg_not_uploaded_image_name'); + + // 회원 모듈 설정에서 이미지 이름 사용 금지를 하였을 경우 관리자가 아니면 return; + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if($logged_info->is_admin != 'Y' && $config->image_name != 'Y') return $this->stop('msg_not_uploaded_image_name'); + + $this->insertImageName($member_srl, $file['tmp_name']); + + // 페이지 리프레쉬 + $this->setRefreshPage(); + } + + function insertImageName($member_srl, $target_file) { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + + // 정해진 사이즈를 구함 + $max_width = $config->image_name_max_width; + if(!$max_width) $max_width = "90"; + $max_height = $config->image_name_max_height; + if(!$max_height) $max_height = "20"; + + // 저장할 위치 구함 + $target_path = sprintf('files/member_extra_info/image_name/%s/', getNumberingPath($member_srl)); + FileHandler::makeDir($target_path); + + $target_filename = sprintf('%s%d.gif', $target_path, $member_srl); + + // 파일 정보 구함 + list($width, $height, $type, $attrs) = @getimagesize($target_file); + + // 지정된 사이즈보다 크거나 gif가 아니면 변환 + if($width > $max_width || $height > $max_height || $type!=1) FileHandler::createImageFile($target_file, $target_filename, $max_width, $max_height, 'gif'); + else @copy($target_file, $target_filename); + } + + /** + * @brief 이미지 이름을 삭제 + **/ + function procMemberDeleteImageName() { + $member_srl = Context::get('member_srl'); + if(!$member_srl) return new Object(0,'success'); + + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if($config->image_name == 'N') return new Object(0,'success'); + + $logged_info = Context::get('logged_info'); + if($logged_info->is_admin == 'Y' || $logged_info->member_srl == $member_srl) { + $oMemberModel = &getModel('member'); + $image_name = $oMemberModel->getImageName($member_srl); + @unlink($image_name->file); + } + return new Object(0,'success'); + } + + /** + * @brief 이미지 마크를 추가 + **/ + function procMemberInsertImageMark() { + // 정상적으로 업로드 된 파일인지 검사 + $file = $_FILES['image_mark']; + if(!is_uploaded_file($file['tmp_name'])) return $this->stop('msg_not_uploaded_image_mark'); + + // 회원 정보를 검사해서 회원번호가 없거나 관리자가 아니고 회원번호가 틀리면 무시 + $member_srl = Context::get('member_srl'); + if(!$member_srl) return $this->stop('msg_not_uploaded_image_mark'); + + $logged_info = Context::get('logged_info'); + if($logged_info->is_admin != 'Y' && $logged_info->member_srl != $member_srl) return $this->stop('msg_not_uploaded_image_mark'); + + // 회원 모듈 설정에서 이미지 마크 사용 금지를 하였을 경우 관리자가 아니면 return; + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if($logged_info->is_admin != 'Y' && $config->image_mark != 'Y') return $this->stop('msg_not_uploaded_image_mark'); + + $this->insertImageMark($member_srl, $file['tmp_name']); + + // 페이지 리프레쉬 + $this->setRefreshPage(); + } + + function insertImageMark($member_srl, $target_file) { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + + // 정해진 사이즈를 구함 + $max_width = $config->image_mark_max_width; + if(!$max_width) $max_width = "20"; + $max_height = $config->image_mark_max_height; + if(!$max_height) $max_height = "20"; + + $target_path = sprintf('files/member_extra_info/image_mark/%s/', getNumberingPath($member_srl)); + FileHandler::makeDir($target_path); + + $target_filename = sprintf('%s%d.gif', $target_path, $member_srl); + FileHandler::createImageFile($target_file, $target_filename, $max_width, $max_height, 'gif'); + + } + + /** + * @brief 이미지 마크를 삭제 + **/ + function procMemberDeleteImageMark() { + $member_srl = Context::get('member_srl'); + if(!$member_srl) return new Object(0,'success'); + + $logged_info = Context::get('logged_info'); + if($logged_info->is_admin == 'Y' || $logged_info->member_srl == $member_srl) { + $oMemberModel = &getModel('member'); + $image_mark = $oMemberModel->getImageMark($member_srl); + @unlink($image_mark->file); + } + return new Object(0,'success'); + } + + /** + * @brief 서명을 파일로 저장 + **/ + function putSignature($member_srl, $signature) { + $signature = removeHackTag($signature); + $path = sprintf('files/member_extra_info/signature/%s/', getNumberingPath($member_srl)); + $filename = sprintf('%s%d.signature.php', $path, $member_srl); + if(!trim($signature) || trim(strtolower($signature))=='
    ') return @unlink($filename); + + $buff = sprintf('%s', $signature); + FileHandler::makeDir($path); + FileHandler::writeFile($filename, $buff); + } + + /** + * @brief 서명 파일 삭제 + **/ + function delSignature($member_srl) { + $filename = sprintf('files/member_extra_info/signature/%s%d.gif', getNumberingPath($member_srl), $member_srl); + @unlink($filename); + } + + /** + * @brief member_srl에 group_srl을 추가 + **/ + function addMemberToGroup($member_srl,$group_srl) { + $args->member_srl = $member_srl; + $args->group_srl = $group_srl; + + // 추가 + return executeQuery('member.addMemberToGroup',$args); + } + + /** + * @brief 로그인 시킴 + **/ + function doLogin($user_id, $password = '') { + // member model 객체 생성 + $oMemberModel = &getModel('member'); + + // user_id 에 따른 정보 가져옴 + $member_info = $oMemberModel->getMemberInfoByUserID($user_id); + + // return 값이 없으면 존재하지 않는 사용자로 지정 + if(!$user_id || $member_info->user_id != $user_id) return new Object(-1, 'invalid_user_id'); + + // 비밀번호 검사 : 우선 md5() hash값으로 비굥 + if($password && $member_info->password != md5($password)) { + // 혹시나 하여.. -_-;; mysql old_password로 검사하여 맞으면 db의 비밀번호 교체 + if($this->mysql_pre4_hash_password($password) == $member_info->password) { + + // 비밀번호 교체 + $password_args->member_srl = $member_info->member_srl; + $password_args->password = md5($password); + $output = executeQuery('member.updateMemberPassword', $password_args); + if(!$output->toBool()) return $output; + + // md5(), mysql old_password와도 다르면 잘못된 비빌번호 오류 메세지 리턴 + } else { + return new Object(-1, 'invalid_password'); + } + } + + // denied == 'Y' 이면 알림 + if($member_info->denied == 'Y') return new Object(-1,'msg_user_denied'); + + // denied_date가 현 시간보다 적으면 알림 + if($member_info->limit_date && $member_info->limit_date >= date("YmdHis")) return new Object(-1,sprintf(Context::getLang('msg_user_limited'),zdate($member_info->limit_date,"Y-m-d H:i"))); + + // 사용자 정보의 최근 로그인 시간을 기록 + $args->member_srl = $member_info->member_srl; + $output = executeQuery('member.updateLastLogin', $args); + + $this->setSessionInfo($member_info); + + return $output; + } + + /** + * @brief 세션 정보 갱싱 또는 생성 + **/ + function setSessionInfo($member_info) { + if(!$member_info->member_srl) return; + + // 로그인 처리 + $_SESSION['is_logged'] = true; + $_SESSION['ipaddress'] = $_SERVER['REMOTE_ADDR']; + $_SESSION['member_srl'] = $member_info->member_srl; + $_SESSION['is_admin'] = false; + + unset($member_info->password); + + // 사용자 그룹 설정 + if($member_info->group_list) { + $group_srl_list = array_keys($member_info->group_list); + $_SESSION['group_srls'] = $group_srl_list; + + // 관리자 그룹일 경우 관리자로 지정 + $oMemberModel = &getModel('member'); + $admin_group = $oMemberModel->getAdminGroup(); + if($admin_group->group_srl && in_array($admin_group->group_srl, $group_srl_list)) $_SESSION['is_admin'] = true; + } + + // 세션에 로그인 사용자 정보 저장 + foreach($member_info as $key => $val) { + $_SESSION['logged_info']->{$key} = $val; + } + + Context::set('is_logged', true); + Context::set('logged_info', $member_info); + } + + + /** + * @brief member 테이블에 사용자 추가 + **/ + function insertMember($args, $password_is_hashed = false) { + // 멤버 설정 정보에서 가입약관 부분을 재확인 + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + + $logged_info = Context::get('logged_info'); + + // 임시 제한 일자가 있을 경우 제한 일자에 내용 추가 + if($config->limit_day) $args->limit_date = date("YmdHis", time()+$config->limit_day*60*60*24); + + // 입력할 사용자의 아이디를 소문자로 변경 + $args->user_id = strtolower($args->user_id); + + // 필수 변수들의 조절 + if($args->allow_mailing!='Y') $args->allow_mailing = 'N'; + if(!in_array($args->allow_message, array('Y','N','F'))) $args->allow_message= 'Y'; + + if($logged_info->is_admin == 'Y') { + if($args->denied!='Y') $args->denied = 'N'; + if($args->is_admin!='Y') $args->is_admin = 'N'; + } else { + unset($args->is_admin); + unset($args->denied); + } + + list($args->email_id, $args->email_host) = explode('@', $args->email_address); + + // 홈페이지, 블로그의 주소 검사 + if($args->homepage && !eregi("^http:\/\/",$args->homepage)) $args->homepage = 'http://'.$args->homepage; + if($args->blog && !eregi("^http:\/\/",$args->blog)) $args->blog = 'http://'.$args->blog; + + // 모델 객체 생성 + $oMemberModel = &getModel('member'); + + // 금지 아이디인지 체크 + if($oMemberModel->isDeniedID($args->user_id)) return new Object(-1,'denied_user_id'); + + // 아이디, 닉네임, email address 의 중복 체크 + $member_srl = $oMemberModel->getMemberSrlByUserID($args->user_id); + if($member_srl) return new Object(-1,'msg_exists_user_id'); + + $member_srl = $oMemberModel->getMemberSrlByNickName($args->nick_name); + if($member_srl) return new Object(-1,'msg_exists_nick_name'); + + $member_srl = $oMemberModel->getMemberSrlByEmailAddress($args->email_address); + if($member_srl) return new Object(-1,'msg_exists_email_address'); + + $oDB = &DB::getInstance(); + $oDB->begin(); + + // DB에 입력 + $args->member_srl = getNextSequence(); + if($args->password && !$password_is_hashed) $args->password = md5($args->password); + elseif(!$args->password) unset($args->password); + + $output = executeQuery('member.insertMember', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 입력된 그룹 값이 없으면 기본 그룹의 값을 등록 + if(!$args->group_srl_list) { + $default_group = $oMemberModel->getDefaultGroup(); + + // 기본 그룹에 추가 + $output = $this->addMemberToGroup($args->member_srl,$default_group->group_srl); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 입력된 그룹 값이 있으면 해당 그룹의 값을 등록 + } else { + $group_srl_list = explode('|@|', $args->group_srl_list); + for($i=0;$iaddMemberToGroup($args->member_srl,$group_srl_list[$i]); + + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + } + } + + $oDB->commit(true); + + $output->add('member_srl', $args->member_srl); + return $output; + } + + /** + * @brief member 정보 수정 + **/ + function updateMember($args) { + // 모델 객체 생성 + $oMemberModel = &getModel('member'); + + $logged_info = Context::get('logged_info'); + + // 수정하려는 대상의 원래 정보 가져오기 + $member_info = $oMemberModel->getMemberInfoByMemberSrl($args->member_srl); + + // 필수 변수들의 조절 + if($args->allow_mailing!='Y') $args->allow_mailing = 'N'; + if(!in_array($args->allow_message, array('Y','N','F'))) $args->allow_message = 'Y'; + + if($logged_info->is_admin == 'Y') { + if($args->denied!='Y') $args->denied = 'N'; + if($args->is_admin!='Y' && $logged_info->member_srl != $args->member_srl) $args->is_admin = 'N'; + } else { + unset($args->is_admin); + unset($args->denied); + } + + list($args->email_id, $args->email_host) = explode('@', $args->email_address); + + // 홈페이지, 블로그의 주소 검사 + if($args->homepage && !eregi("^http:\/\/",$args->homepage)) $args->homepage = 'http://'.$args->homepage; + if($args->blog && !eregi("^http:\/\/",$args->blog)) $args->blog = 'http://'.$args->blog; + + // 아이디, 닉네임, email address 의 중복 체크 + $member_srl = $oMemberModel->getMemberSrlByUserID($args->user_id); + if($member_srl&&$args->member_srl!=$member_srl) return new Object(-1,'msg_exists_user_id'); + + $member_srl = $oMemberModel->getMemberSrlByNickName($args->nick_name); + if($member_srl&&$args->member_srl!=$member_srl) return new Object(-1,'msg_exists_nick_name'); + + $member_srl = $oMemberModel->getMemberSrlByEmailAddress($args->email_address); + if($member_srl&&$args->member_srl!=$member_srl) return new Object(-1,'msg_exists_email_address'); + + $oDB = &DB::getInstance(); + $oDB->begin(); + + // DB에 update + if($args->password) $args->password = md5($args->password); + else $args->password = $member_info->password; + if(!$args->user_name) $args->user_name = $member_info->user_name; + + $output = executeQuery('member.updateMember', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 그룹 정보가 있으면 그룹 정보를 변경 + if($args->group_srl_list) { + $group_srl_list = explode('|@|', $args->group_srl_list); + + // 일단 해당 회원의 모든 그룹 정보를 삭제 + $output = executeQuery('member.deleteMemberGroupMember', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 하나 하나 루프를 돌면서 입력 + for($i=0;$iaddMemberToGroup($args->member_srl,$group_srl_list[$i]); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + } + } + + $oDB->commit(); + + // 세션에 저장 + $member_info = $oMemberModel->getMemberInfoByMemberSrl($args->member_srl); + + $logged_info = Context::get('logged_info'); + if($logged_info->member_srl == $member_srl) { + $_SESSION['logged_info'] = $member_info; + } + + $output->add('member_srl', $args->member_srl); + return $output; + } + + /** + * @brief member 비밀번호 수정 + **/ + function updateMemberPassword($args) { + $args->password = md5($args->password); + return executeQuery('member.updateMemberPassword', $args); + } + + /** + * @brief 사용자 삭제 + **/ + function deleteMember($member_srl) { + + // 모델 객체 생성 + $oMemberModel = &getModel('member'); + + // 해당 사용자의 정보를 가져옴 + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + if(!$member_info) return new Object(-1, 'msg_not_exists_member'); + + // 관리자의 경우 삭제 불가능 + if($member_info->is_admin == 'Y') return new Object(-1, 'msg_cannot_delete_admin'); + + // member_group_member에서 해당 항목들 삭제 + $args->member_srl = $member_srl; + $output = executeQuery('member.deleteMemberGroupMember', $args); + if(!$output->toBool()) return $output; + + // 이름이미지, 이미지마크, 서명 삭제 + $this->procMemberDeleteImageName(); + $this->procMemberDeleteImageMark(); + $this->delSignature($member_srl); + + // member 테이블에서 삭제 + return executeQuery('member.deleteMember', $args); + } + + /** + * @brief 최종 출력물에서 이미지 이름을 변경 + * member_extra_info 애드온에서 요청이 됨 + **/ + function transImageName($matches) { + $member_srl = $matches[3]; + if($member_srl<0) return $matches[5]; + + $text = $matches[5]; + if(!$member_srl) return $matches[0]; + + // 전역변수에 미리 설정한 데이터가 있다면 그걸 return + if(!$GLOBALS['_transImageNameList'][$member_srl]) { + $oMemberModel = &getModel('member'); + + $GLOBALS['_transImageNameList'][$member_srl]['image_name'] = $oMemberModel->getImageName($member_srl); + $GLOBALS['_transImageNameList'][$member_srl]['image_mark'] = $oMemberModel->getImageMark($member_srl); + } + $image_name = $GLOBALS['_transImageNameList'][$member_srl]['image_name']; + $image_mark = $GLOBALS['_transImageNameList'][$member_srl]['image_mark']; + + // 이미지이름이나 마크가 없으면 원본 정보를 세팅 + if(!$image_name && !$image_mark) return $matches[0]; + + if($image_name->width) { + if($image_mark->height && $image_mark->height > $image_name->height) $top_margin = ($image_mark->height - $image_name->height)/2; + else $top_margin = 0; + $text = sprintf('id: %s', Context::getRequestUri().$image_name->file, htmlspecialchars(strip_tags($matches[5])), htmlspecialchars(strip_tags($matches[5])), $image_name->width, $image_name->height, $top_margin); + } + + if($image_mark->width) { + $matches[0] = str_replace('<'.$matches[6], sprintf('<%s style="cursor:pointer;background:url(%s) no-repeat left;padding-left:%dpx; height:%dpx" ', $matches[1],Context::getRequestUri().$image_mark->file, $image_mark->width+2, $image_mark->height), $matches[0] ); + } + $output = str_replace('>'.$matches[5].'<', '>'.$text.'<', $matches[0]); + return $output; + } + + /** + * @brief 최종 출력물에서 서명을 변경 + * member_extra_info 애드온에서 요청이 됨 + **/ + function transSignature($matches) { + $member_srl = $matches[2]; + if(!$member_srl) return $matches[0]; + + // 전역변수에 미리 설정한 데이터가 있다면 그걸 return + if(!isset($GLOBALS['_transSignatureList'][$member_srl])) { + $oMemberModel = &getModel('member'); + + $signature = $oMemberModel->getSignature($member_srl); + + // 서명이 없으면 빈 내용을 등록 + if(!$signature) { + $GLOBALS['_transSignatureList'][$member_srl] = null; + + // 서명이 있으면 글의 내용 다음에 추가 + } else { + $document = $matches[0].'
    '.$signature.'
    '; + $GLOBALS['_transSignatureList'][$member_srl] = $document; + } + } + + return $GLOBALS['_transSignatureList'][$member_srl].$matches[0]; + } + + /** + * @brief mysql old_password 의 php 구현 함수 + * 제로보드4나 기타 mysql4.1 이전의 old_password()함수를 쓴 데이터의 사용을 위해서 + * mysql의 password.c 소스 참조해서 구현함 + **/ + function mysql_pre4_hash_password($password) { + $nr = 1345345333; + $add = 7; + $nr2 = 0x12345671; + + settype($password, "string"); + + for ($i=0; $i diff --git a/modules/member/member.model.php b/modules/member/member.model.php new file mode 100644 index 000000000..c71416d05 --- /dev/null +++ b/modules/member/member.model.php @@ -0,0 +1,600 @@ +member_srl) { + $member_info = $logged_info; + + // 다른 사람의 아이디를 클릭한 경우 + } else { + // 회원의 정보를 구함 + $member_info = $this->getMemberInfoByMemberSrl($member_srl); + } + $member_srl = $member_info->member_srl; + + // 변수 정리 + $user_id = $member_info->user_id; + $user_name = $member_info->user_name; + $email_address = $member_info->email_address; + + // menu_list 에 "표시할글,target,url" 을 배열로 넣는다 + $menu_list = array(); + + // 최고 관리자라면 회원정보 수정 메뉴 만듬 + if($logged_info->is_admin == 'Y') { + $menu_str = Context::getLang('cmd_management'); + $menu_link = sprintf("%s?module=admin&act=dispMemberAdminInsert&member_srl=%s",Context::getRequestUri(),$member_srl); + $menu_list[] = sprintf("\n%s,%s,winopen('%s','MemberModifyInfo')", Context::getRequestUri().'/modules/member/tpl/images/icon_management.gif',$menu_str, $menu_link); + } + + // 회원 정보 보기 + $menu_str = Context::getLang('cmd_view_member_info'); + $menu_url = sprintf('./?mid=%s&act=dispMemberInfo&member_srl=%s', $mid, $member_srl); + $menu_list[] = sprintf('%s,%s,move_url(\'%s\')', Context::getRequestUri().'/modules/member/tpl/images/icon_view_info.gif', $menu_str, $menu_url); + + // 게시판이나 블로그등일 경우는 특별 옵션 지정 + if($mid && !ereg('Member', $act)) { + // 아이디로 검색 + $menu_str = Context::getLang('cmd_view_own_document'); + $menu_url = sprintf('./?mid=%s&search_target=user_id&search_keyword=%s', $mid, $user_id); + $menu_list[] = sprintf('%s,%s,move_url(\'%s\')', Context::getRequestUri().'/modules/member/tpl/images/icon_view_written.gif',$menu_str, $menu_url); + } + + // 다른 사람의 아이디를 클릭한 경우 + if($member_srl != $logged_info->member_srl) { + + // 메일 보내기 + $menu_str = Context::getLang('cmd_send_email'); + //$menu_url = sprintf('%s <%s>', $email_address, $user_name); + $menu_url = sprintf('%s', $email_address); + $menu_list[] = sprintf('%s,%s,sendMailTo(\'%s\')', Context::getRequestUri().'/modules/member/tpl/images/icon_sendmail.gif', $menu_str, $menu_url); + } + + // 홈페이지 보기 + if($member_info->homepage) $menu_list[] = sprintf("%s,%s,winopen('%s')", Context::getRequestUri().'/modules/member/tpl/images/icon_homepage.gif',Context::getLang('homepage'), $member_info->homepage); + + // 블로그 보기 + if($member_info->blog) $menu_list[] = sprintf("%s,%s,winopen('%s')", Context::getRequestUri().'/modules/member/tpl/images/icon_blog.gif', Context::getLang('blog'), $member_info->blog); + + // 정보를 저장 + $this->add("menu_list", implode("\n",$menu_list)); + } + + /** + * @brief 로그인 되어 있는지에 대한 체크 + **/ + function isLogged() { + if($_SESSION['is_logged']&&$_SESSION['ipaddress']==$_SERVER['REMOTE_ADDR']) return true; + + $_SESSION['is_logged'] = false; + $_SESSION['logged_info'] = ''; + return false; + } + + /** + * @brief 인증된 사용자의 정보 return + **/ + function getLoggedInfo() { + // 로그인 되어 있고 세션 정보를 요청하면 세션 정보를 return + if($this->isLogged()) return $_SESSION['logged_info']; + return NULL; + } + + /** + * @brief user_id에 해당하는 사용자 정보 return + **/ + function getMemberInfoByUserID($user_id) { + if(!$user_id) return; + + $args->user_id = $user_id; + $output = executeQuery('member.getMemberInfo', $args); + if(!$output) return $output; + + $member_info = $this->arrangeMemberInfo($output->data); + $member_info->group_list = $this->getMemberGroups($member_info->member_srl); + return $member_info; + } + + /** + * @brief member_srl로 사용자 정보 return + **/ + function getMemberInfoByMemberSrl($member_srl) { + if(!$member_srl) return; + $args->member_srl = $member_srl; + $output = executeQuery('member.getMemberInfoByMemberSrl', $args); + if(!$output) return $output; + + $member_info = $this->arrangeMemberInfo($output->data); + $member_info->group_list = $this->getMemberGroups($member_info->member_srl); + return $member_info; + } + + /** + * @brief 사용자 정보 중 extra_vars와 기타 정보를 알맞게 편집 + **/ + function arrangeMemberInfo($info) { + $info->image_name = $this->getImageName($info->member_srl); + $info->image_mark = $this->getImageMark($info->member_srl); + + $extra_vars = unserialize($info->extra_vars); + unset($info->extra_vars); + if(!$extra_vars) return $info; + foreach($extra_vars as $key => $val) { + if(eregi('\|\@\|', $val)) $val = explode('|@|', $val); + if(!$info->{$key}) $info->{$key} = $val; + } + return $info; + } + + /** + * @brief userid에 해당하는 member_srl을 구함 + **/ + function getMemberSrlByUserID($user_id) { + $args->user_id = $user_id; + $output = executeQuery('member.getMemberSrl', $args); + return $output->data->member_srl; + } + + /** + * @brief userid에 해당하는 member_srl을 구함 + **/ + function getMemberSrlByEmailAddress($email_address) { + $args->email_address = $email_address; + $output = executeQuery('member.getMemberSrl', $args); + return $output->data->member_srl; + } + + /** + * @brief userid에 해당하는 member_srl을 구함 + **/ + function getMemberSrlByNickName($nick_name) { + $args->nick_name = $nick_name; + $output = executeQuery('member.getMemberSrl', $args); + return $output->data->member_srl; + } + + /** + * @brief 현재 접속자의 member_srl을 return + **/ + function getLoggedMemberSrl() { + if(!$this->isLogged()) return; + return $_SESSION['member_srl']; + } + + /** + * @brief 현재 접속자의 user_id을 return + **/ + function getLoggedUserID() { + if(!$this->isLogged()) return; + $logged_info = $_SESSION['logged_info']; + return $logged_info->user_id; + } + + /** + * @brief member_srl이 속한 group 목록을 가져옴 + **/ + function getMemberGroups($member_srl) { + if(!$this->member_groups[$member_srl]) { + $args->member_srl = $member_srl; + $output = executeQuery('member.getMemberGroups', $args); + if(!$output->data) return array(); + + $group_list = $output->data; + if(!is_array($group_list)) $group_list = array($group_list); + + foreach($group_list as $group) { + $result[$group->group_srl] = $group->title; + } + $this->member_groups[$member_srl] = $result; + } + return $this->member_groups[$member_srl]; + } + + /** + * @brief 기본 그룹을 가져옴 + **/ + function getDefaultGroup() { + $output = executeQuery('member.getDefaultGroup'); + return $output->data; + } + + /** + * @brief 관리자 그룹을 가져옴 + **/ + function getAdminGroup() { + $output = executeQuery('member.getAdminGroup'); + return $output->data; + } + + /** + * @brief group_srl에 해당하는 그룹 정보 가져옴 + **/ + function getGroup($group_srl) { + $args->group_srl = $group_srl; + $output = executeQuery('member.getGroup', $args); + return $output->data; + } + + /** + * @brief 그룹 목록을 가져옴 + **/ + function getGroups() { + $output = executeQuery('member.getGroups'); + if(!$output->data) return; + + $group_list = $output->data; + if(!is_array($group_list)) $group_list = array($group_list); + + foreach($group_list as $val) { + $result[$val->group_srl] = $val; + } + return $result; + } + + /** + * @brief 회원 가입폼 추가 확장 목록 가져오기 + * + * 이 메소드는 modules/member/tpl/filter/insert.xml 의 extend_filter로 동작을 한다. + * extend_filter로 사용을 하기 위해서는 인자값으로 boolean값을 받도록 규정한다. + * 이 인자값이 true일 경우 filter 타입에 맞는 형태의 object로 결과를 return하여야 한다. + **/ + function getJoinFormList($filter_response = false) { + global $lang; + + if(!$this->join_form_list) { + // list_order 컬럼의 정렬을 위한 인자 세팅 + $args->sort_index = "list_order"; + $output = executeQuery('member.getJoinFormList', $args); + + // 결과 데이터가 없으면 NULL return + $join_form_list = $output->data; + if(!$join_form_list) return NULL; + + // default_value의 경우 DB에 array가 serialize되어 입력되므로 unserialize가 필요 + if(!is_array($join_form_list)) $join_form_list = array($join_form_list); + $join_form_count = count($join_form_list); + for($i=0;$i<$join_form_count;$i++) { + $member_join_form_srl = $join_form_list[$i]->member_join_form_srl; + $column_type = $join_form_list[$i]->column_type; + $column_name = $join_form_list[$i]->column_name; + $column_title = $join_form_list[$i]->column_title; + $default_value = $join_form_list[$i]->default_value; + + // 언어변수에 추가 + $lang->extend_vars[$column_name] = $column_title; + + // checkbox, select등 다수 데이터 형식일 경우 unserialize해줌 + if(in_array($column_type, array('checkbox','select'))) { + $join_form_list[$i]->default_value = unserialize($default_value); + if(!$join_form_list[$i]->default_value[0]) $join_form_list[$i]->default_value = ''; + } else { + $join_form_list[$i]->default_value = ''; + } + + $list[$member_join_form_srl] = $join_form_list[$i]; + } + $this->join_form_list = $list; + } + + // filter_response가 true일 경우 object 스타일을 구함 + if($filter_response && count($this->join_form_list)) { + + foreach($this->join_form_list as $key => $val) { + if($val->is_active != 'Y') continue; + unset($obj); + $obj->type = $val->column_type; + $obj->name = $val->column_name; + $obj->lang = $val->column_title; + $obj->required = $val->required=='Y'?true:false; + $filter_output[] = $obj; + } + return $filter_output; + + } + + // 결과 리턴 + return $this->join_form_list; + } + + /** + * @brief 추가 회원가입폼과 특정 회원의 정보를 조합 (회원정보 수정등에 사용) + **/ + function getCombineJoinForm($member_info) { + $extend_form_list = $this->getJoinFormlist(); + if(!$extend_form_list) return; + + foreach($extend_form_list as $srl => $item) { + $column_name = $item->column_name; + $value = $member_info->{$column_name}; + + // 추가 확장폼의 종류에 따라 값을 변경 + switch($item->column_type) { + case 'checkbox' : + if($value && !is_array($value)) $value = array($value); + break; + case 'text' : + case 'homepage' : + case 'email_address' : + case 'tel' : + case 'textarea' : + case 'select' : + case 'kr_zip' : + break; + } + + $extend_form_list[$srl]->value = $value; + } + return $extend_form_list; + } + + /** + * @brief 한개의 가입항목을 가져옴 + **/ + function getJoinForm($member_join_form_srl) { + $args->member_join_form_srl = $member_join_form_srl; + $output = executeQuery('member.getJoinForm', $args); + $join_form = $output->data; + if(!$join_form) return NULL; + + $column_type = $join_form->column_type; + $default_value = $join_form->default_value; + + if(in_array($column_type, array('checkbox','select'))) { + $join_form->default_value = unserialize($default_value); + } else { + $join_form->default_value = ''; + } + + return $join_form; + } + + /** + * @brief 금지 아이디 목록 가져오기 + **/ + function getDeniedIDList() { + if(!$this->denied_id_list) { + $args->sort_index = "list_order"; + $args->page = Context::get('page'); + $args->list_count = 40; + $args->page_count = 10; + + $output = executeQuery('member.getDeniedIDList', $args); + $this->denied_id_list = $output; + } + return $this->denied_id_list; + } + + /** + * @brief 금지 아이디인지 확인 + **/ + function isDeniedID($user_id) { + $args->user_id = $user_id; + $output = executeQuery('member.chkDeniedID', $args); + if($output->data->count) return true; + return false; + } + + /** + * @brief 이미지이름의 정보를 구함 + **/ + function getImageName($member_srl) { + $image_name_file = sprintf('files/member_extra_info/image_name/%s%d.gif', getNumberingPath($member_srl), $member_srl); + if(!file_exists($image_name_file)) return; + list($width, $height, $type, $attrs) = getimagesize($image_name_file); + $info->width = $width; + $info->height = $height; + $info->src = Context::getRequestUri().$image_name_file; + $info->file = './'.$image_name_file; + return $info; + } + + /** + * @brief 이미지마크의 정보를 구함 + **/ + function getImageMark($member_srl) { + $image_mark_file = sprintf('files/member_extra_info/image_mark/%s%d.gif', getNumberingPath($member_srl), $member_srl); + if(!file_exists($image_mark_file)) return; + list($width, $height, $type, $attrs) = getimagesize($image_mark_file); + $info->width = $width; + $info->height = $height; + $info->src = Context::getRequestUri().$image_mark_file; + $info->file = './'.$image_mark_file; + return $info; + } + + /** + * @brief 사용자의 signature를 구함 + **/ + function getSignature($member_srl) { + $filename = sprintf('files/member_extra_info/signature/%s%d.signature.php', getNumberingPath($member_srl), $member_srl); + if(!file_exists($filename)) return ''; + + $buff = FileHandler::readFile($filename); + $signature = trim(substr($buff, 40)); + return $signature; + } + + /** + * @brief 쪽지 내용을 가져옴 + **/ + function getSelectedMessage($message_srl) { + $logged_info = Context::get('logged_info'); + + $args->message_srl = $message_srl; + $output = executeQuery('member.getMessage',$args); + $message = $output->data; + if(!$message) return ; + + // 보낸 쪽지일 경우 받는 사람 정보를 구함 + if($message->sender_srl == $logged_info->member_srl && $message->message_type == 'S') $member_info = $this->getMemberInfoByMemberSrl($message->receiver_srl); + + // 보관/받은 쪽지일 경우 보낸 사람 정보를 구함 + else $member_info = $this->getMemberInfoByMemberSrl($message->sender_srl); + + if($member_info) { + foreach($member_info as $key => $val) $message->{$key} = $val; + } + + // 받은 쪽지이고 아직 읽지 않았을 경우 읽은 상태로 변경 + if($message->message_type == 'R' && $message->readed != 'Y') { + $oMemberController = &getController('member'); + $oMemberController->setMessageReaded($message_srl); + } + + + return $message; + } + + /** + * @brief 새 쪽지를 가져옴 + **/ + function getNewMessage() { + $logged_info = Context::get('logged_info'); + $args->receiver_srl = $logged_info->member_srl; + $args->readed = 'N'; + + $output = executeQuery('member.getNewMessage', $args); + if(!count($output->data)) return; + $message = array_pop($output->data); + + $oMemberController = &getController('member'); + $oMemberController->setMessageReaded($message->message_srl); + + return $message; + } + + /** + * @brief 쪽지 목록 가져오기 + * type = R : 받은 쪽지 + * type = S : 보낸 쪽지 + * type = T : 보관함 + **/ + function getMessages($message_type = "R") { + $logged_info = Context::get('logged_info'); + + switch($message_type) { + case 'R' : + $args->member_srl = $logged_info->member_srl; + $args->message_type = 'R'; + $query_id = 'member.getReceivedMessages'; + break; + case 'T' : + $args->member_srl = $logged_info->member_srl; + $args->message_type = 'T'; + $query_id = 'member.getStoredMessages'; + break; + default : + $args->member_srl = $logged_info->member_srl; + $args->message_type = 'S'; + $query_id = 'member.getSendedMessages'; + break; + + } + + // 기타 변수들 정리 + $args->sort_index = 'message.list_order'; + $args->page = Context::get('page'); + $args->list_count = 20; + $args->page_count = 10; + return executeQuery($query_id, $args); + } + + /** + * @brief 친구 목록 가져오기 + **/ + function getFriends($friend_group_srl = 0) { + $logged_info = Context::get('logged_info'); + + $args->friend_group_srl = $friend_group_srl; + $args->member_srl = $logged_info->member_srl; + + // 기타 변수들 정리 + $args->page = Context::get('page'); + $args->sort_index = 'friend.list_order'; + $args->list_count = 10; + $args->page_count = 10; + return executeQuery('member.getFriends', $args); + } + + /** + * @brief 이미 친구로 등록되었는지 검사 + **/ + function isAddedFriend($member_srl) { + $logged_info = Context::get('logged_info'); + + $args->member_srl = $logged_info->member_srl; + $args->target_srl = $member_srl; + $output = executeQuery('member.isAddedFriend', $args); + return $output->data->count; + } + + /** + * @brief 특정 친구 그룹 가져오기 + **/ + function getFriendGroupInfo($friend_group_srl) { + $logged_info = Context::get('logged_info'); + + $args->member_srl = $logged_info->member_srl; + $args->friend_group_srl = $friend_group_srl; + + $output = executeQuery('member.getFriendGroup', $args); + return $output->data; + } + + /** + * @brief 그룹 목록 가져오기 + **/ + function getFriendGroups() { + $logged_info = Context::get('logged_info'); + $args->member_srl = $logged_info->member_srl; + + $output = executeQuery('member.getFriendGroups', $args); + $group_list = $output->data; + if(!$group_list) return; + + if(!is_array($group_list)) $group_list = array($group_list); + return $group_list; + } + + /** + * @brief 특정 회원의 친구 목록에 포함되어 있는지를 확인 + **/ + function isFriend($target_srl) { + $logged_info = Context::get('logged_info'); + + $args->member_srl = $target_srl; + $args->target_srl = $logged_info->member_srl; + $output = executeQuery('member.isAddedFriend', $args); + if($output->data->count) return true; + return false; + } + } +?> diff --git a/modules/member/member.view.php b/modules/member/member.view.php new file mode 100644 index 000000000..433a8165e --- /dev/null +++ b/modules/member/member.view.php @@ -0,0 +1,420 @@ +member_config = $oModuleModel->getModuleConfig('member'); + if(!$this->member_config->skin) $this->member_config->skin = "default"; + if(!$this->member_config->colorset) $this->member_config->colorset = "white"; + + Context::set('member_config', $this->member_config); + $skin = $this->member_config->skin; + + // template path 지정 + $tpl_path = sprintf('%sskins/%s', $this->module_path, $skin); + $this->setTemplatePath($tpl_path); + + // my_menu 변수 설정 (자신의 정보와 관련된 부분, 차후 애드온등에서 변수 조절 가능) + $this->my_menu = array( + 'dispMemberInfo' => Context::getLang('cmd_view_member_info'), + 'dispMemberMessages' => Context::getLang('cmd_view_message_box'), + 'dispMemberFriend' => Context::getLang('cmd_view_friend'), + 'dispMemberOwnDocument' => Context::getLang('cmd_view_own_document'), + 'dispMemberScrappedDocument' => Context::getLang('cmd_view_scrapped_document'), + ); + } + + /** + * @brief 회원 정보 출력 + **/ + function dispMemberInfo() { + $oMemberModel = &getModel('member'); + $logged_info = Context::get('logged_info'); + + $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(); + } + + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + unset($member_info->password); + unset($member_info->email_id); + unset($member_info->email_host); + unset($member_info->email_address); + + if(!$member_info->member_srl) return $this->dispMemberSignUpForm(); + + Context::set('member_info', $member_info); + Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($member_info)); + + if($member_info->member_srl == $logged_info->member_srl) Context::set('my_menu', $this->my_menu); + + $this->setTemplateFile('member_info'); + } + + /** + * @brief 회원 가입 폼 출력 + **/ + function dispMemberSignUpForm() { + $oMemberModel = &getModel('member'); + + // 로그인한 회원일 경우 해당 회원의 정보를 받음 + if($oMemberModel->isLogged()) return $this->stop('msg_already_logged'); + + // 회원가입을 중지시켰을 때는 에러 표시 + if($this->member_config->enable_join != 'Y') return $this->stop('msg_signup_disabled'); + + Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($member_info)); + + // 템플릿 파일 지정 + $this->setTemplateFile('signup_form'); + } + + /** + * @brief 회원 정보 수정 + **/ + function dispMemberModifyInfo() { + $oMemberModel = &getModel('member'); + + // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 + if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); + + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + $member_info->signature = $oMemberModel->getSignature($member_srl); + Context::set('member_info',$member_info); + + // 추가 가입폼 목록을 받음 + Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($member_info)); + + // 에디터 모듈의 getEditor를 호출하여 서명용으로 세팅 + if($member_info->member_srl) { + $oEditorModel = &getModel('editor'); + $option->allow_fileupload = false; + $option->enable_autosave = false; + $option->enable_default_component = true; + $option->enable_component = true; + $option->resizable = false; + $option->height = 200; + $editor = $oEditorModel->getEditor($member_info->member_srl, $option); + Context::set('editor', $editor); + } + + if($member_info->member_srl == $logged_info->member_srl) Context::set('my_menu', $this->my_menu); + + // 템플릿 파일 지정 + $this->setTemplateFile('modify_info'); + } + + /** + * @brief 회원 작성글 보기 + **/ + function dispMemberOwnDocument() { + $oMemberModel = &getModel('member'); + + // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 + if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); + + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + $module_srl = Context::get('module_srl'); + Context::set('module_srl',Context::get('selected_module_srl')); + Context::set('search_target','member_srl'); + Context::set('search_keyword',$member_srl); + + $oDocumentAdminView = &getAdminView('document'); + $oDocumentAdminView->dispDocumentAdminList(); + + Context::get('module_srl', $module_srl); + Context::set('my_menu', $this->my_menu); + + $this->setTemplateFile('document_list'); + } + + /** + * @brief 회원 스크랩 게시물 보기 + **/ + function dispMemberScrappedDocument() { + $oMemberModel = &getModel('member'); + + // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 + if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); + + $logged_info = Context::get('logged_info'); + $args->member_srl = $logged_info->member_srl; + $args->page = (int)Context::get('page'); + + $output = executeQuery('member.getScrapDocumentList', $args); + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('document_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + Context::set('my_menu', $this->my_menu); + + $this->setTemplateFile('scrapped_list'); + } + + /** + * @brief 로그인 폼 출력 + **/ + function dispMemberLoginForm() { + // 템플릿 파일 지정 + $this->setTemplateFile('login_form'); + } + + /** + * @brief 회원 비밀번호 수정 + **/ + function dispMemberModifyPassword() { + $oMemberModel = &getModel('member'); + + // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 + if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); + + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + Context::set('member_info',$member_info); + + if($member_info->member_srl == $logged_info->member_srl) Context::set('my_menu', $this->my_menu); + + // 템플릿 파일 지정 + $this->setTemplateFile('modify_password'); + } + + /** + * @brief 탈퇴 화면 + **/ + function dispMemberLeave() { + $oMemberModel = &getModel('member'); + + // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 + if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); + + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + Context::set('member_info',$member_info); + + if($member_info->member_srl == $logged_info->member_srl) Context::set('my_menu', $this->my_menu); + + // 템플릿 파일 지정 + $this->setTemplateFile('leave_form'); + } + + /** + * @brief 로그아웃 출력 + **/ + function dispMemberLogout() { + // 템플릿 파일 지정 + $this->setTemplateFile('logout'); + } + + /** + * @brief 쪽지함 출력 + **/ + function dispMemberMessages() { + // 로그인이 되어 있지 않으면 오류 표시 + if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); + $logged_info = Context::get('logged_info'); + + // 변수 설정 + $message_srl = Context::get('message_srl'); + $message_type = Context::get('message_type'); + if(!in_array($message_type, array('R','S','T'))) { + $message_type = 'R'; + Context::set('message_type', $message_type); + } + + $oMemberModel = &getModel('member'); + + // message_srl이 있으면 내용 추출 + if($message_srl) { + $message = $oMemberModel->getSelectedMessage($message_srl); + if($message->message_srl == $message_srl) Context::set('message', $message); + } + + Context::set('my_menu', $this->my_menu); + + // 목록 추출 + $output = $oMemberModel->getMessages($message_type); + + // 템플릿에 쓰기 위해서 context::set + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('message_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + $this->setTemplateFile('member_messages'); + } + + /** + * @brief 새 쪽지 보여줌 + **/ + function dispMemberNewMessage() { + $this->setLayoutFile('popup_layout'); + + // 로그인이 되어 있지 않으면 오류 표시 + if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); + $logged_info = Context::get('logged_info'); + + $oMemberModel = &getModel('member'); + + // 새 쪽지를 가져옴 + $message = $oMemberModel->getNewMessage(); + if($message) Context::set('message', $message); + + // 플래그 삭제 + $flag_path = './files/member_extra_info/new_message_flags/'.getNumberingPath($logged_info->member_srl); + $flag_file = sprintf('%s%s', $flag_path, $logged_info->member_srl); + @unlink($flag_file); + + $this->setTemplateFile('member_new_message'); + } + + /** + * @brief 쪽지 발송 출력 + **/ + function dispMemberSendMessage() { + $this->setLayoutFile("popup_layout"); + + // 로그인이 되어 있지 않으면 오류 표시 + if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); + $logged_info = Context::get('logged_info'); + + // 쪽지 받을 사용자 정보 구함 + $receiver_srl = Context::get('receiver_srl'); + if(!$receiver_srl || $logged_info->member_srl == $receiver_srl) return $this->stop('msg_not_logged'); + + $oMemberModel = &getModel('member'); + $receiver_info = $oMemberModel->getMemberInfoByMemberSrl($receiver_srl); + Context::set('receiver_info', $receiver_info); + + // 에디터 모듈의 getEditor를 호출하여 서명용으로 세팅 + $oEditorModel = &getModel('editor'); + $option->allow_fileupload = false; + $option->enable_autosave = false; + $option->enable_default_component = true; + $option->enable_component = true; + $option->resizable = false; + $option->height = 250; + $editor = $oEditorModel->getEditor($logged_info->member_srl, $option); + Context::set('editor', $editor); + + $this->setTemplateFile('send_message'); + } + + /** + * @brief 친구 목록 보기 + **/ + function dispMemberFriend() { + // 로그인이 되어 있지 않으면 오류 표시 + if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); + + $oMemberModel = &getModel('member'); + + // 그룹 목록을 가져옴 + $tmp_group_list = $oMemberModel->getFriendGroups(); + $group_count = count($tmp_group_list); + for($i=0;$i<$group_count;$i++) $friend_group_list[$tmp_group_list[$i]->friend_group_srl] = $tmp_group_list[$i]; + Context::set('friend_group_list', $friend_group_list); + + // 친구 목록을 가져옴 + $friend_group_srl = Context::get('friend_group_srl'); + $output = $oMemberModel->getFriends($friend_group_srl); + $friend_count = count($output->data); + if($friend_count) { + foreach($output->data as $key => $val) { + $group_srl = $val->friend_group_srl; + $group_title = $friend_group_list[$group_srl]->title; + if(!$group_title) $group_title = Context::get('default_friend_group'); + $output->data[$key]->group_title = $group_title; + } + } + + // 템플릿에 쓰기 위해서 context::set + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('friend_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + Context::set('my_menu', $this->my_menu); + + $this->setTemplateFile('friends_list'); + } + + /** + * @brief 친구 추가 + **/ + function dispMemberAddFriend() { + $this->setLayoutFile("popup_layout"); + + // 로그인이 되어 있지 않으면 오류 표시 + if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); + $logged_info = Context::get('logged_info'); + + $target_srl = Context::get('target_srl'); + if(!$target_srl) return $this->stop('msg_invalid_request'); + + // 대상 회원의 정보를 구함 + $oMemberModel = &getModel('member'); + $member_info = $oMemberModel->getMemberInfoByMemberSrl($target_srl); + if($member_info->member_srl != $target_srl) return $this->stop('msg_invalid_request'); + Context::set('target_info', $member_info); + + // 그룹의 목록을 구함 + $friend_group_list = $oMemberModel->getFriendGroups(); + Context::set('friend_group_list', $friend_group_list); + + $this->setTemplateFile('add_friend'); + } + + /** + * @brief 친구 그룹 추가 + **/ + function dispMemberAddFriendGroup() { + $this->setLayoutFile("popup_layout"); + + // 로그인이 되어 있지 않으면 오류 표시 + if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); + $logged_info = Context::get('logged_info'); + + // 그룹 번호가 넘어오면 수정모드로.. + $friend_group_srl = Context::get('friend_group_srl'); + if($friend_group_srl) { + $oMemberModel = &getModel('member'); + $friend_group = $oMemberModel->getFriendGroupInfo($friend_group_srl); + if($friend_group->friend_group_srl == $friend_group_srl) Context::set('friend_group', $friend_group); + } + + + $this->setTemplateFile('add_friend_group'); + } + + } +?> diff --git a/modules/member/openid_lib/LICENSE b/modules/member/openid_lib/LICENSE new file mode 100644 index 000000000..3912109b5 --- /dev/null +++ b/modules/member/openid_lib/LICENSE @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/modules/member/openid_lib/README b/modules/member/openid_lib/README new file mode 100644 index 000000000..70a78b3c0 --- /dev/null +++ b/modules/member/openid_lib/README @@ -0,0 +1,99 @@ +CURL Extension Emulation Library +Version 1.0.4 +Copyright 2004-2007, Steve Blinch +http://code.blitzaffe.com +============================================================================ + +DESCRIPTION + +Provides a pure-PHP implementation of the PHP CURL extension, for use on +systems which do not already have the CURL extension installed. It emulates +all of the curl_* functions normally provided by the CURL extension itself. + +This will automatically detect and use the best CURL implementation available +on your server. It will attempt the following, in order: + +1) Check for the existence of the "real" CURL PHP Extension. If it is +loaded, the library will do nothing (and it will not interfere with the +"real" extension). +2) Check for the existence of the CURL console binary (usually located in +/usr/bin/curl). If found, the library will emulate the CURL PHP +extension (including all curl_* functions) and use the console binary +to execute all requests. +3) If neither the "real" CURL PHP Extension nor the CURL console binary +are available, the library will emulate the CURL PHP extension (including +all curl_* functions) using a native, pure-PHP HTTP client implementation. +This implementation is somewhat limited, but it provides support for most +of the common CURL options. HTTPS (SSL) support is available in this +mode under PHP 4.3.0 if the OpenSSL Extension is loaded. + +Thus, by including this library in your project, you can rely on having some +level of CURL support regardless of the configuration of the server on which +it is being used. + + +HISTORY + +1.0.4 (not released) +- Fixed HTTPRetriever double-inclusion bug. + + +USAGE + +Simply copy all of the libcurlemu files into your project directory, then: + +require_once("libcurlemu.inc.php"); + +After this, you can use all of the curl_* functions documented in the PHP +Manual. + + +EXAMPLE + +// CURL Extension Emulation Library Example +// +// Usage should be straightforward; you simply use this script exactly as you +// would normally use the PHP CURL extension functions. + +// first, include libcurlemu.inc.php +require_once('libcurlemu.inc.php'); + +// at this point, libcurlemu has detected the best available CURL solution +// (either the CURL extension, if available, or the CURL commandline binary, +// if available, or as a last resort, HTTPRetriever, our native-PHP HTTP +// client implementation) and has implemented the curl_* functions if +// necessary, so you can use CURL normally and safely assume that all CURL +// functions are available. + +// the rest of this example code is copied straight from the PHP manual's +// reference for the curl_init() function, and will work fine with libcurlemu + +// create a new CURL resource +$ch = curl_init(); + +// set URL and other appropriate options +curl_setopt($ch, CURLOPT_URL, "http://www.example.com/"); +curl_setopt($ch, CURLOPT_HEADER, false); + +// grab URL and pass it to the browser +curl_exec($ch); + +// close CURL resource, and free up system resources +curl_close($ch); + + +LICENSE + +This script is free software; you can redistribute it and/or modify it under the +terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This script is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +details. + +You should have received a copy of the GNU General Public License along +with this script; if not, write to the Free Software Foundation, Inc., +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA diff --git a/modules/member/openid_lib/class.openid.php b/modules/member/openid_lib/class.openid.php new file mode 100644 index 000000000..e79ebadd0 --- /dev/null +++ b/modules/member/openid_lib/class.openid.php @@ -0,0 +1,314 @@ +SetIdentity($_POST['openid_url']); + :: SET RETURN URL :: + $openid->SetApprovedURL('http://www.yoursite.com/return.php'); // Script which handles a response from OpenID Server + :: SET TRUST ROOT :: + $openid->SetTrustRoot('http://www.yoursite.com/'); + :: FETCH SERVER URL FROM IDENTITY PAGE :: [Note: It is recomended to cache this (Session, Cookie, Database)] + $openid->GetOpenIDServer(); // Returns false if server is not found + :: REDIRECT USER TO OPEN ID SERVER FOR APPROVAL :: + + :: (OPTIONAL) SET OPENID SERVER :: + $openid->SetOpenIDServer($server_url); // If you have cached previously this, you don't have to call GetOpenIDServer and set value this directly + + STEP 2) + Once user gets returned we must validate signature + :: VALIDATE REQUEST :: + true|false = $openid->ValidateWithServer(); + + ERRORS: + array = $openid->GetError(); // Get latest Error code + + FIELDS: + OpenID allowes you to retreive a profile. To set what fields you'd like to get use (accepts either string or array): + $openid->SetRequiredFields(array('email','fullname','dob','gender','postcode','country','language','timezone')); + or + $openid->SetOptionalFields('postcode'); + +IMPORTANT TIPS: +OPENID as is now, is not trust system. It is a great single-sign on method. If you want to +store information about OpenID in your database for later use, make sure you handle url identities +properly. + For example: + https://steve.myopenid.com/ + https://steve.myopenid.com + http://steve.myopenid.com/ + http://steve.myopenid.com + ... are representing one single user. Some OpenIDs can be in format openidserver.com/users/user/ - keep this in mind when storing identities + + To help you store an OpenID in your DB, you can use function: + $openid_db_safe = $openid->OpenID_Standarize($upenid); + This may not be comatible with current specs, but it works in current enviroment. Use this function to get openid + in one format like steve.myopenid.com (without trailing slashes and http/https). + Use output to insert Identity to database. Don't use this for validation - it may fail. + +*/ + +class SimpleOpenID{ + var $openid_url_identity; + var $URLs = array(); + var $error = array(); + var $fields = array(); + + function SimpleOpenID(){ + if (!function_exists('curl_exec')) { + die('Error: Class SimpleOpenID requires curl extension to work'); + } + } + function SetOpenIDServer($a){ + $this->URLs['openid_server'] = $a; + } + function SetTrustRoot($a){ + $this->URLs['trust_root'] = $a; + } + function SetCancelURL($a){ + $this->URLs['cancel'] = $a; + } + function SetApprovedURL($a){ + $this->URLs['approved'] = $a; + } + function SetRequiredFields($a){ + if (is_array($a)){ + $this->fields['required'] = $a; + }else{ + $this->fields['required'][] = $a; + } + } + function SetOptionalFields($a){ + if (is_array($a)){ + $this->fields['optional'] = $a; + }else{ + $this->fields['optional'][] = $a; + } + } + function SetIdentity($a){ // Set Identity URL + if(strpos($a, 'http://') === false) { + $a = 'http://'.$a; + } + /* + $u = parse_url(trim($a)); + if (!isset($u['path'])){ + $u['path'] = '/'; + }else if(substr($u['path'],-1,1) == '/'){ + $u['path'] = substr($u['path'], 0, strlen($u['path'])-1); + } + if (isset($u['query'])){ // If there is a query string, then use identity as is + $identity = $a; + }else{ + $identity = $u['scheme'] . '://' . $u['host'] . $u['path']; + }*/ + $this->openid_url_identity = $a; + } + function GetIdentity(){ // Get Identity + return $this->openid_url_identity; + } + function GetError(){ + $e = $this->error; + return array('code'=>$e[0],'description'=>$e[1]); + } + + function ErrorStore($code, $desc = null){ + $errs['OPENID_NOSERVERSFOUND'] = 'Cannot find OpenID Server TAG on Identity page.'; + if ($desc == null){ + $desc = $errs[$code]; + } + $this->error = array($code,$desc); + } + + function IsError(){ + if (count($this->error) > 0){ + return true; + }else{ + return false; + } + } + + function splitResponse($response) { + $r = array(); + $response = explode("\n", $response); + foreach($response as $line) { + $line = trim($line); + if ($line != "") { + list($key, $value) = explode(":", $line, 2); + $r[trim($key)] = trim($value); + } + } + return $r; + } + + function OpenID_Standarize($openid_identity){ + $u = parse_url(strtolower(trim($openid_identity))); + if ($u['path'] == '/'){ + $u['path'] = ''; + } + if(substr($u['path'],-1,1) == '/'){ + $u['path'] = substr($u['path'], 0, strlen($u['path'])-1); + } + if (isset($u['query'])){ // If there is a query string, then use identity as is + return $u['host'] . $u['path'] . '?' . $u['query']; + }else{ + return $u['host'] . $u['path']; + } + } + + function array2url($arr){ // converts associated array to URL Query String + if (!is_array($arr)){ + return false; + } + foreach($arr as $key => $value){ + $query .= $key . "=" . $value . "&"; + } + return $query; + } + function FSOCK_Request($url, $method="GET", $params = ""){ + $fp = fsockopen("ssl://www.myopenid.com", 443, $errno, $errstr, 3); // Connection timeout is 3 seconds + if (!$fp) { + $this->ErrorStore('OPENID_SOCKETERROR', $errstr); + return false; + } else { + $request = $method . " /server HTTP/1.0\r\n"; + $request .= "User-Agent: Simple OpenID PHP Class (http://www.phpclasses.org/simple_openid)\r\n"; + $request .= "Connection: close\r\n\r\n"; + fwrite($fp, $request); + stream_set_timeout($fp, 4); // Connection response timeout is 4 seconds + $res = fread($fp, 2000); + $info = stream_get_meta_data($fp); + fclose($fp); + + if ($info['timed_out']) { + $this->ErrorStore('OPENID_SOCKETTIMEOUT'); + } else { + return $res; + } + } + } + function CURL_Request($url, $method="GET", $params = "") { // Remember, SSL MUST BE SUPPORTED + if (is_array($params)) $params = $this->array2url($params); + $curl = curl_init(); + curl_setopt($curl, CURLOPT_URL,$url . ($method == "GET" && $params != "" ? "?" . $params : "")); + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($curl, CURLOPT_HEADER, false); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curl, CURLOPT_HTTPGET, ($method == "GET")); + curl_setopt($curl, CURLOPT_POST, ($method == "POST")); + if ($method == "POST") curl_setopt($curl, CURLOPT_POSTFIELDS, $params); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + $response = curl_exec($curl); + + if (curl_errno($curl) == 0){ + $response; + }else{ + $this->ErrorStore('OPENID_CURL', curl_error($curl)); + } + return $response; + } + + function HTML2OpenIDServer($content) { + $get = array(); + // Get details of their OpenID server and (optional) delegate + preg_match_all('/]*rel="openid.server"[^>]*href="([^"]+)"[^>]*\/?>/i', $content, $matches1); + preg_match_all('/]*href="([^"]+)"[^>]*rel="openid.server"[^>]*\/?>/i', $content, $matches2); + $servers = array_merge($matches1[1], $matches2[1]); + + preg_match_all('/]*rel="openid.delegate"[^>]*href="([^"]+)"[^>]*\/?>/i', $content, $matches1); + + preg_match_all('/]*href="([^"]+)"[^>]*rel="openid.delegate"[^>]*\/?>/i', $content, $matches2); + + $delegates = array_merge($matches1[1], $matches2[1]); + + $ret = array($servers, $delegates); + return $ret; + } + + function GetOpenIDServer(){ + $response = $this->CURL_Request($this->openid_url_identity); + list($servers, $delegates) = $this->HTML2OpenIDServer($response); + if (count($servers) == 0){ + $this->ErrorStore('OPENID_NOSERVERSFOUND'); + return false; + } + if ($delegates[0] != ""){ + $this->openid_url_identity = $delegates[0]; + } + $this->SetOpenIDServer($servers[0]); + return $servers[0]; + } + + function GetRedirectURL(){ + $params = array(); + $params['openid.return_to'] = urlencode($this->URLs['approved']); + $params['openid.mode'] = 'checkid_setup'; + $params['openid.identity'] = urlencode($this->openid_url_identity); + $params['openid.trust_root'] = urlencode($this->URLs['trust_root']); + + if (count($this->fields['required']) > 0){ + $params['openid.sreg.required'] = implode(',',$this->fields['required']); + } + if (count($this->fields['optional']) > 0){ + $params['openid.sreg.optional'] = implode(',',$this->fields['optional']); + } + return $this->URLs['openid_server'] . "?". $this->array2url($params); + } + + function Redirect(){ + $redirect_to = $this->GetRedirectURL(); + if (headers_sent()){ // Use JavaScript to redirect if content has been previously sent (not recommended, but safe) + echo ''; + }else{ // Default Header Redirect + header('Location: ' . $redirect_to); + } + } + + function ValidateWithServer(){ + $params = array( + 'openid.assoc_handle' => urlencode($_GET['openid_assoc_handle']), + 'openid.signed' => urlencode($_GET['openid_signed']), + 'openid.sig' => urlencode($_GET['openid_sig']) + ); + // Send only required parameters to confirm validity + $arr_signed = explode(",",str_replace('sreg.','sreg_',$_GET['openid_signed'])); + for ($i=0; $i"; + // print_r($_GET); + // print_r($params); + // print ""; + $openid_server = $this->GetOpenIDServer(); + if ($openid_server == false){ + return false; + } + $response = $this->CURL_Request($openid_server,'GET',$params); + $data = $this->splitResponse($response); + if ($data['is_valid'] == "true") { + return true; + }else{ + return false; + } + } +} + +?> diff --git a/modules/member/openid_lib/class_HTTPRetriever.php b/modules/member/openid_lib/class_HTTPRetriever.php new file mode 100755 index 000000000..58f841bd7 --- /dev/null +++ b/modules/member/openid_lib/class_HTTPRetriever.php @@ -0,0 +1,1159 @@ +curl_proxy (only useable when + * $http->force_curl is TRUE; internal support not yet implemented) + * + * + * 1.1.9 (11-Oct-2006) + * - Added set_transfer_display() and default_transfer_callback() + * methods for transfer progress tracking + * - Suppressed possible "fatal protocol error" when remote SSL server + * closes the connection early + * - Added get_content_type() method + * - make_query_string() now handles arrays + * + * 1.1.8 (19-Jun-2006) + * - Added set_progress_display() and default_progress_callback() + * methods for debug output + * - Added support for relative URLs in HTTP redirects + * - Added cookie support (sending and receiving) + * - Numerous bug fixes + * + * 1.1.7 (18-Apr-2006) + * - Added support for automatically following HTTP redirects + * - Added ::get_error() method to get any available error message (be + * it an HTTP result error or an internal/connection error) + * - Added ::cache_hit variable to determine whether the page was cached + * + * 1.1.6 (04-Mar-2006) + * - Added stream_timeout class variable. + * - Added progress_callback class variable. + * - Added support for braindead servers that ignore Connection: close + * + * + * EXAMPLE + * + * // HTTPRetriever usage example + * require_once("class_HTTPRetriever.php"); + * $http = &new HTTPRetriever(); + * + * + * // Example GET request: + * // ---------------------------------------------------------------------------- + * $keyword = "blitzaffe code"; // search Google for this keyword + * if (!$http->get("http://www.google.com/search?hl=en&q=%22".urlencode($keyword)."%22&btnG=Search&meta=")) { + * echo "HTTP request error: #{$http->result_code}: {$http->result_text}"; + * return false; + * } + * echo "HTTP response headers:
    ";
    + * var_dump($http->response_headers);
    + * echo "

    "; + * + * echo "Page content:
    ";
    + * echo $http->response;
    + * echo "
    "; + * // ---------------------------------------------------------------------------- + * + * + * // Example POST request: + * // ---------------------------------------------------------------------------- + * $keyword = "blitzaffe code"; // search Google for this keyword + * $values = array( + * "hl"=>"en", + * "q"=>"%22".urlencode($keyword)."%22", + * "btnG"=>"Search", + * "meta"=>"" + * ); + * // Note: This example is just to demonstrate the POST equivalent of the GET + * // example above; running this script will return a 501 Not Implemented, as + * // Google does not support POST requests. + * if (!$http->post("http://www.google.com/search",$http->make_query_string($values))) { + * echo "HTTP request error: #{$http->result_code}: {$http->result_text}"; + * return false; + * } + * echo "HTTP response headers:
    ";
    + * var_dump($http->response_headers);
    + * echo "

    "; + * + * echo "Page content:
    ";
    + * echo $http->response;
    + * echo "
    "; + * // ---------------------------------------------------------------------------- + * + * + * LICENSE + * + * This script is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * This script is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along + * with this script; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// define user agent ID's +define("UA_EXPLORER",0); +define("UA_MOZILLA",1); +define("UA_FIREFOX",2); +define("UA_OPERA",3); + +// define progress message severity levels +define('HRP_DEBUG',0); +define('HRP_INFO',1); +define('HRP_ERROR',2); + +if (!defined("CURL_PATH")) define("CURL_PATH","/usr/bin/curl"); + +// if the CURL extension is not loaded, but the CURL Emulation Library is found, try +// to load it +if (!extension_loaded("curl") && !defined('HTTPR_NO_REDECLARE_CURL') ) { + require_once('./modules/member/openid_lib/libcurlemu.inc.php'); +} + +class HTTPRetriever { + + // Constructor + function HTTPRetriever() { + // default HTTP headers to send with all requests + $this->headers = array( + "Referer"=>"", + "User-Agent"=>"HTTPRetriever/1.0", + "Connection"=>"close" + ); + + // HTTP version (has no effect if using CURL) + $this->version = "1.1"; + + // Normally, CURL is only used for HTTPS requests; setting this to + // TRUE will force CURL for HTTP requests as well. Not recommended. + $this->force_curl = false; + + // If you don't want to use CURL at all, set this to TRUE. + $this->disable_curl = false; + + // If HTTPS request return an error message about SSL certificates in + // $this->error and you don't care about security, set this to TRUE + $this->insecure_ssl = false; + + // Set the maximum time to wait for a connection + $this->connect_timeout = 15; + + // Set the maximum time to allow a transfer to run, or 0 to disable. + $this->max_time = 0; + + // Set the maximum time for a socket read/write operation, or 0 to disable. + $this->stream_timeout = 0; + + // If you're making an HTTPS request to a host whose SSL certificate + // doesn't match its domain name, AND YOU FULLY UNDERSTAND THE + // SECURITY IMPLICATIONS OF IGNORING THIS PROBLEM, set this to TRUE. + $this->ignore_ssl_hostname = false; + + // If TRUE, the get() and post() methods will close the connection + // and return immediately after receiving the HTTP result code + $this->result_close = false; + + // If set to a positive integer value, retrieved pages will be cached + // for this number of seconds. Any subsequent calls within the cache + // period will return the cached page, without contacting the remote + // server. + $this->caching = false; + + // If TRUE and $this->caching is not false, retrieved pages/files will be + // cached only if they appear to be static. + $this->caching_intelligent = false; + + // If TRUE, cached files will be stored in subdirectories corresponding + // to the first 2 letters of the hash filename + $this->caching_highvolume = false; + + // If $this->caching is enabled, this specifies the folder under which + // cached pages are saved. + $this->cache_path = '/tmp/'; + + // Set these to perform basic HTTP authentication + $this->auth_username = ''; + $this->auth_password = ''; + + // Optionally set this to a valid callback method to have HTTPRetriever + // provide page preprocessing capabilities to your script. If set, this + // method should accept two arguments: an object representing an instance + // of HTTPRetriever, and a string containing the page contents + $this->page_preprocessor = null; + + // Optionally set this to a valid callback method to have HTTPRetriever + // provide progress messages. Your callback must accept 2 parameters: + // an integer representing the severity (0=debug, 1=information, 2=error), + // and a string representing the progress message + $this->progress_callback = null; + + // Optionally set this to a valid callback method to have HTTPRetriever + // provide bytes-transferred messages. Your callbcak must accept 2 + // parameters: an integer representing the number of bytes transferred, + // and an integer representing the total number of bytes expected (or + // -1 if unknown). + $this->transfer_callback = null; + + // Set this to TRUE if you HTTPRetriever to transparently follow HTTP + // redirects (code 301, 302, 303, and 307). Optionally set this to a + // numeric value to limit the maximum number of redirects to the specified + // value. (Redirection loops are detected automatically.) + // Note that non-GET/HEAD requests will NOT be redirected except on code + // 303, as per HTTP standards. + $this->follow_redirects = false; + } + + // Send an HTTP GET request to $url; if $ipaddress is specified, the + // connection will be made to the selected IP instead of resolving the + // hostname in $url. + // + // If $cookies is set, it should be an array in one of two formats. + // + // Either: $cookies[ 'cookiename' ] = array ( + // '/path/'=>array( + // 'expires'=>time(), + // 'domain'=>'yourdomain.com', + // 'value'=>'cookievalue' + // ) + // ); + // + // Or, a more simplified format: + // $cookies[ 'cookiename' ] = 'value'; + // + // The former format will automatically check to make sure that the path, domain, + // and expiration values match the HTTP request, and will only send the cookie if + // they do match. The latter will force the cookie to be set for the HTTP request + // unconditionally. + // + function get($url,$ipaddress = false,$cookies = false) { + $this->method = "GET"; + $this->post_data = ""; + $this->connect_ip = $ipaddress; + return $this->_execute_request($url,$cookies); + } + + // Send an HTTP POST request to $url containing the POST data $data. See ::get() + // for a description of the remaining arguments. + function post($url,$data="",$ipaddress = false,$cookies = false) { + $this->method = "POST"; + $this->post_data = $data; + $this->connect_ip = $ipaddress; + return $this->_execute_request($url,$cookies); + } + + // Send an HTTP HEAD request to $url. See ::get() for a description of the arguments. + function head($url,$ipaddress = false,$cookies = false) { + $this->method = "HEAD"; + $this->post_data = ""; + $this->connect_ip = $ipaddress; + return $this->_execute_request($url,$cookies); + } + + // send an alternate (non-GET/POST) HTTP request to $url + function custom($method,$url,$data="",$ipaddress = false,$cookies = false) { + $this->method = $method; + $this->post_data = $data; + $this->connect_ip = $ipaddress; + return $this->_execute_request($url,$cookies); + } + + function array_to_query($arrayname,$arraycontents) { + $output = ""; + foreach ($arraycontents as $key=>$value) { + if (is_array($value)) { + $output .= $this->array_to_query(sprintf('%s[%s]',$arrayname,urlencode($key)),$value); + } else { + $output .= sprintf('%s[%s]=%s&',$arrayname,urlencode($key),urlencode($value)); + } + } + return $output; + } + + // builds a query string from the associative array array $data; + // returns a string that can be passed to $this->post() + function make_query_string($data) { + $output = ""; + if (is_array($data)) { + foreach ($data as $name=>$value) { + if (is_array($value)) { + $output .= $this->array_to_query(urlencode($name),$value); + } elseif (is_scalar($value)) { + $output .= urlencode($name)."=".urlencode($value)."&"; + } else { + $output .= urlencode($name)."=".urlencode(serialize($value)).'&'; + } + } + } + return substr($output,0,strlen($output)-1); + } + + + // this is pretty limited... but really, if you're going to spoof you UA, you'll probably + // want to use a Windows OS for the spoof anyway + // + // if you want to set the user agent to a custom string, just assign your string to + // $this->headers["User-Agent"] directly + function set_user_agent($agenttype,$agentversion,$windowsversion) { + $useragents = array( + "Mozilla/4.0 (compatible; MSIE %agent%; Windows NT %os%)", // IE + "Mozilla/5.0 (Windows; U; Windows NT %os%; en-US; rv:%agent%) Gecko/20040514", // Moz + "Mozilla/5.0 (Windows; U; Windows NT %os%; en-US; rv:1.7) Gecko/20040803 Firefox/%agent%", // FFox + "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT %os%) Opera %agent% [en]", // Opera + ); + $agent = $useragents[$agenttype]; + $this->headers["User-Agent"] = str_replace(array("%agent%","%os%"),array($agentversion,$windowsversion),$agent); + } + + // this isn't presently used as it's now handled inline by the request parser + function remove_chunkiness() { + $remaining = $this->response; + $this->response = ""; + + while ($remaining) { + $hexlen = strpos($remaining,"\r"); + $chunksize = substr($remaining,0,$hexlen); + $argstart = strpos($chunksize,';'); + if ($argstart!==false) $chunksize = substr($chunksize,0,$argstart); + $chunksize = (int) @hexdec($chunksize); + + $this->response .= substr($remaining,$hexlen+2,$chunksize); + $remaining = substr($remaining,$hexlen+2+$chunksize+2); + + if (!$chunksize) { + // either we're done, or something's borked... exit + $this->response .= $remaining; + return; + } + } + } + + // (internal) store a page in the cache + function _cache_store($token,$url) { + + if ($this->caching_intelligent) { + $urlinfo = parse_url($url); + if ($this->method=='POST') { + $this->progress(HRP_DEBUG,"POST request; not caching"); + return; + } else if (strlen($urlinfo['query'])) { + $this->progress(HRP_DEBUG,"Request used query string; not caching"); + return; + } else { + $this->progress(HRP_DEBUG,"Request appears to be static and cacheable"); + } + } + + $values = array( + "stats"=>$this->stats, + "result_code"=>$this->result_code, + "result_text"=>$this->result_text, + "version"=>$this->version, + "response"=>$this->response, + "response_headers"=>$this->response_headers, + "response_cookies"=>$this->response_cookies, + "raw_response"=>$this->raw_response, + ); + $values = serialize($values); + + $cache_dir = $this->cache_path; + if (substr($cache_dir,-1)!='/') $cache_dir .= '/'; + + if ($this->caching_highvolume) { + $cache_dir .= substr($token,0,2) . '/'; + if (!is_dir($cache_dir)) @mkdir($cache_dir); + } + + $filename = $cache_dir.$token.'.tmp'; + + $fp = @fopen($filename,"w"); + if (!$fp) { + $this->progress(HRP_DEBUG,"Unable to create cache file"); + return false; + } + fwrite($fp,$values); + fclose($fp); + + $this->progress(HRP_DEBUG,"HTTP response stored to cache"); + } + + // (internal) fetch a page from the cache + function _cache_fetch($token) { + $this->cache_hit = false; + $this->progress(HRP_DEBUG,"Checking for cached page value"); + + $cache_dir = $this->cache_path; + if (substr($cache_dir,-1)!='/') $cache_dir .= '/'; + + if ($this->caching_highvolume) $cache_dir .= substr($token,0,2) . '/'; + + $filename = $cache_dir.$token.'.tmp'; + if (!file_exists($filename)) { + $this->progress(HRP_DEBUG,"Page not available in cache"); + return false; + } + + if (time()-filemtime($filename)>$this->caching) { + $this->progress(HRP_DEBUG,"Page in cache is expired"); + @unlink($filename); + return false; + } + + if ($values = file_get_contents($filename)) { + $values = unserialize($values); + if (!$values) { + $this->progress(HRP_DEBUG,"Invalid cache contents"); + return false; + } + + $this->stats = $values["stats"]; + $this->result_code = $values["result_code"]; + $this->result_text = $values["result_text"]; + $this->version = $values["version"]; + $this->response = $values["response"]; + $this->response_headers = $values["response_headers"]; + $this->response_cookies = $values["response_cookies"]; + $this->raw_response = $values["raw_response"]; + + $this->progress(HRP_DEBUG,"Page loaded from cache"); + $this->cache_hit = true; + return true; + } else { + $this->progress(HRP_DEBUG,"Error reading cache file"); + return false; + } + } + + function parent_path($path) { + if (substr($path,0,1)=='/') $path = substr($path,1); + if (substr($path,-1)=='/') $path = substr($path,0,strlen($path)-1); + $path = explode('/',$path); + array_pop($path); + return count($path) ? ('/' . implode('/',$path)) : ''; + } + + // $cookies should be an array in one of two formats. + // + // Either: $cookies[ 'cookiename' ] = array ( + // '/path/'=>array( + // 'expires'=>time(), + // 'domain'=>'yourdomain.com', + // 'value'=>'cookievalue' + // ) + // ); + // + // Or, a more simplified format: + // $cookies[ 'cookiename' ] = 'value'; + // + // The former format will automatically check to make sure that the path, domain, + // and expiration values match the HTTP request, and will only send the cookie if + // they do match. The latter will force the cookie to be set for the HTTP request + // unconditionally. + // + function response_to_request_cookies($cookies,$urlinfo) { + + // check for simplified cookie format (name=value) + $cookiekeys = array_keys($cookies); + if (!count($cookiekeys)) return; + + $testkey = array_pop($cookiekeys); + if (!is_array($cookies[ $testkey ])) { + foreach ($cookies as $k=>$v) $this->request_cookies[$k] = $v; + return; + } + + // must not be simplified format, so parse as complex format: + foreach ($cookies as $name=>$paths) { + foreach ($paths as $path=>$values) { + // make sure the cookie isn't expired + if ( isset($values['expires']) && ($values['expires']request_cookies[$name] = $values['value']; + } + } + } + + // Execute the request for a particular URL, and transparently follow + // HTTP redirects if enabled. If $cookies is specified, it is assumed + // to be an array received from $this->response_cookies and will be + // processed to determine which cookies are valid for this host/URL. + function _execute_request($url,$cookies = false) { + // valid codes for which we transparently follow a redirect + $redirect_codes = array(301,302,303,307); + // valid methods for which we transparently follow a redirect + $redirect_methods = array('GET','HEAD'); + + $request_result = false; + + $this->followed_redirect = false; + $this->response_cookies = array(); + $this->cookie_headers = ''; + + $previous_redirects = array(); + do { + // send the request + $request_result = $this->_send_request($url,$cookies); + $lasturl = $url; + $url = false; + + // see if a redirect code was received + if ($this->follow_redirects && in_array($this->result_code,$redirect_codes)) { + + // only redirect on a code 303 or if the method was GET/HEAD + if ( ($this->result_code==303) || in_array($this->method,$redirect_methods) ) { + + // parse the information from the OLD URL so that we can handle + // relative links + $oldurlinfo = parse_url($lasturl); + + $url = $this->response_headers['Location']; + + // parse the information in the new URL, and fill in any blanks + // using values from the old URL + $urlinfo = parse_url($url); + foreach ($oldurlinfo as $k=>$v) { + if (!$urlinfo[$k]) $urlinfo[$k] = $v; + } + + // create an absolute path + if (substr($urlinfo['path'],0,1)!='/') { + $baseurl = $oldurlinfo['path']; + if (substr($baseurl,-1)!='/') $baseurl = $this->parent_path($url) . '/'; + $urlinfo['path'] = $baseurl . $urlinfo['path']; + } + + // rebuild the URL + $url = $this->rebuild_url($urlinfo); + + $this->method = "GET"; + $this->post_data = ""; + + $this->progress(HRP_INFO,'Redirected to '.$url); + } + } + + if ( $url && strlen($url) ) { + + if (isset($previous_redirects[$url])) { + $this->error = "Infinite redirection loop"; + $request_result = false; + break; + } + if ( is_numeric($this->follow_redirects) && (count($previous_redirects)>$this->follow_redirects) ) { + $this->error = "Exceeded redirection limit"; + $request_result = false; + break; + } + + $previous_redirects[$url] = true; + } + + } while ($url && strlen($url)); + + // clear headers that shouldn't persist across multiple requests + $per_request_headers = array('Host','Content-Length'); + foreach ($per_request_headers as $k=>$v) unset($this->headers[$v]); + + if (count($previous_redirects)>1) $this->followed_redirect = array_keys($previous_redirects); + + return $request_result; + } + + // private - sends an HTTP request to $url + function _send_request($url,$cookies = false) { + $this->progress(HRP_INFO,"Initiating {$this->method} request for $url"); + if ($this->caching) { + $cachetoken = md5($url.'|'.$this->post_data); + if ($this->_cache_fetch($cachetoken)) return true; + } + + $time_request_start = $this->getmicrotime(); + + $urldata = parse_url($url); + $this->urldata = &$urldata; + $http_host = $urldata['host'] . (isset($urldata['port']) ? ':'.$urldata['port'] : ''); + + if (!isset($urldata["port"]) || !$urldata["port"]) $urldata["port"] = ($urldata["scheme"]=="https") ? 443 : 80; + if (!isset($urldata["path"]) || !$urldata["path"]) $urldata["path"] = '/'; + + if (!empty($urldata['user'])) $this->auth_username = $urldata['user']; + if (!empty($urldata['pass'])) $this->auth_password = $urldata['pass']; + + //echo "Sending HTTP/{$this->version} {$this->method} request for ".$urldata["host"].":".$urldata["port"]." page ".$urldata["path"]."
    "; + + if ($this->version>"1.0") $this->headers["Host"] = $http_host; + if ($this->method=="POST") { + $this->headers["Content-Length"] = strlen($this->post_data); + if (!isset($this->headers["Content-Type"])) $this->headers["Content-Type"] = "application/x-www-form-urlencoded"; + } + + if ( !empty($this->auth_username) || !empty($this->auth_password) ) { + $this->headers['Authorization'] = 'Basic '.base64_encode($this->auth_username.':'.$this->auth_password); + } else { + unset($this->headers['Authorization']); + } + + if (is_array($cookies)) { + $this->response_to_request_cookies($cookies,$urldata); + } + + if (!empty($urldata["query"])) $urldata["path"] .= "?".$urldata["query"]; + $request = $this->method." ".$urldata["path"]." HTTP/".$this->version."\r\n"; + $request .= $this->build_headers(); + $request .= $this->post_data; + + $this->response = ""; + + // clear headers that shouldn't persist across multiple requests + // (we can do this here as we've already built the request, including headers, above) + $per_request_headers = array('Host','Content-Length'); + foreach ($per_request_headers as $k=>$v) unset($this->headers[$v]); + + // Native SSL support requires the OpenSSL extension, and was introduced in PHP 4.3.0 + $php_ssl_support = extension_loaded("openssl") && version_compare(phpversion(),"4.3.0")>=0; + + // if this is a plain HTTP request, or if it's an HTTPS request and OpenSSL support is available, + // natively perform the HTTP request + if ( ( ($urldata["scheme"]=="http") || ($php_ssl_support && ($urldata["scheme"]=="https")) ) && (!$this->force_curl) ) { + $curl_mode = false; + + $hostname = $this->connect_ip ? $this->connect_ip : $urldata['host']; + if ($urldata["scheme"]=="https") $hostname = 'ssl://'.$hostname; + + $time_connect_start = $this->getmicrotime(); + + $this->progress(HRP_INFO,'Opening socket connection to '.$hostname.' port '.$urldata['port']); + + $this->expected_bytes = -1; + $this->received_bytes = 0; + + $fp = @fsockopen ($hostname,$urldata["port"],$errno,$errstr,$this->connect_timeout); + $time_connected = $this->getmicrotime(); + $connect_time = $time_connected - $time_connect_start; + if ($fp) { + if ($this->stream_timeout) stream_set_timeout($fp,$this->stream_timeout); + $this->progress(HRP_INFO,"Connected; sending request"); + + $this->progress(HRP_DEBUG,$request); + fputs ($fp, $request); + $this->raw_request = $request; + + if ($this->stream_timeout) { + $meta = socket_get_status($fp); + if ($meta['timed_out']) { + $this->error = "Exceeded socket write timeout of ".$this->stream_timeout." seconds"; + $this->progress(HRP_ERROR,$this->error); + return false; + } + } + + $this->progress(HRP_INFO,"Request sent; awaiting reply"); + + $headers_received = false; + $data_length = false; + $chunked = false; + $iterations = 0; + while (!feof($fp)) { + if ($data_length>0) { + $line = fread($fp,$data_length); + $this->progress(HRP_DEBUG,"[DL] Got a line: [{$line}] " . gettype($line)); + + if ($line!==false) $data_length -= strlen($line); + } else { + $line = @fgets($fp,10240); + $this->progress(HRP_DEBUG,"[NDL] Got a line: [{$line}] " . gettype($line)); + + if ( ($chunked) && ($line!==false) ) { + $line = trim($line); + if (!strlen($line)) continue; + + list($data_length,) = explode(';',$line,2); + $data_length = (int) hexdec(trim($data_length)); + + if ($data_length==0) { + $this->progress(HRP_DEBUG,"Done"); + // end of chunked data + break; + } + $this->progress(HRP_DEBUG,"Chunk length $data_length (0x$line)"); + continue; + } + } + + if ($line===false) { + $meta = socket_get_status($fp); + if ($meta['timed_out']) { + if ($this->stream_timeout) { + $this->error = "Exceeded socket read timeout of ".$this->stream_timeout." seconds"; + } else { + $this->error = "Exceeded default socket read timeout"; + } + $this->progress(HRP_ERROR,$this->error); + return false; + } else { + $this->progress(HRP_ERROR,'No data but not timed out'); + } + continue; + } + + // check time limits if requested + if ($this->max_time>0) { + if ($this->getmicrotime() - $time_request_start > $this->max_time) { + $this->error = "Exceeded maximum transfer time of ".$this->max_time." seconds"; + $this->progress(HRP_ERROR,$this->error); + return false; + break; + } + } + + $this->response .= $line; + + $iterations++; + if ($headers_received) { + if ($time_connected>0) { + $time_firstdata = $this->getmicrotime(); + $process_time = $time_firstdata - $time_connected; + $time_connected = 0; + } + $this->received_bytes += strlen($line); + if ($iterations % 20 == 0) { + $this->update_transfer_counters(); + } + } + + + // some dumbass webservers don't respect Connection: close and just + // leave the connection open, so we have to be diligent about + // calculating the content length so we can disconnect at the end of + // the response + if ( (!$headers_received) && (trim($line)=="") ) { + $headers_received = true; + $this->progress(HRP_DEBUG,"Got headers: {$this->response}"); + + if (preg_match('/^Content-Length: ([0-9]+)/im',$this->response,$matches)) { + $data_length = (int) $matches[1]; + $this->progress(HRP_DEBUG,"Content length is $data_length"); + $this->expected_bytes = $data_length; + $this->update_transfer_counters(); + } else { + $this->progress(HRP_DEBUG,"No data length specified"); + } + if (preg_match("/^Transfer-Encoding: chunked/im",$this->response,$matches)) { + $chunked = true; + $this->progress(HRP_DEBUG,"Chunked transfer encoding requested"); + } else { + $this->progress(HRP_DEBUG,"CTE not requested"); + } + + if (preg_match_all("/^Set-Cookie: ((.*?)\=(.*?)(?:;\s*(.*))?)$/im",$this->response,$cookielist,PREG_SET_ORDER)) { + foreach ($cookielist as $k=>$cookie) $this->cookie_headers .= $cookie[0]."\n"; + + // get the path for which cookies will be valid if no path is specified + $cookiepath = preg_replace('/\/{2,}/','',$urldata['path']); + if (substr($cookiepath,-1)!='/') { + $cookiepath = explode('/',$cookiepath); + array_pop($cookiepath); + $cookiepath = implode('/',$cookiepath) . '/'; + } + // process each cookie + foreach ($cookielist as $k=>$cookiedata) { + list(,$rawcookie,$name,$value,$attributedata) = $cookiedata; + $attributedata = explode(';',trim($attributedata)); + $attributes = array(); + + $cookie = array( + 'value'=>$value, + 'raw'=>trim($rawcookie), + ); + foreach ($attributedata as $k=>$attribute) { + list($attrname,$attrvalue) = explode('=',trim($attribute)); + $cookie[$attrname] = $attrvalue; + } + + if (!isset($cookie['domain']) || !$cookie['domain']) $cookie['domain'] = $urldata['host']; + if (!isset($cookie['path']) || !$cookie['path']) $cookie['path'] = $cookiepath; + if (isset($cookie['expires']) && $cookie['expires']) $cookie['expires'] = strtotime($cookie['expires']); + + if (!$this->validate_response_cookie($cookie,$urldata['host'])) continue; + + // do not store expired cookies; if one exists, unset it + if ( isset($cookie['expires']) && ($cookie['expires']response_cookies[ $name ][ $cookie['path'] ]); + continue; + } + + $this->response_cookies[ $name ][ $cookie['path'] ] = $cookie; + } + } + } + + if ($this->result_close) { + if (preg_match_all("/HTTP\/([0-9\.]+) ([0-9]+) (.*?)[\r\n]/",$this->response,$matches)) { + $resultcodes = $matches[2]; + foreach ($resultcodes as $k=>$code) { + if ($code!=100) { + $this->progress(HRP_INFO,'HTTP result code received; closing connection'); + + $this->result_code = $code; + $this->result_text = $matches[3][$k]; + fclose($fp); + + return ($this->result_code==200); + } + } + } + } + } + if (feof($fp)) $this->progress(HRP_DEBUG,'EOF on socket'); + @fclose ($fp); + + $this->update_transfer_counters(); + + if (is_array($this->response_cookies)) { + // make sure paths are sorted in the order in which they should be applied + // when setting response cookies + foreach ($this->response_cookies as $name=>$paths) { + ksort($this->response_cookies[$name]); + } + } + $this->progress(HRP_INFO,'Request complete'); + } else { + $this->error = strtoupper($urldata["scheme"])." connection to ".$hostname." port ".$urldata["port"]." failed"; + $this->progress(HRP_ERROR,$this->error); + return false; + } + + // perform an HTTP/HTTPS request using CURL + } elseif ( !$this->disable_curl && ( ($urldata["scheme"]=="https") || ($this->force_curl) ) ) { + $this->progress(HRP_INFO,'Passing HTTP request for $url to CURL'); + $curl_mode = true; + if (!$this->_curl_request($url)) return false; + + // unknown protocol + } else { + $this->error = "Unsupported protocol: ".$urldata["scheme"]; + $this->progress(HRP_ERROR,$this->error); + return false; + } + + $this->raw_response = $this->response; + + $totallength = strlen($this->response); + + do { + $headerlength = strpos($this->response,"\r\n\r\n"); + + $response_headers = explode("\r\n",substr($this->response,0,$headerlength)); + $http_status = trim(array_shift($response_headers)); + foreach ($response_headers as $line) { + list($k,$v) = explode(":",$line,2); + $this->response_headers[trim($k)] = trim($v); + } + $this->response = substr($this->response,$headerlength+4); + + /* // Handled in-transfer now + if (($this->response_headers['Transfer-Encoding']=="chunked") && (!$curl_mode)) { + $this->remove_chunkiness(); + } + */ + + if (!preg_match("/^HTTP\/([0-9\.]+) ([0-9]+) (.*?)$/",$http_status,$matches)) { + $matches = array("",$this->version,0,"HTTP request error"); + } + list (,$response_version,$this->result_code,$this->result_text) = $matches; + + // skip HTTP result code 100 (Continue) responses + } while (($this->result_code==100) && ($headerlength)); + + // record some statistics, roughly compatible with CURL's curl_getinfo() + if (!$curl_mode) { + $total_time = $this->getmicrotime() - $time_request_start; + $transfer_time = $total_time - $connect_time; + $this->stats = array( + "total_time"=>$total_time, + "connect_time"=>$connect_time, // time between connection request and connection established + "process_time"=>$process_time, // time between HTTP request and first data (non-headers) received + "url"=>$url, + "content_type"=>$this->response_headers["Content-Type"], + "http_code"=>$this->result_code, + "header_size"=>$headerlength, + "request_size"=>$totallength, + "filetime"=>strtotime($this->response_headers["Date"]), + "pretransfer_time"=>$connect_time, + "size_download"=>$totallength, + "speed_download"=>$transfer_time > 0 ? round($totallength / $transfer_time) : 0, + "download_content_length"=>$totallength, + "upload_content_length"=>0, + "starttransfer_time"=>$connect_time, + ); + } + + + $ok = ($this->result_code==200); + if ($ok) { + // if a page preprocessor is defined, call it to process the page contents + if (is_callable($this->page_preprocessor)) $this->response = call_user_func($this->page_preprocessor,$this,$this->response); + + // if caching is enabled, save the page + if ($this->caching) $this->_cache_store($cachetoken,$url); + } + + return $ok; + } + + function validate_response_cookie($cookie,$actual_hostname) { + // make sure the cookie can't be set for a TLD, eg: '.com' + $cookiehost = $cookie['domain']; + $p = strrpos($cookiehost,'.'); + if ($p===false) return false; + + $tld = strtolower(substr($cookiehost,$p+1)); + $special_domains = array("com", "edu", "net", "org", "gov", "mil", "int"); + $periods_required = in_array($tld,$special_domains) ? 1 : 2; + + $periods = substr_count($cookiehost,'.'); + if ($periods<$periods_required) return false; + + if (substr($actual_hostname,0,1)!='.') $actual_hostname = '.'.$actual_hostname; + if (substr($cookiehost,0,1)!='.') $cookiehost = '.'.$cookiehost; + $domain_match = ( + ($actual_hostname==$cookiehost) || + (substr($actual_hostname,-strlen($cookiehost))==$cookiehost) + ); + + return $domain_match; + + } + + function build_headers() { + $headers = ""; + foreach ($this->headers as $name=>$value) { + $value = trim($value); + if (empty($value)) continue; + $headers .= "{$name}: {$value}\r\n"; + } + + if (isset($this->request_cookies) && is_array($this->request_cookies)) { + $cookielist = array(); + foreach ($this->request_cookies as $name=>$value) { + $cookielist[] = "{$name}={$value}"; + } + if (count($cookielist)) $headers .= "Cookie: ".implode('; ',$cookielist)."\r\n"; + } + + + $headers .= "\r\n"; + + return $headers; + } + + // opposite of parse_url() + function rebuild_url($urlinfo) { + $url = $urlinfo['scheme'].'://'; + + if ($urlinfo['user'] || $urlinfo['pass']) { + $url .= $urlinfo['user']; + if ($urlinfo['pass']) { + if ($urlinfo['user']) $url .= ':'; + $url .= $urlinfo['pass']; + } + $url .= '@'; + } + + $url .= $urlinfo['host']; + if ($urlinfo['port']) $url .= ':'.$urlinfo['port']; + + $url .= $urlinfo['path']; + + if ($urlinfo['query']) $url .= '?'.$urlinfo['query']; + if ($urlinfo['fragment']) $url .= '#'.$urlinfo['fragment']; + + return $url; + } + + function _replace_hostname(&$url,$new_hostname) { + $parts = parse_url($url); + $old_hostname = $parts['host']; + + $parts['host'] = $new_hostname; + + $url = $this->rebuild_url($parts); + + return $old_hostname; + } + + function _curl_request($url) { + $this->error = false; + + // if a direct connection IP address was specified, replace the hostname + // in the URL with the IP address, and set the Host: header to the + // original hostname + if ($this->connect_ip) { + $old_hostname = $this->_replace_hostname($url,$this->connect_ip); + $this->headers["Host"] = $old_hostname; + } + + + unset($this->headers["Content-Length"]); + $headers = explode("\n",$this->build_headers()); + + $ch = curl_init(); + curl_setopt($ch,CURLOPT_URL, $url); + curl_setopt($ch,CURLOPT_USERAGENT, $this->headers["User-Agent"]); + curl_setopt($ch,CURLOPT_HEADER, 1); + curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1); +// curl_setopt($ch,CURLOPT_FOLLOWLOCATION, 1); // native method doesn't support this yet, so it's disabled for consistency + curl_setopt($ch,CURLOPT_TIMEOUT, 10); + if ($this->curl_proxy) { + curl_setopt($ch,CURLOPT_PROXY,$this->curl_proxy); + } + curl_setopt($ch,CURLOPT_HTTPHEADER, $headers); + + if ($this->method=="POST") { + curl_setopt($ch,CURLOPT_POST,1); + curl_setopt($ch,CURLOPT_POSTFIELDS,$this->post_data); + } + if ($this->insecure_ssl) { + curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0); + } + if ($this->ignore_ssl_hostname) { + curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,1); + } + + $this->response = curl_exec ($ch); + if (curl_errno($ch)!=0) { + $this->error = "CURL error #".curl_errno($ch).": ".curl_error($ch); + } + + $this->stats = curl_getinfo($ch); + curl_close($ch); + + return ($this->error === false); + } + + function progress($level,$msg) { + if (is_callable($this->progress_callback)) call_user_func($this->progress_callback,$level,$msg); + } + + // Gets any available HTTPRetriever error message (including both internal + // errors and HTTP errors) + function get_error() { + return $this->error ? $this->error : 'HTTP ' . $this->result_code.': '.$this->result_text; + } + + function get_content_type() { + if (!$ctype = $this->response_headers['Content-Type']) { + $ctype = $this->response_headers['Content-type']; + } + list($ctype,) = explode(';',$ctype); + + return strtolower($ctype); + } + + function update_transfer_counters() { + if (is_callable($this->transfer_callback)) call_user_func($this->transfer_callback,$this->received_bytes,$this->expected_bytes); + } + + function set_transfer_display($enabled = true) { + if ($enabled) { + $this->transfer_callback = array(&$this,'default_transfer_callback'); + } else { + unset($this->transfer_callback); + } + } + + function set_progress_display($enabled = true) { + if ($enabled) { + $this->progress_callback = array(&$this,'default_progress_callback'); + } else { + unset($this->progress_callback); + } + } + + function default_progress_callback($severity,$message) { + $severities = array( + HRP_DEBUG=>'debug', + HRP_INFO=>'info', + HRP_ERROR=>'error', + ); + + echo date('Y-m-d H:i:sa').' ['.$severities[$severity].'] '.$message."\n"; + flush(); + } + + function default_transfer_callback($transferred,$expected) { + $msg = "Transferred " . round($transferred/1024,1); + if ($expected>=0) $msg .= "/" . round($expected/1024,1); + $msg .= "KB"; + if ($expected>0) $msg .= " (".round($transferred*100/$expected,1)."%)"; + echo date('Y-m-d H:i:sa')." $msg\n"; + flush(); + } + + function getmicrotime() { + list($usec, $sec) = explode(" ",microtime()); + return ((float)$usec + (float)$sec); + } +} +?> diff --git a/modules/member/openid_lib/libcurlemu.inc.php b/modules/member/openid_lib/libcurlemu.inc.php new file mode 100755 index 000000000..4488e962b --- /dev/null +++ b/modules/member/openid_lib/libcurlemu.inc.php @@ -0,0 +1,111 @@ + diff --git a/modules/member/openid_lib/libcurlexternal.inc.php b/modules/member/openid_lib/libcurlexternal.inc.php new file mode 100755 index 000000000..f0e8d23ad --- /dev/null +++ b/modules/member/openid_lib/libcurlexternal.inc.php @@ -0,0 +1,637 @@ +$v) { + if ( (substr($k,0,8)=="CURLOPT_") && ($v==$curlopt)) return $k; + } + return false; +} + +// Initialize a CURL emulation session +function curl_init($url=false) { + $i = $GLOBALS["_CURLEXT_OPT"]["index"]++; + $GLOBALS["_CURLEXT_OPT"][$i] = array("url"=>$url); + + return $i; +} + +// Set an option for a CURL emulation transfer +function curl_setopt($ch,$option,$value) { + + $opt = &$GLOBALS["_CURLEXT_OPT"][$ch]; + if (!$opt["args"]) $opt["args"] = array(); + $args = &$opt["args"]; + if (!$opt["settings"]) $opt["settings"] = array(); + $settings = &$opt["settings"]; + + switch($option) { + case CURLOPT_URL: + $opt["url"] = $value; + break; + case CURLOPT_VERBOSE: + $opt["verbose"] = $value>0; + break; + case CURLOPT_USERPWD: + if ($value==="") $value = false; + $settings["user"] = $value; + break; + case CURLOPT_PROXYUSERPWD: + if ($value==="") $value = false; + $settings["proxy-user"] = $value; + break; + case CURLOPT_COOKIE: + if ($value==="") $value = false; + if ( is_bool($value) || (strpos($value,"=")!==false) ) $settings["cookie"] = $value; + break; + case CURLOPT_COOKIEFILE: + if ($value==="") $value = false; + $settings["cookie"] = $value; + break; + case CURLOPT_COOKIEJAR: + if ($value==="") $value = false; + $settings["cookie-jar"] = $value; + break; + case CURLOPT_CUSTOMREQUEST: + if ($value==="") $value = false; + $settings["request"] = $value; + break; + case CURLOPT_PROXY: + if ($value==="") $value = false; + $settings["proxy"] = $value; + break; + case CURLOPT_INTERFACE: + if ($value==="") $value = false; + $settings["interface"] = $value; + break; + case CURLOPT_KRB4LEVEL: + if ($value==="") $value = false; + $settings["krb4"] = $value; + break; + case CURLOPT_SSLCERT: + $pass = ""; + if (is_string($settings["cert"])) { + list(,$pass) = explode(":",$settings["cert"]); + if (strlen($pass)) $pass = ":$pass"; + } + $settings["cert"] = $value.$pass; + break; + case CURLOPT_SSLCERTPASSWD: + $filename = ""; + if (is_string($settings["cert"])) { + list($filename,) = explode(":",$settings["cert"]); + } + $settings["cert"] = $filename.":".$value; + break; + case CURLOPT_RANGE: + if ($value==="") $value = false; + $settings["range"] = $value; + break; + case CURLOPT_REFERER: + if ($value==="") $value = false; + $settings["referer"] = $value; + break; + case CURLOPT_NOBODY: + $settings["head"] = $value>0; + break; + case CURLOPT_FAILONERROR: + $opt["fail_on_error"] = $value>0; + break; + case CURLOPT_USERAGENT: + $settings["user-agent"] = $value; + break; + case CURLOPT_HEADER: + $settings["include"] = $value>0; + break; + case CURLOPT_RETURNTRANSFER: + $opt["return_transfer"] = $value>0; + break; + case CURLOPT_TIMEOUT: + $settings["max-time"] = (int) $value; + break; + case CURLOPT_HTTPHEADER: + reset($value); + foreach ($value as $k=>$header) $args[] = "header=".$header; + break; + case CURLOPT_POST: + $settings["data"]["enabled"] = $value>0; + break; + case CURLOPT_POSTFIELDS: + if ($value==="") $value = false; + $settings["data"]["value"] = $value; + break; + case CURLOPT_SSL_VERIFYPEER: + $settings["insecure"] = ($value==0); + break; + case CURLOPT_SSL_VERIFYHOST: + // not supported by the commandline client + break; + case CURLOPT_FOLLOWLOCATION: + $settings["location"] = $value>0; + break; + case CURLOPT_PUT: + $settings["upload-file"]["enabled"] = $value>0; + break; + case CURLOPT_INFILE: + if ($value==="") $value = false; + + if (is_resource($value)) { + + // Ugh, this is a terrible hack. The CURL extension accepts a file handle, but + // the CURL binary obviously wants a filename. Since you can't derive a filename + // from a file handle, we have to make a copy of the file from the file handle, + // then pass the temporary filename to the CURL binary. + + $tmpfilename = tempnam("/tmp","cif"); + $fp = @fopen($tmpfilename,"w"); + if (!$fp) { + trigger_error("CURL emulation library could not create a temporary file for CURLOPT_INFILE; upload aborted",E_USER_WARNING); + } else { + while (!feof($value)) { + $contents = fread($value,8192); + fwrite($fp,$contents); + } + fclose($fp); + // if a temporary file was previously created, unlink it + if ($settings["upload-file"]["value"] && file_exists($settings["upload-file"]["value"])) unlink($settings["upload-file"]["value"]); + + // set the new upload-file filename + $settings["upload-file"]["value"] = $tmpfilename; + } + } else { + trigger_error("CURLOPT_INFILE must specify a valid file resource",E_USER_WARNING); + } + + break; + case CURLOPT_MUTE: + // we're already mute, no? + break; + case CURLOPT_LOW_SPEED_LIMIT: + $settings["speed-limit"] = (int) $value; + break; + case CURLOPT_LOW_SPEED_TIME: + $settings["speed-time"] = (int) $value; + break; + case CURLOPT_RESUME_FROM: + $settings["continue-at"] = (int) $value; + break; + case CURLOPT_CAINFO: + if ($value==="") $value = false; + $settings["cacert"] = $value; + break; + case CURLOPT_SSLVERSION: + $value = (int) $value; + switch($value) { + case 2: + case 3: + unset($settings["sslv2"]); + unset($settings["sslv3"]); + $settings["sslv".$value] = true; + break; + } + break; + case CURLOPT_TIMECONDITION: + // untested - I'm lazy :) + if (!isset($settings["time-cond"]["enabled"])) $settings["time-cond"]["enabled"] = false; + if (!$settings["time-cond"]["value"]) $settings["time-cond"]["value"] = 1; + + $settings["time-cond"]["value"] = abs($settings["time-cond"]["value"]); + if ($value==TIMECOND_ISUNMODSINCE) { + $settings["time-cond"]["value"] *= -1; + } + + break; + case CURLOPT_TIMEVALUE: + // untested - I'm lazy :) + if ($settings["time-cond"]["value"]) { + $sign = $settings["time-cond"]["value"] / abs($settings["time-cond"]["value"]); + } else { + $sign = 1; + } + $settings["time-cond"]["value"] = (int) $value * $sign; + break; + case CURLOPT_FILE: + if (is_resource($value)) { + $opt["output_handle"] = $value; + } else { + trigger_error("CURLOPT_FILE must specify a valid file resource",E_USER_WARNING); + } + break; + case CURLOPT_WRITEHEADER: + if (is_resource($value)) { + $opt["header_handle"] = $value; + } else { + trigger_error("CURLOPT_WRITEHEADER must specify a valid file resource",E_USER_WARNING); + } + break; + case CURLOPT_STDERR: + // not implemented for now - not really relevant + break; + // FTP stuff not implemented + case CURLOPT_QUOTE: + case CURLOPT_POSTQUOTE: + case CURLOPT_UPLOAD: + case CURLOPT_FTPLISTONLY: + case CURLOPT_FTPAPPEND: + case CURLOPT_FTPPORT: + // Other stuff not implemented + case CURLOPT_NETRC: + default: + trigger_error("CURL emulation does not implement CURL option "._curlopt_name($option),E_USER_WARNING); + break; + } +} + +// Perform a CURL emulation session +function curl_exec($ch) { + $opt = &$GLOBALS["_CURLEXT_OPT"][$ch]; + $url = $opt["url"]; + $verbose = $opt["verbose"]; + + // ask commandline CURL to return its statistics at the end of its output + $opt["settings"]["write-out"] = "%{http_code}|%{time_total}|%{time_namelookup}|%{time_connect}|%{time_pretransfer}|%{time_starttransfer}|%{size_download}|%{size_upload}|%{size_header}|%{size_request}|%{speed_download}|%{speed_upload}|||||||%{content_type}|%{url_effective}"; + $writeout_order = array( + CURLINFO_HTTP_CODE, + CURLINFO_TOTAL_TIME, + CURLINFO_NAMELOOKUP_TIME, + CURLINFO_CONNECT_TIME, + CURLINFO_PRETRANSFER_TIME, + CURLINFO_STARTTRANSFER_TIME, + CURLINFO_SIZE_DOWNLOAD, + CURLINFO_SIZE_UPLOAD, + CURLINFO_HEADER_SIZE, + CURLINFO_REQUEST_SIZE, + CURLINFO_SPEED_DOWNLOAD, + CURLINFO_SPEED_UPLOAD, + + // the following 5 items are not provided by commandline CURL, and thus are left empty + CURLINFO_FILETIME, + CURLINFO_REDIRECT_TIME, + CURLINFO_SSL_VERIFYRESULT, + CURLINFO_CONTENT_LENGTH_DOWNLOAD, + CURLINFO_CONTENT_LENGTH_UPLOAD, + CURLINFO_REDIRECT_COUNT, + + CURLINFO_CONTENT_TYPE, + CURLINFO_EFFECTIVE_URL, + ); + + // if the CURLOPT_NOBODY option was specified (to remove the body from the output), + // but an output file handle was set, we need to tell CURL to return the body so + // that we can write it to the output handle and strip it from the output + if ($opt["settings"]["head"] && $opt["output_handle"]) { + unset($opt["settings"]["head"]); + $strip_body = true; + } + // if the CURLOPT_HEADER option was NOT specified, but a header file handle was + // specified, we again need to tell CURL to return the headers so we can write + // them, then strip them from the output + if (!isset($opt["settings"]["include"]) && isset($opt["header_handle"])) { + $opt["settings"]["include"] = true; + $strip_headers = true; + } + + // build the CURL argument list + $arguments = ""; + foreach ($opt["args"] as $k=>$arg) { + list($argname,$argval) = explode('=',$arg,2); + $arguments .= "--$argname ".escapeshellarg($argval)." "; + } + foreach ($opt["settings"] as $argname=>$argval) { + if (is_array($argval)) { + if (isset($argval["enabled"]) && !$argval["enabled"]) continue; + $argval = $argval["value"]; + } + if ($argval===false) continue; + if (is_bool($argval)) $argval = ""; + $arguments .= "--$argname ".escapeshellarg($argval)." "; + } + + // build the CURL commandline and execute it + $cmd = CURL_PATH." ".$arguments." ".escapeshellarg($url); + + if ($verbose) echo "libcurlemu: Executing: $cmd\n"; + exec($cmd,$output,$ret); + + if ($verbose) { + echo "libcurlemu: Result: "; + var_dump($output); + echo "libcurlemu: Exit code: $ret\n"; + } + + // check for errors + $opt["errno"] = $ret; + if ($ret) $opt["error"] = "CURL error #$ret"; + + // die if CURLOPT_FAILONERROR is set and the HTTP result code is greater than 300 + if ($opt["fail_on_error"]) { + if (preg_match("/^HTTP\/1.[0-9]+ ([0-9]{3}) /",$output[0],$matches)) { + $resultcode = (int) $matches[1]; + if ($resultcode>300) die; + } else { + die; // couldn't get result code! + } + } + + // pull the statistics out from the output + $stats = explode('|',array_pop($output)); + foreach ($writeout_order as $k=>$item) { + $opt["stats"][$item] = $stats[$k]; + } + + // build the response string + $output = implode("\r\n",$output); + + + // find the header end position if needed + if ($strip_headers || $strip_body || isset($opt["header_handle"])) { + $headerpos = strpos($output,"\r\n\r\n"); + } + + // if a file handle was provided for header output, extract the headers + // and write them to the handle + if (isset($opt["header_handle"])) { + $headers = substr($output,0,$headerpos); + fwrite($opt["header_handle"],$headers); + } + + // if the caller did not request headers in the output, strip them + if ($strip_headers) { + $output = substr($output,$headerpos+4); + } + + // if the caller did not request the response body in the output, strip it + if ($strip_body) { + if ($strip_headers) { + $body = $output; + $output = ""; + } else { + $body = substr($output,$headerpos+4); + $output = substr($output,0,$headerpos); + } + } + + // if a file handle was provided for output, write the output to it + if (isset($opt["output_handle"])) { + fwrite($opt["output_handle"],$output); + + // if the caller requested that the response be returned, return it + } elseif ($opt["return_transfer"]) { + return $output; + + // otherwise, just echo the output to stdout + } else { + echo $output; + } + return true; +} + +function curl_close($ch) { + $opt = &$GLOBALS["_CURLEXT_OPT"][$ch]; + + if ($opt["settings"]) { + $settings = &$opt["settings"]; + // if the user used CURLOPT_INFILE to specify a file to upload, remove the + // temporary file created for the CURL binary + if ($settings["upload-file"]["value"] && file_exists($settings["upload-file"]["value"])) unlink($settings["upload-file"]["value"]); + } + + unset($GLOBALS["_CURLEXT_OPT"][$ch]); +} + +function curl_errno($ch) { + return (int) $GLOBALS["_CURLEXT_OPT"][$ch]["errno"]; +} + +function curl_error($ch) { + return $GLOBALS["_CURLEXT_OPT"][$ch]["error"]; +} + +function curl_getinfo($ch,$opt=NULL) { + if ($opt) { + return $GLOBALS["_CURLEXT_OPT"][$ch]["stats"][$opt]; + } else { + $curlinfo_tags = array( + "url"=>CURLINFO_EFFECTIVE_URL, + "content_type"=>CURLINFO_CONTENT_TYPE, + "http_code"=>CURLINFO_HTTP_CODE, + "header_size"=>CURLINFO_HEADER_SIZE, + "request_size"=>CURLINFO_REQUEST_SIZE, + "filetime"=>CURLINFO_FILETIME, + "ssl_verify_result"=>CURLINFO_SSL_VERIFYRESULT, + "redirect_count"=>CURLINFO_REDIRECT_COUNT, + "total_time"=>CURLINFO_TOTAL_TIME, + "namelookup_time"=>CURLINFO_NAMELOOKUP_TIME, + "connect_time"=>CURLINFO_CONNECT_TIME, + "pretransfer_time"=>CURLINFO_PRETRANSFER_TIME, + "size_upload"=>CURLINFO_SIZE_UPLOAD, + "size_download"=>CURLINFO_SIZE_DOWNLOAD, + "speed_download"=>CURLINFO_SPEED_DOWNLOAD, + "speed_upload"=>CURLINFO_SPEED_UPLOAD, + "download_content_length"=>CURLINFO_CONTENT_LENGTH_DOWNLOAD, + "upload_content_length"=>CURLINFO_CONTENT_LENGTH_UPLOAD, + "starttransfer_time"=>CURLINFO_STARTTRANSFER_TIME, + "redirect_time"=>CURLINFO_REDIRECT_TIME + ); + $res = array(); + foreach ($curlinfo_tags as $tag=>$opt) { + $res[$tag] = $GLOBALS["_CURLEXT_OPT"][$ch]["stats"][$opt]; + } + return $res; + } +} + +function curl_version() { + return "libcurlemu/".CURLEXT_VERSION."-ext"; +} + +} +?> \ No newline at end of file diff --git a/modules/member/openid_lib/libcurlnative.inc.php b/modules/member/openid_lib/libcurlnative.inc.php new file mode 100755 index 000000000..d1c3884a3 --- /dev/null +++ b/modules/member/openid_lib/libcurlnative.inc.php @@ -0,0 +1,453 @@ +$v) { + if ( (substr($k,0,8)=="CURLOPT_") && ($v==$curlopt)) return $k; + } + return false; +} + +// Initialize a CURL emulation session +function curl_init() { + $i = $GLOBALS["_CURLNAT_OPT"]["index"]++; + $GLOBALS["_CURLNAT_OPT"][$i] = array(); + $GLOBALS["_CURLNAT_OPT"][$i]["http"] = &new HTTPRetriever(); + $GLOBALS["_CURLNAT_OPT"][$i]["include_body"] = true; + return $i; +} + +// Set an option for a CURL emulation transfer +function curl_setopt($ch,$option,$value) { + + $opt = &$GLOBALS["_CURLNAT_OPT"][$ch]; + if (!$opt["args"]) $opt["args"] = array(); + $args = &$opt["args"]; + if (!$opt["settings"]) $opt["settings"] = array(); + $settings = &$opt["settings"]; + $http = &$opt["http"]; + + switch($option) { + case CURLOPT_URL: + $opt["url"] = $value; + break; + case CURLOPT_CUSTOMREQUEST: + $opt["method"] = $value; + break; + case CURLOPT_REFERER: + $http->headers["Referer"] = $value; + break; + case CURLOPT_NOBODY: + $opt["include_body"] = $value==0; + break; + case CURLOPT_FAILONERROR: + $opt["fail_on_error"] = $value>0; + break; + case CURLOPT_USERAGENT: + $http->headers["User-Agent"] = $value; + break; + case CURLOPT_HEADER: + $opt["include_headers"] = $value>0; + break; + case CURLOPT_RETURNTRANSFER: + $opt["return_transfer"] = $value>0; + break; + case CURLOPT_TIMEOUT: + $opt["max-time"] = (int) $value; + break; + case CURLOPT_HTTPHEADER: + reset($value); + foreach ($value as $k=>$header) { + list($headername,$headervalue) = explode(":",$header); + $http->headers[$headername] = ltrim($headervalue); + } + break; + case CURLOPT_POST: + $opt["post"] = $value>0; + break; + case CURLOPT_POSTFIELDS: + $opt["postdata"] = $value; + break; + case CURLOPT_MUTE: + // we're already mute, no? + break; + case CURLOPT_FILE: + if (is_resource($value)) { + $opt["output_handle"] = $value; + } else { + trigger_error("CURLOPT_FILE must specify a valid file resource",E_USER_WARNING); + } + break; + case CURLOPT_WRITEHEADER: + if (is_resource($value)) { + $opt["header_handle"] = $value; + } else { + trigger_error("CURLOPT_WRITEHEADER must specify a valid file resource",E_USER_WARNING); + } + break; + case CURLOPT_STDERR: + // not implemented for now - not really relevant + break; + + case CURLOPT_SSL_VERIFYPEER: + case CURLOPT_SSL_VERIFYHOST: + // these are automatically disabled using ssl:// anyway + break; + + case CURLOPT_USERPWD: + list($curl_user,$curl_pass) = explode(':',$value,2); + $http->auth_username = $curl_user; + $http->auth_password = $curl_pass; + break; + + // Important stuff not implemented (as it's not yet supported by HTTPRetriever) + case CURLOPT_PUT: + case CURLOPT_INFILE: + case CURLOPT_FOLLOWLOCATION: + case CURLOPT_PROXYUSERPWD: + case CURLOPT_COOKIE: + case CURLOPT_COOKIEFILE: + case CURLOPT_PROXY: + case CURLOPT_RANGE: + case CURLOPT_RESUME_FROM: + + // Things that cannot (reasonably) be implemented here + case CURLOPT_LOW_SPEED_LIMIT: + case CURLOPT_LOW_SPEED_TIME: + case CURLOPT_KRB4LEVEL: + case CURLOPT_SSLCERT: + case CURLOPT_SSLCERTPASSWD: + case CURLOPT_SSLVERSION: + case CURLOPT_INTERFACE: + case CURLOPT_CAINFO: + case CURLOPT_TIMECONDITION: + case CURLOPT_TIMEVALUE: + + // FTP stuff not implemented + case CURLOPT_QUOTE: + case CURLOPT_POSTQUOTE: + case CURLOPT_UPLOAD: + case CURLOPT_FTPLISTONLY: + case CURLOPT_FTPAPPEND: + case CURLOPT_FTPPORT: + + // Other stuff not implemented + case CURLOPT_VERBOSE: + case CURLOPT_NETRC: + default: + //trigger_error("CURL emulation does not implement CURL option "._curlopt_name($option),E_USER_WARNING); + break; + } +} + +// Perform a CURL emulation session +function curl_exec($ch) { + $opt = &$GLOBALS["_CURLNAT_OPT"][$ch]; + $url = $opt["url"]; + + $http = &$opt["http"]; + $http->disable_curl = true; // avoid problems with recursion, since we *ARE* CURL + + // set time limits if requested + if ($opt["max-time"]) { + $http->connect_timeout = $opt["max-time"]; + $http->max_time = $opt["max-time"]; + } + + if ($opt["post"]) { + $res = $http->post($url,$opt["postdata"]); + } elseif ($opt["method"]) { + $res = $http->custom($opt["method"],$url,$opt["postdata"]); + } else { + $res = $http->get($url); + } + + // check for errors + $opt["errno"] = (!$res && $http->error) ? 1 : 0; + if ($opt["errno"]) $opt["error"] = $http->error; + + // die if CURLOPT_FAILONERROR is set and the HTTP result code is greater than 300 + if ($opt["fail_on_error"]) { + if ($http->result_code>300) die; + } + + $opt["stats"] = $http->stats; + + + $headers = ""; + foreach ($http->response_headers as $k=>$v) { + $headers .= "$k: $v\r\n"; + } + + // if a file handle was provided for header output, extract the headers + // and write them to the handle + if (isset($opt["header_handle"])) { + fwrite($opt["header_handle"],$headers); + } + + $output = ($opt["include_headers"] ? $headers."\r\n" : "") . ($opt["include_body"] ? $http->response : ""); + + // if a file handle was provided for output, write the output to it + if (isset($opt["output_handle"])) { + fwrite($opt["output_handle"],$output); + + // if the caller requested that the response be returned, return it + } elseif ($opt["return_transfer"]) { + return $output; + + // otherwise, just echo the output to stdout + } else { + echo $output; + } + return true; +} + +function curl_close($ch) { + $opt = &$GLOBALS["_CURLNAT_OPT"][$ch]; + + if ($opt["settings"]) { + $settings = &$opt["settings"]; + // if the user used CURLOPT_INFILE to specify a file to upload, remove the + // temporary file created for the CURL binary + if ($settings["upload-file"]["value"] && file_exists($settings["upload-file"]["value"])) unlink($settings["upload-file"]["value"]); + } + + unset($GLOBALS["_CURLNAT_OPT"][$ch]); +} + +function curl_errno($ch) { + return (int) $GLOBALS["_CURLNAT_OPT"][$ch]["errno"]; +} + +function curl_error($ch) { + return $GLOBALS["_CURLNAT_OPT"][$ch]["error"]; +} + +function curl_getinfo($ch,$opt=NULL) { + if ($opt) { + $curlinfo_tags = array( + CURLINFO_EFFECTIVE_URL=>"url", + CURLINFO_CONTENT_TYPE=>"content_type", + CURLINFO_HTTP_CODE=>"http_code", + CURLINFO_HEADER_SIZE=>"header_size", + CURLINFO_REQUEST_SIZE=>"request_size", + CURLINFO_FILETIME=>"filetime", + CURLINFO_SSL_VERIFYRESULT=>"ssl_verify_result", + CURLINFO_REDIRECT_COUNT=>"redirect_count", + CURLINFO_TOTAL_TIME=>"total_time", + CURLINFO_NAMELOOKUP_TIME=>"namelookup_time", + CURLINFO_CONNECT_TIME=>"connect_time", + CURLINFO_PRETRANSFER_TIME=>"pretransfer_time", + CURLINFO_SIZE_UPLOAD=>"size_upload", + CURLINFO_SIZE_DOWNLOAD=>"size_download", + CURLINFO_SPEED_DOWNLOAD=>"speed_download", + CURLINFO_SPEED_UPLOAD=>"speed_upload", + CURLINFO_CONTENT_LENGTH_DOWNLOAD=>"download_content_length", + CURLINFO_CONTENT_LENGTH_UPLOAD=>"upload_content_length", + CURLINFO_STARTTRANSFER_TIME=>"starttransfer_time", + CURLINFO_REDIRECT_TIME=>"redirect_time" + ); + + $key = $curlinfo_tags[$opt]; + return $GLOBALS["_CURLNAT_OPT"][$ch]["stats"][$key]; + } else { + return $GLOBALS["_CURLNAT_OPT"][$ch]["stats"]; + } +} + +function curl_version() { + return "libcurlemu/".CURLNAT_VERSION."-nat"; +} + +} +?> diff --git a/modules/member/queries/addFriend.xml b/modules/member/queries/addFriend.xml new file mode 100644 index 000000000..1914f8be7 --- /dev/null +++ b/modules/member/queries/addFriend.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/modules/member/queries/addFriendGroup.xml b/modules/member/queries/addFriendGroup.xml new file mode 100644 index 000000000..f03307dc6 --- /dev/null +++ b/modules/member/queries/addFriendGroup.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/member/queries/addMemberToGroup.xml b/modules/member/queries/addMemberToGroup.xml new file mode 100644 index 000000000..11b497e3c --- /dev/null +++ b/modules/member/queries/addMemberToGroup.xml @@ -0,0 +1,10 @@ + + +
    + + + + + + + diff --git a/modules/member/queries/addScrapDocument.xml b/modules/member/queries/addScrapDocument.xml new file mode 100644 index 000000000..9d8045350 --- /dev/null +++ b/modules/member/queries/addScrapDocument.xml @@ -0,0 +1,16 @@ + + +
    + + + + + + + + + + + + + diff --git a/modules/member/queries/changeGroup.xml b/modules/member/queries/changeGroup.xml new file mode 100644 index 000000000..fd43cc6f0 --- /dev/null +++ b/modules/member/queries/changeGroup.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/member/queries/chkDeniedID.xml b/modules/member/queries/chkDeniedID.xml new file mode 100644 index 000000000..5a4542e74 --- /dev/null +++ b/modules/member/queries/chkDeniedID.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/member/queries/deleteDeniedID.xml b/modules/member/queries/deleteDeniedID.xml new file mode 100644 index 000000000..cb4ecad2e --- /dev/null +++ b/modules/member/queries/deleteDeniedID.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/member/queries/deleteFriend.xml b/modules/member/queries/deleteFriend.xml new file mode 100644 index 000000000..32f5f5ba4 --- /dev/null +++ b/modules/member/queries/deleteFriend.xml @@ -0,0 +1,9 @@ + + +
    + + + + + + diff --git a/modules/member/queries/deleteFriendGroup.xml b/modules/member/queries/deleteFriendGroup.xml new file mode 100644 index 000000000..3b3df66a4 --- /dev/null +++ b/modules/member/queries/deleteFriendGroup.xml @@ -0,0 +1,9 @@ + + +
    + + + + + + diff --git a/modules/member/queries/deleteGroup.xml b/modules/member/queries/deleteGroup.xml new file mode 100644 index 000000000..da2c17064 --- /dev/null +++ b/modules/member/queries/deleteGroup.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/member/queries/deleteJoinForm.xml b/modules/member/queries/deleteJoinForm.xml new file mode 100644 index 000000000..6f0723685 --- /dev/null +++ b/modules/member/queries/deleteJoinForm.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/member/queries/deleteMember.xml b/modules/member/queries/deleteMember.xml new file mode 100644 index 000000000..9f66db1ff --- /dev/null +++ b/modules/member/queries/deleteMember.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/member/queries/deleteMemberGroupMember.xml b/modules/member/queries/deleteMemberGroupMember.xml new file mode 100644 index 000000000..f238e0148 --- /dev/null +++ b/modules/member/queries/deleteMemberGroupMember.xml @@ -0,0 +1,9 @@ + + +
    + + + + + + diff --git a/modules/member/queries/deleteMessage.xml b/modules/member/queries/deleteMessage.xml new file mode 100644 index 000000000..c579eb3ec --- /dev/null +++ b/modules/member/queries/deleteMessage.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/member/queries/deleteMessages.xml b/modules/member/queries/deleteMessages.xml new file mode 100644 index 000000000..579d0c329 --- /dev/null +++ b/modules/member/queries/deleteMessages.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/member/queries/deleteScrapDocument.xml b/modules/member/queries/deleteScrapDocument.xml new file mode 100644 index 000000000..419d84436 --- /dev/null +++ b/modules/member/queries/deleteScrapDocument.xml @@ -0,0 +1,9 @@ + + +
    + + + + + + diff --git a/modules/member/queries/getAdminGroup.xml b/modules/member/queries/getAdminGroup.xml new file mode 100644 index 000000000..9eb2b2644 --- /dev/null +++ b/modules/member/queries/getAdminGroup.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/member/queries/getDefaultGroup.xml b/modules/member/queries/getDefaultGroup.xml new file mode 100644 index 000000000..f648ec745 --- /dev/null +++ b/modules/member/queries/getDefaultGroup.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/member/queries/getDeniedIDList.xml b/modules/member/queries/getDeniedIDList.xml new file mode 100644 index 000000000..494e5ea5e --- /dev/null +++ b/modules/member/queries/getDeniedIDList.xml @@ -0,0 +1,14 @@ + + +
    + + + + + + + + + + + diff --git a/modules/member/queries/getFriendGroup.xml b/modules/member/queries/getFriendGroup.xml new file mode 100644 index 000000000..372996035 --- /dev/null +++ b/modules/member/queries/getFriendGroup.xml @@ -0,0 +1,12 @@ + + +
    + + + + + + + + + diff --git a/modules/member/queries/getFriendGroups.xml b/modules/member/queries/getFriendGroups.xml new file mode 100644 index 000000000..6c649088a --- /dev/null +++ b/modules/member/queries/getFriendGroups.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/member/queries/getFriends.xml b/modules/member/queries/getFriends.xml new file mode 100644 index 000000000..c98e6c001 --- /dev/null +++ b/modules/member/queries/getFriends.xml @@ -0,0 +1,20 @@ + + +
    +
    + + + + + + + + + + + + + + + + diff --git a/modules/member/queries/getGroup.xml b/modules/member/queries/getGroup.xml new file mode 100644 index 000000000..58875e091 --- /dev/null +++ b/modules/member/queries/getGroup.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/member/queries/getGroups.xml b/modules/member/queries/getGroups.xml new file mode 100644 index 000000000..12f605d57 --- /dev/null +++ b/modules/member/queries/getGroups.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/member/queries/getJoinForm.xml b/modules/member/queries/getJoinForm.xml new file mode 100644 index 000000000..159b27dae --- /dev/null +++ b/modules/member/queries/getJoinForm.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/member/queries/getJoinFormList.xml b/modules/member/queries/getJoinFormList.xml new file mode 100644 index 000000000..66cae3d86 --- /dev/null +++ b/modules/member/queries/getJoinFormList.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/member/queries/getMemberGroups.xml b/modules/member/queries/getMemberGroups.xml new file mode 100644 index 000000000..853a08780 --- /dev/null +++ b/modules/member/queries/getMemberGroups.xml @@ -0,0 +1,14 @@ + + +
    +
    + + + + + + + + + + diff --git a/modules/member/queries/getMemberInfo.xml b/modules/member/queries/getMemberInfo.xml new file mode 100644 index 000000000..2ace08801 --- /dev/null +++ b/modules/member/queries/getMemberInfo.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/member/queries/getMemberInfoByMemberSrl.xml b/modules/member/queries/getMemberInfoByMemberSrl.xml new file mode 100644 index 000000000..4b24d9a8d --- /dev/null +++ b/modules/member/queries/getMemberInfoByMemberSrl.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/member/queries/getMemberList.xml b/modules/member/queries/getMemberList.xml new file mode 100644 index 000000000..5653dd6c0 --- /dev/null +++ b/modules/member/queries/getMemberList.xml @@ -0,0 +1,26 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/member/queries/getMemberListWithinGroup.xml b/modules/member/queries/getMemberListWithinGroup.xml new file mode 100644 index 000000000..a2e8ceb5f --- /dev/null +++ b/modules/member/queries/getMemberListWithinGroup.xml @@ -0,0 +1,29 @@ + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/member/queries/getMemberSrl.xml b/modules/member/queries/getMemberSrl.xml new file mode 100644 index 000000000..7d7382f53 --- /dev/null +++ b/modules/member/queries/getMemberSrl.xml @@ -0,0 +1,13 @@ + + +
    + + + + + + + + + + diff --git a/modules/member/queries/getMessage.xml b/modules/member/queries/getMessage.xml new file mode 100644 index 000000000..96aecf8dc --- /dev/null +++ b/modules/member/queries/getMessage.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/member/queries/getNewMessage.xml b/modules/member/queries/getNewMessage.xml new file mode 100644 index 000000000..6aaf769e4 --- /dev/null +++ b/modules/member/queries/getNewMessage.xml @@ -0,0 +1,20 @@ + + +
    +
    + + + + + + + + + + + + + + + + diff --git a/modules/member/queries/getReceivedMessages.xml b/modules/member/queries/getReceivedMessages.xml new file mode 100644 index 000000000..6711052dd --- /dev/null +++ b/modules/member/queries/getReceivedMessages.xml @@ -0,0 +1,24 @@ + + +
    +
    + + + + + + + + + + + + + + + + + + + + diff --git a/modules/member/queries/getScrapDocument.xml b/modules/member/queries/getScrapDocument.xml new file mode 100644 index 000000000..8f965ec0f --- /dev/null +++ b/modules/member/queries/getScrapDocument.xml @@ -0,0 +1,12 @@ + + +
    + + + + + + + + + diff --git a/modules/member/queries/getScrapDocumentList.xml b/modules/member/queries/getScrapDocumentList.xml new file mode 100644 index 000000000..33969197d --- /dev/null +++ b/modules/member/queries/getScrapDocumentList.xml @@ -0,0 +1,17 @@ + + +
    + + + + + + + + + + + + + + diff --git a/modules/member/queries/getSendedMessages.xml b/modules/member/queries/getSendedMessages.xml new file mode 100644 index 000000000..c246840e5 --- /dev/null +++ b/modules/member/queries/getSendedMessages.xml @@ -0,0 +1,20 @@ + + +
    +
    + + + + + + + + + + + + + + + + diff --git a/modules/member/queries/getStoredMessages.xml b/modules/member/queries/getStoredMessages.xml new file mode 100644 index 000000000..a0d4b19b3 --- /dev/null +++ b/modules/member/queries/getStoredMessages.xml @@ -0,0 +1,20 @@ + + +
    +
    + + + + + + + + + + + + + + + + diff --git a/modules/member/queries/insertDeniedID.xml b/modules/member/queries/insertDeniedID.xml new file mode 100644 index 000000000..0c15657c8 --- /dev/null +++ b/modules/member/queries/insertDeniedID.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/member/queries/insertGroup.xml b/modules/member/queries/insertGroup.xml new file mode 100644 index 000000000..c864c60b8 --- /dev/null +++ b/modules/member/queries/insertGroup.xml @@ -0,0 +1,13 @@ + + +
    + + + + + + + + + + diff --git a/modules/member/queries/insertJoinForm.xml b/modules/member/queries/insertJoinForm.xml new file mode 100644 index 000000000..808ff4160 --- /dev/null +++ b/modules/member/queries/insertJoinForm.xml @@ -0,0 +1,17 @@ + + +
    + + + + + + + + + + + + + + diff --git a/modules/member/queries/insertMember.xml b/modules/member/queries/insertMember.xml new file mode 100644 index 000000000..eb85ade6e --- /dev/null +++ b/modules/member/queries/insertMember.xml @@ -0,0 +1,27 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/member/queries/isAddedFriend.xml b/modules/member/queries/isAddedFriend.xml new file mode 100644 index 000000000..49c12a966 --- /dev/null +++ b/modules/member/queries/isAddedFriend.xml @@ -0,0 +1,12 @@ + + +
    + + + + + + + + + diff --git a/modules/member/queries/moveFriend.xml b/modules/member/queries/moveFriend.xml new file mode 100644 index 000000000..730b1b1be --- /dev/null +++ b/modules/member/queries/moveFriend.xml @@ -0,0 +1,12 @@ + + +
    + + + + + + + + + diff --git a/modules/member/queries/renameFriendGroup.xml b/modules/member/queries/renameFriendGroup.xml new file mode 100644 index 000000000..3a28d8f3e --- /dev/null +++ b/modules/member/queries/renameFriendGroup.xml @@ -0,0 +1,12 @@ + + +
    + + + + + + + + + diff --git a/modules/member/queries/sendMessage.xml b/modules/member/queries/sendMessage.xml new file mode 100644 index 000000000..b2e8c9ba7 --- /dev/null +++ b/modules/member/queries/sendMessage.xml @@ -0,0 +1,17 @@ + + +
    + + + + + + + + + + + + + + diff --git a/modules/member/queries/setMessageReaded.xml b/modules/member/queries/setMessageReaded.xml new file mode 100644 index 000000000..a55a91eba --- /dev/null +++ b/modules/member/queries/setMessageReaded.xml @@ -0,0 +1,13 @@ + + +
    + + + + + + + + + + diff --git a/modules/member/queries/setMessageStored.xml b/modules/member/queries/setMessageStored.xml new file mode 100644 index 000000000..6cba267b2 --- /dev/null +++ b/modules/member/queries/setMessageStored.xml @@ -0,0 +1,12 @@ + + +
    + + + + + + + + + diff --git a/modules/member/queries/updateGroup.xml b/modules/member/queries/updateGroup.xml new file mode 100644 index 000000000..b4a4b7196 --- /dev/null +++ b/modules/member/queries/updateGroup.xml @@ -0,0 +1,13 @@ + + +
    + + + + + + + + + + diff --git a/modules/member/queries/updateGroupDefaultClear.xml b/modules/member/queries/updateGroupDefaultClear.xml new file mode 100644 index 000000000..0c44f63a4 --- /dev/null +++ b/modules/member/queries/updateGroupDefaultClear.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/member/queries/updateJoinForm.xml b/modules/member/queries/updateJoinForm.xml new file mode 100644 index 000000000..e4ae8ba1f --- /dev/null +++ b/modules/member/queries/updateJoinForm.xml @@ -0,0 +1,17 @@ + + +
    + + + + + + + + + + + + + + diff --git a/modules/member/queries/updateLastLogin.xml b/modules/member/queries/updateLastLogin.xml new file mode 100644 index 000000000..32d18d903 --- /dev/null +++ b/modules/member/queries/updateLastLogin.xml @@ -0,0 +1,12 @@ + + +
    + + + + + + + + + diff --git a/modules/member/queries/updateMember.xml b/modules/member/queries/updateMember.xml new file mode 100644 index 000000000..69aa53458 --- /dev/null +++ b/modules/member/queries/updateMember.xml @@ -0,0 +1,25 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/member/queries/updateMemberJoinFormListorder.xml b/modules/member/queries/updateMemberJoinFormListorder.xml new file mode 100644 index 000000000..d6234eb48 --- /dev/null +++ b/modules/member/queries/updateMemberJoinFormListorder.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/member/queries/updateMemberPassword.xml b/modules/member/queries/updateMemberPassword.xml new file mode 100644 index 000000000..a4ca62e92 --- /dev/null +++ b/modules/member/queries/updateMemberPassword.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/member/schemas/member.xml b/modules/member/schemas/member.xml new file mode 100644 index 000000000..9d75750b3 --- /dev/null +++ b/modules/member/schemas/member.xml @@ -0,0 +1,22 @@ +
    + + + + + + + + + + + + + + + + + + + + +
    diff --git a/modules/member/schemas/member_denied_user_id.xml b/modules/member/schemas/member_denied_user_id.xml new file mode 100644 index 000000000..a3095ca94 --- /dev/null +++ b/modules/member/schemas/member_denied_user_id.xml @@ -0,0 +1,6 @@ + + + + + +
    diff --git a/modules/member/schemas/member_friend.xml b/modules/member/schemas/member_friend.xml new file mode 100644 index 000000000..1a1a76a70 --- /dev/null +++ b/modules/member/schemas/member_friend.xml @@ -0,0 +1,8 @@ + + + + + + + +
    diff --git a/modules/member/schemas/member_friend_group.xml b/modules/member/schemas/member_friend_group.xml new file mode 100644 index 000000000..a52db0fa0 --- /dev/null +++ b/modules/member/schemas/member_friend_group.xml @@ -0,0 +1,7 @@ + + + + + +
    + diff --git a/modules/member/schemas/member_group.xml b/modules/member/schemas/member_group.xml new file mode 100644 index 000000000..8f8316b11 --- /dev/null +++ b/modules/member/schemas/member_group.xml @@ -0,0 +1,8 @@ + + + + + + + +
    diff --git a/modules/member/schemas/member_group_member.xml b/modules/member/schemas/member_group_member.xml new file mode 100644 index 000000000..a670b8b7c --- /dev/null +++ b/modules/member/schemas/member_group_member.xml @@ -0,0 +1,5 @@ + + + + +
    diff --git a/modules/member/schemas/member_join_form.xml b/modules/member/schemas/member_join_form.xml new file mode 100644 index 000000000..e69076e8f --- /dev/null +++ b/modules/member/schemas/member_join_form.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + +
    diff --git a/modules/member/schemas/member_message.xml b/modules/member/schemas/member_message.xml new file mode 100644 index 000000000..cb8e1b7b2 --- /dev/null +++ b/modules/member/schemas/member_message.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + +
    diff --git a/modules/member/schemas/member_scrap.xml b/modules/member/schemas/member_scrap.xml new file mode 100644 index 000000000..5ea197c20 --- /dev/null +++ b/modules/member/schemas/member_scrap.xml @@ -0,0 +1,11 @@ + + + + + + + + + + +
    diff --git a/modules/member/skins/cozy_simple/add_friend.html b/modules/member/skins/cozy_simple/add_friend.html new file mode 100644 index 000000000..e14536294 --- /dev/null +++ b/modules/member/skins/cozy_simple/add_friend.html @@ -0,0 +1,49 @@ + + + +
    +
    +

    {$lang->cmd_add_friend}

    +
    + +
    + + +
    + + + + + + + + + + + + + + + +
    {$lang->user_id}{$target_info->user_id}
    {$lang->user_name}{$target_info->user_name}
    {$lang->nick_name}
    {$target_info->nick_name}
    + +
    + + {$lang->cmd_add_friend_group} +
    +
    + +
      +
    • +
    • {$lang->cmd_close}
    • +
    + +
    +
    + + diff --git a/modules/member/skins/cozy_simple/add_friend_group.html b/modules/member/skins/cozy_simple/add_friend_group.html new file mode 100644 index 000000000..0f83a005b --- /dev/null +++ b/modules/member/skins/cozy_simple/add_friend_group.html @@ -0,0 +1,30 @@ + + + +
    +
    + + +
    +

    + + {$lang->cmd_rename_friend_group} + + {$lang->cmd_add_friend_group} + +

    +
    + +
    +

    {$lang->msg_insert_group_name}

    + +
    + +
      +
    • +
    • {$lang->cmd_close}
    • +
    +
    +
    + + diff --git a/modules/member/skins/cozy_simple/common_footer.html b/modules/member/skins/cozy_simple/common_footer.html new file mode 100644 index 000000000..04f5b8449 --- /dev/null +++ b/modules/member/skins/cozy_simple/common_footer.html @@ -0,0 +1 @@ +
    diff --git a/modules/member/skins/cozy_simple/common_header.html b/modules/member/skins/cozy_simple/common_header.html new file mode 100644 index 000000000..6f18c65cb --- /dev/null +++ b/modules/member/skins/cozy_simple/common_header.html @@ -0,0 +1,35 @@ + + + + {@$member_config->colorset = "red"} + + + + + + + + + + + + +
    + + +
    +

    {$member_title}

    + + +
    + + + +
    + +
    + diff --git a/modules/member/skins/cozy_simple/css/blue.css b/modules/member/skins/cozy_simple/css/blue.css new file mode 100644 index 000000000..47dea4c49 --- /dev/null +++ b/modules/member/skins/cozy_simple/css/blue.css @@ -0,0 +1,33 @@ +@charset "utf-8"; + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; background:#1187d8 url(../images/blue/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.boardList { width:100%; position:relative; border-bottom:2px solid #1187d8; border-collapse:collapse; } +.memberList th.repeat_bg { background:#ffffff url(../images/blue/bg_title_repeat_x.gif) repeat-x left bottom;} +.memberList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/blue/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.messageList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/blue/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.messageList th.author { background:url(../images/blue/bg_title_repeat_x.gif) repeat-x left bottom; text-align:left;} +.messageList { width:100%; position:relative; border-bottom:2px solid #1187d8; border-collapse:collapse; margin-bottom:2.2em;} +.memberList { width:100%; position:relative; border-bottom:2px solid #1187d8; border-collapse:collapse; margin-bottom:2.2em;} +.joinTable.typeA { border-top:2px solid #1187d8; border-collapse:collapse;} +.joinTable.typeB { border-bottom:2px solid #1187d8; background:#f9f9f9;} +.messageList td.recommend { font:bold .8em Tahoma; color:#1187d8; text-align:center;} +.memberInformation .friendNum strong { font:bold 11px Tahoma; color:#1187d8;} +.memberSmallBox .header { position:relative; _width:100%; background:#1187d8; overflow:hidden;} +.memberSmallBox .open_id_help { background:#F7F7F7; border-top:1px solid #1187d8; border-bottom:2px solid #1187d8; overflow:hidden; padding:1.1em; text-align:left; } +.memberSmallBox .help { background:#F7F7F7; border-top:1px solid #1187d8; border-bottom:2px solid #1187d8; overflow:hidden; padding:1.1em; text-align:center; } +.memberInformation .instantMessage li a strong { font:bold 0.75em tahoma; color:#1187d8;} + +.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/blue/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#007ed5; cursor:default; position:relative; top:-.2em;} +.boardList td.recommend { font:bold .8em Tahoma; color:#007ed5; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#007ed5; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #1187d8;} +.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #1187d8; overflow:hidden;} +.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#007ed5;} + +.boardWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;} +.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/blue/bg_title_norepeat.gif) no-repeat left bottom;} +.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/blue/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} diff --git a/modules/member/skins/cozy_simple/css/bluish_green.css b/modules/member/skins/cozy_simple/css/bluish_green.css new file mode 100644 index 000000000..8c9b4a32d --- /dev/null +++ b/modules/member/skins/cozy_simple/css/bluish_green.css @@ -0,0 +1,33 @@ +@charset "utf-8"; + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; background:#9ab09f url(../images/bluish_green/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.boardList { width:100%; position:relative; border-bottom:2px solid #9ab09f; border-collapse:collapse; } +.memberList th.repeat_bg { background:#ffffff url(../images/bluish_green/bg_title_repeat_x.gif) repeat-x left bottom;} +.memberList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/bluish_green/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.memberList { width:100%; position:relative; border-bottom:2px solid #9ab09f; border-collapse:collapse; margin-bottom:2.2em;} +.messageList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/bluish_green/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.messageList th.author { background:url(../images/bluish_green/bg_title_repeat_x.gif) repeat-x left bottom; text-align:left;} +.messageList { width:100%; position:relative; border-bottom:2px solid #9ab09f; border-collapse:collapse; margin-bottom:2.2em;} +.joinTable.typeA { border-top:2px solid #9ab09f; border-collapse:collapse;} +.joinTable.typeB { border-bottom:2px solid #9ab09f; background:#f9f9f9;} +.messageList td.recommend { font:bold .8em Tahoma; color:#9ab09f; text-align:center;} +.memberInformation .friendNum strong { font:bold 11px Tahoma; color:#9ab09f;} +.memberInformation .instantMessage li a strong { font:bold 0.75em tahoma; color:#9ab09f;} +.memberSmallBox .header { position:relative; _width:100%; background:#9ab09f; overflow:hidden;} +.memberSmallBox .open_id_help { background:#F7F7F7; border-top:1px solid #9ab09f; border-bottom:2px solid #9ab09f; overflow:hidden; padding:1.1em; text-align:left; } +.memberSmallBox .help { background:#F7F7F7; border-top:1px solid #9ab09f; border-bottom:2px solid #9ab09f; overflow:hidden; padding:1.1em; text-align:center; } + +.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/bluish_green/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#9ab09f; cursor:default; position:relative; top:-.2em;} +.boardList td.recommend { font:bold .8em Tahoma; color:#9ab09f; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#9ab09f; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #9ab09f;} +.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #9ab09f; overflow:hidden;} +.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#9ab09f;} + +.boardWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;} +.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/bluish_green/bg_title_norepeat.gif) no-repeat left bottom;} +.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/bluish_green/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} diff --git a/modules/member/skins/cozy_simple/css/common.css b/modules/member/skins/cozy_simple/css/common.css new file mode 100644 index 000000000..56eaab45e --- /dev/null +++ b/modules/member/skins/cozy_simple/css/common.css @@ -0,0 +1,537 @@ +@charset "utf-8"; +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ +.memberSmallBox.w400pop { width:400px; margin:0; padding:0;} +.memberSmallBox.w500pop { width:500px; margin:0; padding:0;} +.memberSmallBox.w600pop { width:600px; margin:0; padding:0;} + +/* ----- List+Read+Write+Modify | Start ----- */ +.boardHeader h3 { float:left; clear:both; padding:1.9em 1.5em 1.8em 1.5em; font-size:1.2em; color:#FFFFFF;} +.boardHeader .member_option { float:right; position:relative; top:3em; right:1em; } +.boardHeader .member_option .buttonTypeGo { vertical-align:bottom; } + +/* boardInformation */ +.boardInformation { width:100%; clear:both; margin:0 0 .5em 0; background:#EFEFEF; color:#8D8D8D; overflow:hidden;} +.articleNum { float:left; padding:.5em 0 .5em 2.3em; font:.8em Tahoma;} +.articleNum strong { margin:0 0 0 .5em; padding:0 0 0 .7em; font:bold .9em Tahoma; color:#6F6F6F; background:url(../images/common/bar_1x8_c0c0c0.gif) no-repeat left .1em;} +.accountNavigation { float:right; margin:.3em .5em 0 0; overflow:hidden;} +.accountNavigation li { list-style:none; float:left; margin:0 0 0 -.1em; padding:.1em .8em 0 .8em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left .3em;} +.accountNavigation li a {} + +/* boardList */ +.boardList tr:first-child td, .boardList tr.first-child td {} +.boardList tr.notice {} +.boardList tr.notice .num { font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; font-weight:bold;} + +.boardList th a { color:#3e3f3e;} +.boardList th span.on { font-weight:bold;} +.boardList th.num { background-position:-3px bottom; padding:0;} +.boardList th select { height:20px; } +.boardList th.category { padding:0 .2em 0 .5em;} +.boardList th.category.thumbStyle { background-position:-3px bottom !important; border-left:1px solid #ffffff; text-align:left;} +.boardList th:first-child { background-position:-2px bottom;} +.boardList th.first-child { background-position:-2px bottom;} +.boardList th.author {} +.boardList th.title {} +.boardList th.reading { white-space:nowrap;} +.boardList th.recommend { white-space:nowrap;} +.boardList th.reply { white-space:nowrap;} +.boardList th.date {} +.boardList th.check { padding:0;} +.boardList th.user {} +.boardList th.registDate {} +.boardList th.checkDate {} +.boardList th.friendGroup {} +.boardList th.userId {} +.boardList th.userName {} +.boardList th.userNick {} +.boardList th.sendMessage {} +.boardList th.last-child { border-right:1px solid #ffffff;} +.boardList th .sort { padding:0 .2em; vertical-align:middle;} +.boardList th select, +.boardList th input { vertical-align:middle;} + +.boardList td { padding:.3em; border-bottom:1px solid #e4e4e2;} +.boardList td.noline { border-bottom:none;} +.boardList td.num { font:.8em Tahoma; color:#999999; padding:.5em .5em .5em 1.5em;} +.boardList td.category {} +.boardList tr.notice td { padding:.3em; white-space:nowrap;} +.boardList tr.notice td img { margin:-.1em .3em 0 0;} +.boardList td.thumb { padding:.5em 0 .5em .5em; width:145px; table-layout:fixed; white-space:nowrap;} +.boardList td.thumb * { vertical-align:middle;} +.boardList td.title.bold { font-size:1em; font-weight:bold;} +.boardList td.title.bold a { position:relative; top:.3em;} +.boardList td.title * { vertical-align:middle;} +.boardList td.title, +.boardList td.title a { color:#444444; text-decoration:none; } +.boardList td.title a:visited { color:#777777;} +.boardList td.title .title_wrap { width:100%; overflow:hidden; white-space:nowrap;} +.boardList td.author { padding:0 .5em 0 1.3em; color:#333333; font:.95em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;} +.boardList td.author a { font-size:1em; color:#333333;} +.boardList td.reading { font:.8em Tahoma; color:#999999; text-align:center;} +.boardList td.reply { font:bold .8em Tahoma; color:#ff6600; text-align:center;} +.boardList td.date { font:.8em Tahoma; color:#999999; text-align:center;} +.boardList td.registDate { font:.8em Tahoma; color:#999999; text-align:center;} +.boardList td.checkDate { font:.8em Tahoma; color:#333333; text-align:center;} +.boardList td.summary { border-top:none; vertical-align:top; color:#666666; line-height:1.25em;} +.boardList td.summary a { color:#666666; text-decoration:none; line-height:inherit;} +.boardList td.summary a:visited { color:#999999;} +.boardList td.check { text-align:center;} +.boardList td.user { color:#333333; font-size:.9em;} +.boardList td.user a { color:#333333;} +.boardList td.userId { font:.9em Tahoma;} +.boardList td.userName {} +.boardList td.userNick { font-size:.9em; color:#999999;} +.boardList td.friendGroup {} +.boardList td.sendMessage { text-align:center; padding:0;} +.boardList td.sendMessage .buttonFixedLeft { position:relative; left:20%; _left:0;} +*:first-child+html .boardList td.sendMessage .buttonFixedLeft { left:0;} +.boardList td input { _margin:-3px;} +.boardList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#ff6600; cursor:default; position:relative; top:.3em;} +.boardList td .replyAndTrackback strong { font:bold 1em Tahoma;} + +.boardList td .thumbnailSmall { margin:0 .3em 0 .3em;} +.boardList td .thumbnailSmall img {} +.boardList td .thumbnailMedium { margin:0 .3em 0 .3em;} +.boardList td .thumbnailMedium img {} + +.boardList.thumbnail {} +.boardList.thumbnail td { border-top:none; border-bottom:1px solid #eff0ed; padding:1.5em 0 0 1.5em; overflow:hidden;} +.boardList.thumbnail div.cell { float:left; width:131px; margin:0 1.6em 0 0; padding-bottom:1.5em;} +.boardList.thumbnail div.cell .fix_img { width:131px; height:106px; overflow:hidden;} +.boardList.thumbnail div.title { color:#444444; margin:.5em 0 .2em 0;} +.boardList.thumbnail div.title a { color:#444444;} +.boardList.thumbnail div.nameAndDate { font-size:.9em; color:#999999; margin-bottom:.2em; padding-left:3px;} +.boardList.thumbnail div.nameAndDate a { color:#999999;} +.boardList.thumbnail div.nameAndDate .date { font:.8em Tahoma; color:#999999;} +.boardList.thumbnail div.readAndRecommend { font-size:.9em; color:#666666; padding-left:3px;} +.boardList.thumbnail div.readAndRecommend .num { font:.8em Tahoma;} +.boardList.thumbnail div.readAndRecommend .vr { color:#dddddd;} +.boardList.thumbnail div.readAndRecommend strong.num { font:bold .8em Tahoma; color:#494949;} + +/* boardSearch */ +.boardSearch { clear:both; text-align:center; margin-top:3em;} +.boardSearch fieldset { display:inline; padding:10px 15px 10px 15px; border:none; background:#F4F4F4; overflow:hidden; } +.boardSearch fieldset legend { overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} +.boardSearch * { vertical-align:middle;} +.boardSearch select { float:left;} +.boardSearch input { float:left; margin:0 .3em; background:#fbfbfb;} +.searchButton ul { overflow:hidden;} +.searchButton li { float:left; margin-right:.3em; list-style:none;} + +.buttonTypeGo { border:none; cursor:pointer; background:url(../images/common/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;} + + +/* pageNavigation */ +.pageNavigation { float:left; display:block; margin:0 0 2em 1.1em; font:bold .8em Tahoma; } +.pageNavigation a, .pageNavigation a:visited, .pageNavigation a:active { margin-left:-4px; font:bold .8em Tahoma; color:#676767; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } +.pageNavigation a:hover { text-decoration:none; } +.pageNavigation a.goToFirst, +.pageNavigation a.goToLast { border:none; border-right:1px solid #ffffff; border-left:1px solid #ffffff; z-index:99; padding:1px 5px 3px 4px;} +.pageNavigation a.goToFirst img, +.pageNavigation a.goToLast img { vertical-align:middle;} + +.buttonBox { float:right; margin:1.2em 0 0 0; } + +/* boardRead */ +#blog .boardRead { position:relative; margin:0; _overflow:hidden;} +.boardRead .originalContent { padding:2em 0 2em 0;} +.boardRead .titleAndCategory { float:left;} +.boardRead .titleAndCategory h4 { font-size:1.4em; display:inline; padding-left:.2em;} +.boardRead .titleAndCategory .vr { font-size:.9em; margin:0 .3em; color:#c5c7c0;} +.boardRead .titleAndCategory .category { font-size:.9em; color:#999999; white-space:nowrap;} + +.boardRead .dateAndModify { font-size:.8em; float:right; white-space:nowrap;} +.boardRead .dateAndModify .date { font-size:.8em; font-family:Tahoma; color:#999999; margin-right:.5em; float:left; position:relative; top:.1em;} +.boardRead .dateAndModify .date strong { font-size:1em; font-family:Tahoma;} +.boardRead .dateAndModify ul { display:inline; margin:0 .4em 0 0;} +.boardRead .dateAndModify ul li { float:left; margin-left:.3em; list-style:none;} +.boardRead dl.uri { float:right; overflow:hidden; margin:0 0 3em .3em;} +.boardRead dl.uri dt { float:left; clear:left; font-size:.9em; margin-right:.3em; color:#999999;} +.boardRead dl.uri dd { clear:right; font-size:.8em; color:#d4d5d0;} +.boardRead dl.uri dd span { font-family:Tahoma; color:#d4d5d0;} +.boardRead .readBody { padding:0 .3em; color:#555555; overflow:hidden; margin-bottom:2em;} +.boardRead .readBody p { margin:1em 0; line-height:1.5em;} +.boardRead .contentBody { width:100%; overflow:hidden; } + +.boardRead .userInfo { float:left; white-space:nowrap;} +.boardRead .userInfo .author { padding:0 .3em 0 0; color:#3074a5; margin-right:.3em;} +.boardRead .userInfo .ipaddress { font-size:.9em; font-family:Tahoma; color:#888888; margin-right:.5em; } + +/* extraVars list */ +.extraVarsList { width:100%; border:1px solid #e0e1db; clear:both; margin-bottom:1em;} +.extraVarsList tr.notice { background:#f8f8f8;} +.extraVarsList tr.notice .num { font-size:.9em; font-weight:bold;} +.extraVarsList tr.bg1 { background:#ffffff} +.extraVarsList tr.bg2 { background:#fbfbfb;} +.extraVarsList th { color:#3e3f3e; font-weight:bold; padding:.8em .5em .5em .5em; border-bottom:1px solid #eff0ed; border-right:1px solid #eff0ed;} +.extraVarsList td { border-bottom:1px solid #eff0ed; padding:.5em .5em .5em 1em;} + +.boardRead .readFooter { border-top:1px solid #dfe0db; } +.boardRead .readFooter .tag { margin-bottom:1em; padding:1em 0 0 0; } +.boardRead .readFooter .tag h5 { display:inline; font-size:1em; margin:0 .3em 0 1.8em;} +.boardRead .readFooter .tag ul, +.boardRead .readFooter .tag li { display:inline;} +.boardRead .readFooter .tag a { color:#444444; text-decoration:none;} +.boardRead .readFooter .tag .tagIcon { vertical-align:middle;} +.boardRead .readFooter .fileAttached { padding:1em 1em .8em 0; position:relative; _width:100%; border-bottom:1px solid #dfdfdd; overflow:hidden; background:#f9f9f9;} +.boardRead .readFooter .fileAttached h5 {} +.boardRead .readFooter .fileAttached ul { margin-left:1.8em;} +.boardRead .readFooter .fileAttached li { float:left; margin-right:.75em; line-height:1.6em; color:#888888; white-space:nowrap; list-style:none;} +.boardRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em .2em; white-space:nowrap; position:relative; color:#888888; text-decoration:none; } +.boardRead .readFooter .fileAttached li a:visited { color:#777777;} + +.listButton li { list-style:none; clear:both; text-align:right; margin-top:.5em; } + +.boardRead .replyAndTrackback { float:left; width:100%; background:url(../images/common/bg_repeat_x_eaeaea.gif) repeat-x left bottom; overflow:hidden;} +.boardRead .replyAndTrackback li { float:left; font-weight:bold; margin:.3em 0 0 0; padding:.7em 1.1em .7em 1.2em; color:#FFFFFF; background:#B8B8B8; list-style:none;} +.boardRead .replyAndTrackback li a { color:#FFFFFF; text-decoration:none; } +.boardRead .replyAndTrackback li strong { padding:0 1.1em 0 0; background:#B8B8B8 url(../images/common/icon_close.gif) no-repeat right .2em;} +.boardRead .replyAndTrackback li.selected a { color:#666666;} +.boardRead .replyAndTrackback li.selected strong { padding:0 1.1em 0 0; background:#FFFFFF url(../images/common/icon_open.gif) no-repeat right .2em;} +.boardRead .replyAndTrackback a#toggleReply { background:url(../images/common/buttonToggleReply.gif) no-repeat right top;} +.boardRead .replyAndTrackback a#toggleTrackback { background:url(../images/common/buttonToggleReply.gif) no-repeat right -13px;} + +.boardRead #reply, +.boardRead #trackback { color:#666666; border-left:1px solid #EAEAEA; border-right:1px solid #EAEAEA; border-bottom:1px solid #EAEAEA; padding-top:1em;} +.boardRead #reply { } +.boardRead #trackback { display:none;} + +.boardRead .topBorder { border-top:1px solid #EAEAEA; } + +.boardRead #reply .contentBox, +.boardRead #trackback .contentBox { line-height:1.25em; color:#676767; clear:both; padding:1em; overflow:hidden;} +.boardRead #reply .top_border, +.boardRead #trackback .top_border { border-top:1px dashed #d8d8d8; } + +.boardRead .contentBox .content { width:100%; overflow:hidden; clear:both; margin-bottom:1em; } +.boardRead .contentBox .author { float:left; overflow:hidden; color:#3173a3;} +.boardRead .contentBox .date { float:right; font:.8em Tahoma; color:#cccccc; margin-left:.5em; } +.boardRead .contentBox .replyOption { float:right; display:inline; white-space:nowrap; margin-left:.5em; } +.boardRead .contentBox .replyOption img { vertical-align:middle;} + +.boardRead .contentBox .fileAttached { position:relative; _width:100%; overflow:hidden; clear:both; } +.boardRead .contentBox .fileAttached h5 {} +.boardRead .contentBox .fileAttached ul { margin-bottom:.5em;} +.boardRead .contentBox .fileAttached li { float:left; margin-right:.75em; line-height:1.6em; color:#888888; white-space:nowrap; list-style:none;} +.boardRead .contentBox .fileAttached li a { font-size:.9em; padding:.1em 0 .1em .2em; white-space:nowrap; position:relative; color:#888888; text-decoration:none; } +.boardRead .contentBox .fileAttached li a:visited { color:#777777;} + +.boardRead .contentBox .title a { color:#676767 ; margin-right:.3em; text-decoration:none;} +.boardRead .contentBox address a { font-size:.9em; color:#3173a3; margin-right:.3em; text-decoration:none; } +.boardRead .contentBox address .trackback_date { font:.8em Tahoma; color:#cccccc; margin-left:.5em; } +.boardRead .indent_box { background-color:#FBFBFB; } +.boardRead .contentBox .indent {padding-left:1.5em; background:url(../images/common/icon_arrow_reply.gif) no-repeat left .1em;} + +/* boardEditor */ +.boardEditor { padding:.5em 0 1em 0; width:100%; overflow:hidden;} +.boardEditor.reply { padding:.5em 1em 1em 1em; width:auto; overflow:hidden;} +.boardEditor legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em;} +.boardEditor fieldset { _width:100%; border:0px solid #eaeae7; border-top:none;} +.boardEditor .userNameAndPw { position:relative; background:#fbfbfb; border-top:1px solid #eaeae7; border-bottom:1px solid #e1e1e1; padding:.5em 1em; white-space:nowrap;} +.boardEditor .userNameAndPw * { vertical-align:middle;} +.boardEditor .userNameAndPw label { margin-right:.2em; color:#666760;} +.boardEditor .userNameAndPw input { color:#aaaaaa;} +.boardEditor .userNameAndPw .userName { width:6em; margin-right:.8em;} +.boardEditor .userNameAndPw .userPw { width:5em;} +.boardEditor .userNameAndPw .emailAddress { width:6em;} +.boardEditor .userNameAndPw .homePage { width:6em;} +.boardEditor .userNameAndPw .checkSecret { position:absolute; right:2em; top:.7em;} + +/* boardWrite */ +.boardWrite { width:100%; position:relative;} +.boardWrite .userNameAndPw { margin-bottom:-1px;} + +.boardWrite div.title label.title { display:block; float:left; font-weight:bold; padding:.4em 0 0 1.5em; width:9.5em; white-space:nowrap;} +.boardWrite div.title input#title { width:60%;} + +.boardWrite .option dt { display:block; float:left; font-weight:bold; padding:.3em 0 0 1.5em; width:9.5em; white-space:nowrap;} +.boardWrite .option dd { float:left; margin-right:1em; padding-top:.2em; _padding-top:.1em;} +.boardWrite .option dd * { vertical-align:middle;} +.boardWrite .inputTypeText { background:#fbfbfb;} +.boardWrite .trackbackURI { clear:both; border-top:1px solid #eff0ed; padding:4px 0 .8em 0;} +.boardWrite .trackbackURI label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .trackbackURI .inputTypeText { width:50%;} +.boardWrite .tag { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;} +.boardWrite .tag label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .tag .inputTypeText { width:50%;} +.boardWrite .tag .help { vertical-align:middle;} +.boardWrite .tag .info { padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;} +.boardWrite .extra_vars { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;} +.boardWrite .extra_vars label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} +.boardWrite .extra_vars .info { clear:both; padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;} +.boardWrite .extra_vars ul li { float:left; margin-right:1em; } + +/* ----- List+Read+Write+Modify | End ----- */ + +/* Column Left & Right Common Child */ +.boxTypeA { position:relative; border:5px solid #F2F2F2; margin-bottom:.7em;} +.boxTypeB { position:relative; margin-bottom:.7em;} +.boxTypeB h2 { position:relative; padding:7px 0 0 12px; height:21px; _height:20px; background:#f5f5f5; font-size:1em; color:#ef2121; font-family:Tahoma;} +*:first-child+html .boxTypeB h2 { height:20px; color:#ef2121;} +.boxTypeB .toggleMask {position:absolute; top:8px; right:5px; cursor:pointer; width:13px; height:13px; overflow:hidden;} +.boxTypeB .showHide { position:relative;} +.boxTypeB .optionList { position:absolute; top:8px; right:0; overflow:hidden;} +.boxTypeB .optionList li { float:left; padding:0 .5em; margin-left:-1px; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left center;} +.boxTypeB .optionList li a { color:#a4a4a4; font-size:.9em;} +.boxTypeB .optionList li.on a { color:#000000;} +.boxTypeB .showAll { color:#737373; font:bold .9em tahoma; white-space:nowrap; display:inline-block; padding:.4em .8em; background:url(../images/common/bar_1x8_c0c0c0.gif) no-repeat right center;} +.boxTypeB .showAll.no_bg { background:none;} + +/* Profile */ +#blog div#profile { padding:6px; overflow:hidden;} +#blog div#profile img.profile { width:153px; display:block; margin-bottom:1.2em;} +#blog div#profile dl#hello {} +#blog div#profile dl#hello dt { color:#333333; margin-bottom:.5em;} +#blog div#profile dl#hello dt a { color:#333333;} +#blog div#profile dl#hello dd { color:#777777; margin-bottom:1em;} +#blog div#profile ul#admin { overflow:hidden; height:1.2em;} +#blog div#profile ul#admin li { float:left; padding:0 .4em; font:.8em tahoma;} +#blog div#profile ul#admin li a { display:block;} +#blog div#profile ul#admin li.write a {} +#blog div#profile ul#admin li.setup { border-left:1px solid #e3e3e3;} +#blog div#profile ul#admin li.setup a {} +#blog div#profile ul#admin li a { color:#666666;} + +/* Category */ +#blog div#category {} +#blog div#category #categoryList { padding:1em .8em .5em .8em;} +#blog div#category #categoryList li { position:relative; padding:0 0 0 15px; background:url(../images/common/iconFolderClose.gif) no-repeat 2px top;} +#blog div#category #categoryList li li {} +#blog div#category #categoryList li li li { background:url(../images/common/iconList.gif) no-repeat 5px top;} +#blog div#category #categoryList a { display:block; _display:inline-block; color:#6b6b6b; margin:0 0 6px 5px;} + +/* Search Box */ +#blog div#searchBox { margin-bottom:.7em; padding:.6em; background:#f5f5f5; overflow:hidden;} +#blog div#searchBox fieldset { border:none;} +#blog div#searchBox fieldset legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} + +/* Tags */ +#blog div#tag { padding-bottom:1em;} +#blog div#tag .tagList { padding:1.2em; overflow:hidden;} +#blog div#tag .tagList li { display:inline; color:#a4a4a4; margin-right:.1em; line-height:1.5em;} +#blog div#tag .tagList li a { color:#a4a4a4;} +#blog div#tag .tagList li.typeA a { color:#717171; font-weight:bold;} +#blog div#tag .tagList li.typeB a { color:#3d3d3d;} +#blog div#tag .tagList li.typeC a { font-weight:bold;} +#blog div#tag .tag_sort { width:100%; border-top:1px dashed #ababab; border-bottom:1px dashed #ababab; text-align:center; overflow:hidden;} + +/* Neighbor */ +#blog div#neighbor {} +#blog div#neighbor #neighborList { padding:1.2em 1.2em 0 1.2em;} +#blog div#neighbor #neighborList li { padding:0 0 .7em 1.2em; background:url(../images/common/iconPlus2.gif) no-repeat left top;} +#blog div#neighbor #neighborList li img { padding-left:.3em; top:.1em;} +#blog div#neighbor #neighborList li a { display:inline-block; color:#6b6b6b; font-weight:bold;} +#blog div#neighbor #neighborList li ul { display:none; padding:.7em 0 0 0;} +#blog div#neighbor #neighborList li ul li { padding:0 0 .6em .6em; margin-left:-.6em; background:url(../images/common/iconLineBD.gif) no-repeat left 5px;} +#blog div#neighbor #neighborList li ul li a{ font-weight:normal;} + +/* Calendar */ +#blog div#calendar {} +#blog div#calendar table { width:100%; background:url(../images/common/bg_line_dot_x.gif) repeat-x left top;} +#blog div#calendar table caption { font:bold 1em 돋움; color:#ec1a25; padding:1em;} +#blog div#calendar table caption .mm { font:bold 1em 돋움; color:#555650;} +#blog div#calendar table caption a { padding:.2em;} +#blog div#calendar table caption a img { vertical-align:middle;} +#blog div#calendar table th { padding:.6em 0;} +#blog div#calendar table td { padding:.25em 0;} +#blog div#calendar table th { font:bold .7em tahoma; color:#717171;} +#blog div#calendar table th.sun { color:#000000;} +#blog div#calendar table td { text-align:center;} +#blog div#calendar table td a { font:.7em Tahoma; color:#9a9a9a;} +#blog div#calendar table td.sun { color:#000000;} +#blog div#calendar table td.sun a { color:#000000;} +#blog div#calendar table td.today a { font-weight:bold; color:#54564b;} +#blog div#calendar table td.posted a { text-decoration:underline;} + +#blog .boardWrite div.title { border-top:2px solid #ed1b24;} +#blog .write_post h3 {margin:1.5em 1em 1em 1em; font:bold 1.2em 돋움;} +/* ----- Blog | End ----- */ + + +/* ----- Member | Start ----- */ + +.memberHeader { position:relative; _width:100%; background:#ED2027 url(../images/common/bg_top_title.gif) no-repeat 23px -6px; overflow:hidden;} +.memberHeader h3 { float:left; clear:both; padding:1.2em 0 1em 1.7em; font-size:1.1em; color:#FFFFFF;} +.memberInformation { width:100%; clear:both; margin:0 0 .5em 0; background:#EFEFEF; color:#8D8D8D; overflow:hidden;} +.memberInformation .friendNum { float:left; padding:.7em 0 .7em 2em; background:url(../images/common/iconFriend.gif) no-repeat .5em .4em;} +.memberInformation .addGroup { float:right; margin:.8em 1em .7em 0;} +.memberInformation .addGroup select { _position:relative; _top:5px; } +.memberInformation .instantMessage { float:right; margin:.7em; overflow:hidden;} +.memberInformation .instantMessage li { list-style:none; float:left; margin:0 0 0 -.1em; padding:0 .5em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left .25em;} +.memberInformation .instantMessage li a { text-decoration:none; white-space:nowrap; color:#666666;} +.memberInformation .instantMessage li.on a { text-decoration:none; background-position:left -14px; font-weight:bold;} + +/* 친구목록 */ + +.memberList th.check { padding:0;} +.memberList th.friendGroup { padding:0 0 0 .3em; text-align:left;} +.memberList th.friendGroup img.go_button { vertical-align:middle; } +.memberList th select, +.memberList th input { vertical-align:middle;} + +.memberList td { padding:.3em; border-bottom:1px solid #e4e4e2;} +.memberList td.noline { border-bottom:none;} +.memberList td.check { text-align:center;} +.memberList td.friendGroup { } +.memberList td.userId { text-align:center; font:.9em Tahoma;} +.memberList td.userName { text-align:center;} +.memberList td.userNick { text-align:center; color:#999999;} +.memberList td.registDate { text-align:center; font:.8em Tahoma;} +.memberList td.sendMessage { text-align:center;} + +.memberSmallBox { margin:0 auto 1em auto;} +.memberSmallBox.w400 { width:400px;} +.memberSmallBox.w298 { width:298px;} +.memberSmallBox.w498 { width:498px;} +.memberSmallBox .header h3 { font-size:1.2em; color:#FFFFFF; padding:1em 2em .8em 1em; background:none;border:none;} +.memberSmallBox .login { position:relative; border:none; padding:2.4em 0 2em 2.3em;} +.memberSmallBox .login legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} +.memberSmallBox .login dl { overflow:hidden; width:212px; float:left; text-align:right;} +.memberSmallBox .login dl dt { float:left; width:105px; color:#54564b; height:22px; padding-top:5px;} +.memberSmallBox .login dl dd { float:left; width:105px; height:27px;} +.memberSmallBox .login dl dd input { width:90px;} +.memberSmallBox .login dl dd input.openid_user_id { background: url(../images/openid_input_bg.gif) left no-repeat; padding-left:18px; width:72px;} +.memberSmallBox .login .loginButton { display:block; float:left; margin-top:27px; _margin-top:28px;} +.memberSmallBox .login .loginOpenIDButton { display:block; float:left; } +*:first-child+html .memberSmallBox .login .loginButton { margin-top:28px;} +.memberSmallBox .login .keep { float:left; clear:both; white-space:nowrap; position:relative; left:115px; _left:110px;} +*:first-child+html .memberSmallBox .login .keep { left:52px;} +.memberSmallBox .login .keep input { vertical-align:middle;} +.memberSmallBox .login .keep label { font-size:11px; color:#999999;} +.memberSmallBox .help li { display:inline; padding:0 .3em 0 .7em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left center;} +.memberSmallBox .help li:first-child { background:none;} +.memberSmallBox .help li.first-child { _background:none;} +.memberSmallBox .help li a { font-size:11px; color:#54564b;} +.memberSmallBox .text { color:#54564b; text-align:center; padding:4.25em 2em 4.8em 2em;} +.memberSmallBox .text p { margin-bottom:.5em;} +.memberSmallBox .button img { vertical-align:top;} +.memberSmallBox.w400 .button ul { position:absolute; left:279px; } +.memberSmallBox.w298 .button ul { position:absolute; left:110px; } +.memberSmallBox.w498 .button ul { position:absolute; left:220px; } +.memberSmallBox .button ul li { float:left; margin-right:.3em;} +.memberSmallBox .complex { padding:1.5em 2em 2em 2em;} +.memberSmallBox .friend { width:100%;} +.memberSmallBox .friend th { width:7em; padding:.9em; border-bottom:1px solid #e4e5e0;} +.memberSmallBox .friend td { padding:.9em; border-bottom:1px solid #e4e5e0; background:url(../images/common/bar_1x18_e4e5e0.gif) no-repeat left bottom;} +.memberSmallBox .leftHeaderType { border-top:1px solid #e0e1db; border-left:1px solid #e0e1db; width:100%;} +.memberSmallBox .leftHeaderType th, +.memberSmallBox .leftHeaderType td { border-right:1px solid #e0e1db; border-bottom:1px solid #e0e1db; padding:.8em 1em .6em 1em;} +.memberSmallBox .leftHeaderType th { color:#333333; text-align:left; background:#f5f5f3;} +.memberSmallBox .leftHeaderType td { color:#444444;} +.memberSmallBox .inputTypeText { background:#fbfbfb;} +.memberSmallBox .group { overflow:hidden; padding:.5em 0; margin-top:.7em;} +.memberSmallBox .group select { float:left; width:180px; margin-top:1px;} +.memberSmallBox .pwModify { border:none;} +.memberSmallBox .pwModify legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} +.memberSmallBox .pwModify input { width:9em;} +.memberSmallBox .pwModify br { display:block; margin-bottom:.2em} +.memberSmallBox .pwModify p { text-align:center; margin-top:1em; color:#54564b;} + + +/* messageList */ +.messageList tr.notice .num { font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; font-weight:bold;} + +.messageList th:first-child, +.messageList th.first-child { background-position:-3px bottom;} +.messageList th.check { padding:0;} +.messageList th select, +.messageList th input { vertical-align:middle;} +.messageList th img.go_button { vertical-align:middle; } +.messageList td { padding:.3em; border-bottom:1px solid #EFEFEF;} +.messageList td.noline { border-bottom:none;} +.messageList td.category {} +.messageList tr.notice td { padding:.7em .7em .7em .9em; white-space:nowrap;} +.messageList tr.notice td img { margin:-.1em .3em 0 0;} +.messageList td.thumb { padding:.5em 0 .5em .5em; width:145px; table-layout:fixed; white-space:nowrap;} +.messageList td.thumb * { vertical-align:middle;} +.messageList td.title {} +.messageList td.title.bold { font-size:1em; font-weight:bold;} +.messageList td.title.bold a { position:relative; top:.3em;} +.messageList td.title * { vertical-align:middle;} +.messageList td.title, +.messageList td.title a { color:#444444; text-decoration:none;} +.messageList td.title a:visited { color:#777777;} +.messageList td.author { padding:0 .5em 0 1.3em; color:#333333; font:.95em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;} +.messageList td.author a { font-size:1em; color:#333333;} +.messageList td.reading { font:.8em Tahoma; color:#999999; text-align:center;} +.messageList td.reply { font:bold .8em Tahoma; color:#ff6600; text-align:center;} +.messageList td.date { font:.8em Tahoma; color:#999999; text-align:center;} +.messageList td.registDate { font:.8em Tahoma; color:#999999; text-align:center;} +.messageList td.checkDate { font:.8em Tahoma; color:#333333; text-align:center;} +.messageList td.summary { border-top:none; vertical-align:top; color:#666666; line-height:1.25em;} +.messageList td.summary a { color:#666666; text-decoration:none; line-height:inherit;} +.messageList td.summary a:visited { color:#999999;} +.messageList td.check { text-align:center;} +.messageList td.user { color:#333333; font-size:.9em;} +.messageList td.user a { color:#333333;} +.messageList td.userId { font:.9em Tahoma;} +.messageList td.userNick { font-size:.9em; color:#999999;} +.messageList td.sendMessage { text-align:center; padding:0;} +.messageList td.sendMessage .buttonFixedLeft { position:relative; left:20%; _left:0;} + +.readMessage { margin-bottom:2em;} +.readMessage .messageHeader { padding:1.5em; height:1em; overflow:hidden;} +.readMessage .messageHeader h4 { float:left; padding-left:.5em; font-size:1em; background:url(../images/common/iconArrow99.gif) no-repeat left .3em;} +.readMessage .messageHeader address { float:right; white-space:nowrap;} +.readMessage .messageHeader address em { font-size:.9em; font-style:normal; color:#333333; margin-right:.3em;} +.readMessage .messageHeader address em a { color:#333333;} +.readMessage .messageHeader address .date { font:.8em Tahoma; color:#999999;} +.readMessage .messageBody { border:1px solid #e0e1db; margin:0 1.5em 1.5em 1.5em; padding:1em; position:relative; color:#666666;} +.readMessage .deleteOrKeep { padding:.5em 0; overflow:hidden; background:#f5f5f3; border-top:1px solid #eaebe7; _width:100%;} +.readMessage .deleteOrKeep li { position:relative; left:40%; float:left; margin-right:.5em;} + +.joinTable { margin-bottom:1em; } +.joinTable.typeC { border-top:2px solid #ee2b33; border-bottom:2px solid #ee2b33; border-collapse:collapse;} +.joinTable.typeB caption { border-top:1px dashed #919191; background:#f9f9f9;} +.joinTable { width:100%;} +.joinTable caption { padding:2em 0 .5em 1.5em; font-weight:bold; text-align:left; background:url(../images/common/iconH3.gif) no-repeat .5em 2em;} +.joinTable th, +.joinTable td { padding:.7em .5em .7em 1.5em; text-align:left; border-top:1px solid #eff0eb;} +.joinTable td { background:url(../images/common/bar_1x18_e4e5e0.gif) no-repeat left bottom;} +.joinTable th { width:10em;} +.joinTable td textarea { width:40em; height:4.5em; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:3px; line-height:1em; background:#fbfbfb; vertical-align:middle; float:left; margin-right:.5em; margin-bottom:.5em; color:#666666; overflow:auto;} +.joinTable td input { border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:3px; height:1em; line-height:1em; background:#fbfbfb; vertical-align:middle; float:left; margin-right:.5em; margin-bottom:.5em; color:#666666;} +.joinTable td input.radio, +.joinTable td input.check { border:none; padding:0; margin:0; background:none; margin-top:.4em;} +.joinTable td input.w4em { width:4em;} +.joinTable td input.w2em { width:2em;} +.joinTable td select { float:left; margin-right:.5em;} +.joinTable td .fl { margin-right:.5em;} +.joinTable td br { clear:both;} +.joinTable td p { float:left; font-size:.9em; color:#999999; padding-top:.5em; margin-right:.5em;} +.extendDesc { clear:both; margin-top:0; font-size:.9em; color:#999999; } +.joinTable td label { float:left; color:#3f4040; padding-top:.3em; margin-right:.5em;} +.joinTable td a { color:#333333;} +.joinTable li { list-style:none; display:block; white-space:nowrap; float:left; padding-right:1em;} +.joinTable .no_line { border:none;} +.join_button { margin:1em 0 0 0; text-align:center;} +.joinTable .add_info { padding:2.5em .5em .7em 1.5em; background:#f9f9f9; border-top:1px dashed #919191;} +.buttonTypeWrite.join { margin-top:1.2em;} + +/* ----- Member | End ----- */ + + +.memberSmallBox .inputPassword { position:relative; border:none; padding:2em 2em 1.5em 2em;} +.memberSmallBox .inputPassword .inputTypeText { float:left; margin-right:.5em; width:8em;} +.memberSmallBox .inputPassword legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} + +/* member info */ +.memberInfoTable { width:100%; border:1px solid #e0e1db; margin-bottom:10px;} +.memberInfoTable caption { padding:2em 0 .5em 1.5em; font-weight:bold; text-align:left; background:url(../images/common/iconH3.gif) no-repeat .5em 2em;} +.memberInfoTable tr.first-child th, .memberInfoTable tr.first-child td { border-top:none;} +.memberInfoTable th, .memberInfoTable td { border-top:1px solid #eaebe7; padding:.5em;} +.memberInfoTable th { background:#f5f5f3; text-align:left; padding:.5em 1em;} +.memberInfoTable td { border-left:1px solid #eaebe7;} +.memberInfoTable td input { border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:3px; height:1em; line-height:1em; background:#fbfbfb; vertical-align:middle; float:left; margin-right:.5em; margin-bottom:.5em; color:#666666;} +.memberInfoTable td input.radio, .memberInfoTable td input.check { border:none; padding:0; margin:0; background:none; margin-top:.4em;} +.memberInfoTable td input.w4em { width:4em;} +.memberInfoTable td input.w2em { width:2em;} +.memberInfoTable td select { float:left; margin-right:.5em;} +.memberInfoTable td .fl { margin-right:.5em;} +.memberInfoTable td br { clear:both;} +.memberInfoTable td p { float:left; font-size:.9em; color:#999999; padding-top:.5em; margin-right:.5em;} +.memberInfoTable td label { float:left; color:#3f4040; padding-top:.3em; margin-right:.5em;} +.memberInfoTable td .checkbox { border:none; } diff --git a/modules/member/skins/cozy_simple/css/green.css b/modules/member/skins/cozy_simple/css/green.css new file mode 100644 index 000000000..70db317ad --- /dev/null +++ b/modules/member/skins/cozy_simple/css/green.css @@ -0,0 +1,34 @@ +@charset "utf-8"; + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; background:#8dc63f url(../images/green/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.boardList { width:100%; position:relative; border-bottom:2px solid #8dc63f; border-collapse:collapse; } +.memberList th.repeat_bg { background:#ffffff url(../images/green/bg_title_repeat_x.gif) repeat-x left bottom;} +.memberList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/green/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.messageList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/green/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.messageList th.author { background:url(../images/green/bg_title_repeat_x.gif) repeat-x left bottom; text-align:left;} +.messageList { width:100%; position:relative; border-bottom:2px solid #8dc63f; border-collapse:collapse; margin-bottom:2.2em;} +.memberList { width:100%; position:relative; border-bottom:2px solid #8dc63f; border-collapse:collapse; margin-bottom:2.2em;} +.joinTable.typeA { border-top:2px solid #8dc63f; border-collapse:collapse;} +.joinTable.typeB { border-bottom:2px solid #8dc63f; background:#f9f9f9;} +.messageList td.recommend { font:bold .8em Tahoma; color:#8dc63f; text-align:center;} +.memberInformation .friendNum strong { font:bold 11px Tahoma; color:#8dc63f;} +.memberInformation .instantMessage li a strong { font:bold 0.75em tahoma; color:#8dc63f;} +.memberSmallBox .header { position:relative; _width:100%; background:#8dc63f; overflow:hidden;} +.memberSmallBox .open_id_help { background:#F7F7F7; border-top:1px solid #8dc63f; border-bottom:2px solid #8dc63f; overflow:hidden; padding:1.1em; text-align:left; } +.memberSmallBox .help { background:#F7F7F7; border-top:1px solid #8dc63f; border-bottom:2px solid #8dc63f; overflow:hidden; padding:1.1em; text-align:center; } + +.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/green/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#27a939; cursor:default; position:relative; top:-.2em;} +.boardList td.recommend { font:bold .8em Tahoma; color:#27a939; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#27a939; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #8dc63f;} +.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #8dc63f; overflow:hidden;} +.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#8dc63f;} + +.boardWrite fieldset.bottomBorder { border-bottom:2px solid #8dc63f;} +.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/green/bg_title_norepeat.gif) no-repeat left bottom;} +.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/green/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} + diff --git a/modules/member/skins/cozy_simple/css/pink.css b/modules/member/skins/cozy_simple/css/pink.css new file mode 100644 index 000000000..6df194a6a --- /dev/null +++ b/modules/member/skins/cozy_simple/css/pink.css @@ -0,0 +1,33 @@ +@charset "utf-8"; + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; background:#f70795 url(../images/pink/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.boardList { width:100%; position:relative; border-bottom:2px solid #f70795; border-collapse:collapse; } +.memberList th.repeat_bg { background:#ffffff url(../images/pink/bg_title_repeat_x.gif) repeat-x left bottom;} +.memberList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/pink/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.memberList { width:100%; position:relative; border-bottom:2px solid #f70795; border-collapse:collapse; margin-bottom:2.2em;} +.messageList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/pink/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.messageList th.author { background:url(../images/pink/bg_title_repeat_x.gif) repeat-x left bottom; text-align:left;} +.messageList { width:100%; position:relative; border-bottom:2px solid #f70795; border-collapse:collapse; margin-bottom:2.2em;} +.joinTable.typeA { border-top:2px solid #f70795; border-collapse:collapse;} +.joinTable.typeB { border-bottom:2px solid #f70795; background:#f9f9f9;} +.messageList td.recommend { font:bold .8em Tahoma; color:#f70795; text-align:center;} +.memberInformation .friendNum strong { font:bold 11px Tahoma; color:#f70795;} +.memberInformation .instantMessage li a strong { font:bold 0.75em tahoma; color:#f70795;} +.memberSmallBox .header { position:relative; _width:100%; background:#f70795; overflow:hidden;} +.memberSmallBox .open_id_help { background:#F7F7F7; border-top:1px solid #f70795; border-bottom:2px solid #f70795; overflow:hidden; padding:1.1em; text-align:left; } +.memberSmallBox .help { background:#F7F7F7; border-top:1px solid #f70795; border-bottom:2px solid #f70795; overflow:hidden; padding:1.1em; text-align:center; } + +.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/pink/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#f70795; cursor:default; position:relative; top:-.2em;} +.boardList td.recommend { font:bold .8em Tahoma; color:#f70795; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#f70795; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #f70795;} +.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #f70795; overflow:hidden;} +.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#f70795;} + +.boardWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;} +.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/pink/bg_title_norepeat.gif) no-repeat left bottom;} +.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/pink/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} diff --git a/modules/member/skins/cozy_simple/css/red.css b/modules/member/skins/cozy_simple/css/red.css new file mode 100644 index 000000000..c1561cf50 --- /dev/null +++ b/modules/member/skins/cozy_simple/css/red.css @@ -0,0 +1,33 @@ +@charset "utf-8"; + +/* boardHeader */ +.boardHeader { position:relative; _width:100%; background:#ED2027 url(../images/red/bg_top_title.gif) no-repeat 23px top; overflow:hidden;} +.boardList { width:100%; position:relative; border-bottom:2px solid #ed2a32; border-collapse:collapse; } +.memberList th.repeat_bg { background:#ffffff url(../images/red/bg_title_repeat_x.gif) repeat-x left bottom;} +.memberList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/red/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.memberList { width:100%; position:relative; border-bottom:2px solid #ED2A32; border-collapse:collapse; margin-bottom:2.2em;} +.messageList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/red/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.messageList th.author { background:url(../images/red/bg_title_repeat_x.gif) repeat-x left bottom; text-align:left;} +.messageList { width:100%; position:relative; border-bottom:2px solid #ed2a32; border-collapse:collapse; margin-bottom:2.2em;} +.joinTable.typeA { border-top:2px solid #ee1b24; border-collapse:collapse;} +.joinTable.typeB { border-bottom:2px solid #ee1b24; background:#f9f9f9;} +.messageList td.recommend { font:bold .8em Tahoma; color:#ec2127; text-align:center;} +.memberInformation .friendNum strong { font:bold 11px Tahoma; color:#ec2127;} +.memberInformation .instantMessage li a strong { font:bold 0.75em tahoma; color:#ee202a;} +.memberSmallBox .header { position:relative; _width:100%; background:#ed2027; overflow:hidden;} +.memberSmallBox .open_id_help { background:#F7F7F7; border-top:1px solid #ed2a32; border-bottom:2px solid #ee2b33; overflow:hidden; padding:1.1em; text-align:left; } +.memberSmallBox .help { background:#F7F7F7; border-top:1px solid #ed2a32; border-bottom:2px solid #ee2b33; overflow:hidden; padding:1.1em; text-align:center; } + +.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/red/bg_title.gif) no-repeat left bottom; white-space:nowrap;} +.boardList td .replyAndTrackback { font:.8em Tahoma; color:#ed1f29; cursor:default; position:relative; top:-.2em;} +.boardList td.recommend { font:bold .8em Tahoma; color:#ec2127; text-align:center;} + +.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#ff6600; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #ed2228;} +.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #ee202a; overflow:hidden;} +.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#eb1c22;} + +.boardWrite fieldset.bottomBorder { border-bottom:2px solid #ed1b24;} +.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/red/bg_title_norepeat.gif) no-repeat left bottom;} +.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/red/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;} diff --git a/modules/member/skins/cozy_simple/document_list.html b/modules/member/skins/cozy_simple/document_list.html new file mode 100644 index 000000000..b96361d20 --- /dev/null +++ b/modules/member/skins/cozy_simple/document_list.html @@ -0,0 +1,78 @@ +{@ $member_title = $lang->cmd_view_own_document } + + + +
    + Total : {number_format($total_count)}, + Page {number_format($page)}/{number_format($total_page)} +
    + + + ++++++ + + + + + + + + + + + + + + + + + + + +
    {$lang->no} +
    + + +
    +
    {$lang->readed_count}{$lang->voted_count}{$lang->date}
    {$no} + {htmlspecialchars($module_list[$oDocument->get('module_srl')]->browser_title)} - + {$oDocument->getTitleText()} + + + [{$oDocument->getCommentCount()}] + + + + [{$oDocument->getTrackbackCount()}] + + {$oDocument->get('readed_count')}{$oDocument->get('voted_count')}{$oDocument->getRegdate("Y-m-d")}
    + + + + + + + + diff --git a/modules/member/skins/cozy_simple/filter/add_friend.xml b/modules/member/skins/cozy_simple/filter/add_friend.xml new file mode 100644 index 000000000..9f48f408d --- /dev/null +++ b/modules/member/skins/cozy_simple/filter/add_friend.xml @@ -0,0 +1,9 @@ + +
    + + + + + + + diff --git a/modules/member/skins/cozy_simple/filter/add_friend_group.xml b/modules/member/skins/cozy_simple/filter/add_friend_group.xml new file mode 100644 index 000000000..2db9891e2 --- /dev/null +++ b/modules/member/skins/cozy_simple/filter/add_friend_group.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/modules/member/skins/cozy_simple/filter/delete_checked_friend.xml b/modules/member/skins/cozy_simple/filter/delete_checked_friend.xml new file mode 100644 index 000000000..7fda453f2 --- /dev/null +++ b/modules/member/skins/cozy_simple/filter/delete_checked_friend.xml @@ -0,0 +1 @@ + diff --git a/modules/member/skins/cozy_simple/filter/delete_checked_message.xml b/modules/member/skins/cozy_simple/filter/delete_checked_message.xml new file mode 100644 index 000000000..93c79a67c --- /dev/null +++ b/modules/member/skins/cozy_simple/filter/delete_checked_message.xml @@ -0,0 +1 @@ + diff --git a/modules/member/skins/cozy_simple/filter/delete_friend_group.xml b/modules/member/skins/cozy_simple/filter/delete_friend_group.xml new file mode 100644 index 000000000..b6246a07f --- /dev/null +++ b/modules/member/skins/cozy_simple/filter/delete_friend_group.xml @@ -0,0 +1 @@ + diff --git a/modules/member/skins/cozy_simple/filter/delete_image_mark.xml b/modules/member/skins/cozy_simple/filter/delete_image_mark.xml new file mode 100644 index 000000000..95ae69d58 --- /dev/null +++ b/modules/member/skins/cozy_simple/filter/delete_image_mark.xml @@ -0,0 +1,2 @@ + + diff --git a/modules/member/skins/cozy_simple/filter/delete_image_name.xml b/modules/member/skins/cozy_simple/filter/delete_image_name.xml new file mode 100644 index 000000000..70efc0365 --- /dev/null +++ b/modules/member/skins/cozy_simple/filter/delete_image_name.xml @@ -0,0 +1 @@ + diff --git a/modules/member/skins/cozy_simple/filter/leave_member.xml b/modules/member/skins/cozy_simple/filter/leave_member.xml new file mode 100644 index 000000000..18eb8287d --- /dev/null +++ b/modules/member/skins/cozy_simple/filter/leave_member.xml @@ -0,0 +1,12 @@ + +
    + + + + + + + + + +
    diff --git a/modules/member/skins/cozy_simple/filter/login.xml b/modules/member/skins/cozy_simple/filter/login.xml new file mode 100644 index 000000000..442dfd16e --- /dev/null +++ b/modules/member/skins/cozy_simple/filter/login.xml @@ -0,0 +1,11 @@ + +
    + + + + + + + + +
    diff --git a/modules/member/skins/cozy_simple/filter/logout.xml b/modules/member/skins/cozy_simple/filter/logout.xml new file mode 100644 index 000000000..3dacc54e3 --- /dev/null +++ b/modules/member/skins/cozy_simple/filter/logout.xml @@ -0,0 +1,7 @@ + +
    + + + + + diff --git a/modules/member/skins/cozy_simple/filter/modify_info.xml b/modules/member/skins/cozy_simple/filter/modify_info.xml new file mode 100644 index 000000000..3a40aab79 --- /dev/null +++ b/modules/member/skins/cozy_simple/filter/modify_info.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + +
    diff --git a/modules/member/skins/cozy_simple/filter/modify_password.xml b/modules/member/skins/cozy_simple/filter/modify_password.xml new file mode 100644 index 000000000..242a7f9cc --- /dev/null +++ b/modules/member/skins/cozy_simple/filter/modify_password.xml @@ -0,0 +1,15 @@ + +
    + + + + + + + + + + + + +
    diff --git a/modules/member/skins/cozy_simple/filter/move_friend.xml b/modules/member/skins/cozy_simple/filter/move_friend.xml new file mode 100644 index 000000000..de31a8025 --- /dev/null +++ b/modules/member/skins/cozy_simple/filter/move_friend.xml @@ -0,0 +1 @@ + diff --git a/modules/member/skins/cozy_simple/filter/openid_login.xml b/modules/member/skins/cozy_simple/filter/openid_login.xml new file mode 100644 index 000000000..61bba2ff2 --- /dev/null +++ b/modules/member/skins/cozy_simple/filter/openid_login.xml @@ -0,0 +1,10 @@ + +
    + + + + + + + +
    diff --git a/modules/member/skins/cozy_simple/filter/send_message.xml b/modules/member/skins/cozy_simple/filter/send_message.xml new file mode 100644 index 000000000..2756c3398 --- /dev/null +++ b/modules/member/skins/cozy_simple/filter/send_message.xml @@ -0,0 +1,12 @@ + +
    + + + + + + + + + +
    diff --git a/modules/member/skins/cozy_simple/filter/signup.xml b/modules/member/skins/cozy_simple/filter/signup.xml new file mode 100644 index 000000000..8765250c6 --- /dev/null +++ b/modules/member/skins/cozy_simple/filter/signup.xml @@ -0,0 +1,28 @@ + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    diff --git a/modules/member/skins/cozy_simple/friends_list.html b/modules/member/skins/cozy_simple/friends_list.html new file mode 100644 index 000000000..0f6839038 --- /dev/null +++ b/modules/member/skins/cozy_simple/friends_list.html @@ -0,0 +1,103 @@ +{@ $member_title = $lang->cmd_view_friend } + + + + + +
    + +
    + {$lang->friend} {$total_count} + + + {$lang->cmd_modify} + {$lang->cmd_delete} + {$lang->cmd_add_friend_group} + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GO + {$lang->user_id}{$lang->user_name}{$lang->nick_name}{$lang->regdate}{$lang->cmd_send_message}
    {$val->group_title?$val->group_title:" "}{$val->user_id}{$val->user_name}
    {$val->nick_name}
    {zdate($val->regdate,"Y-m-d")}{$lang->cmd_send_message}
    + + + + +
    + +
    + + + + +
    + + + +
    + +
    + + + diff --git a/modules/member/skins/cozy_simple/images/blank.gif b/modules/member/skins/cozy_simple/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/blank.gif differ diff --git a/modules/member/skins/cozy_simple/images/blue/bg_title.gif b/modules/member/skins/cozy_simple/images/blue/bg_title.gif new file mode 100644 index 000000000..ff67b452b Binary files /dev/null and b/modules/member/skins/cozy_simple/images/blue/bg_title.gif differ diff --git a/modules/member/skins/cozy_simple/images/blue/bg_title_norepeat.gif b/modules/member/skins/cozy_simple/images/blue/bg_title_norepeat.gif new file mode 100644 index 000000000..aec4de0b0 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/blue/bg_title_norepeat.gif differ diff --git a/modules/member/skins/cozy_simple/images/blue/bg_title_repeat_x.gif b/modules/member/skins/cozy_simple/images/blue/bg_title_repeat_x.gif new file mode 100644 index 000000000..9bd0aebb6 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/blue/bg_title_repeat_x.gif differ diff --git a/modules/member/skins/cozy_simple/images/blue/bg_top_title.gif b/modules/member/skins/cozy_simple/images/blue/bg_top_title.gif new file mode 100644 index 000000000..99eecde67 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/blue/bg_top_title.gif differ diff --git a/modules/member/skins/cozy_simple/images/bluish_green/bg_title.gif b/modules/member/skins/cozy_simple/images/bluish_green/bg_title.gif new file mode 100644 index 000000000..c5cf6b136 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/bluish_green/bg_title.gif differ diff --git a/modules/member/skins/cozy_simple/images/bluish_green/bg_title_norepeat.gif b/modules/member/skins/cozy_simple/images/bluish_green/bg_title_norepeat.gif new file mode 100644 index 000000000..227cf252b Binary files /dev/null and b/modules/member/skins/cozy_simple/images/bluish_green/bg_title_norepeat.gif differ diff --git a/modules/member/skins/cozy_simple/images/bluish_green/bg_title_repeat_x.gif b/modules/member/skins/cozy_simple/images/bluish_green/bg_title_repeat_x.gif new file mode 100644 index 000000000..34db1532c Binary files /dev/null and b/modules/member/skins/cozy_simple/images/bluish_green/bg_title_repeat_x.gif differ diff --git a/modules/member/skins/cozy_simple/images/bluish_green/bg_top_title.gif b/modules/member/skins/cozy_simple/images/bluish_green/bg_top_title.gif new file mode 100644 index 000000000..160682e41 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/bluish_green/bg_top_title.gif differ diff --git a/modules/member/skins/cozy_simple/images/bottomGotoFirst.gif b/modules/member/skins/cozy_simple/images/bottomGotoFirst.gif new file mode 100644 index 000000000..e0297fecb Binary files /dev/null and b/modules/member/skins/cozy_simple/images/bottomGotoFirst.gif differ diff --git a/modules/member/skins/cozy_simple/images/bottomGotoLast.gif b/modules/member/skins/cozy_simple/images/bottomGotoLast.gif new file mode 100644 index 000000000..0a7141d0d Binary files /dev/null and b/modules/member/skins/cozy_simple/images/bottomGotoLast.gif differ diff --git a/modules/member/skins/cozy_simple/images/button_go.gif b/modules/member/skins/cozy_simple/images/button_go.gif new file mode 100755 index 000000000..895d1a078 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/button_go.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/bar_1x18_e4e5e0.gif b/modules/member/skins/cozy_simple/images/common/bar_1x18_e4e5e0.gif new file mode 100644 index 000000000..aab8a858c Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/bar_1x18_e4e5e0.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/bar_1x7_c0c0c0.gif b/modules/member/skins/cozy_simple/images/common/bar_1x7_c0c0c0.gif new file mode 100644 index 000000000..1d2f92ff7 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/bar_1x7_c0c0c0.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/bar_1x8_c0c0c0.gif b/modules/member/skins/cozy_simple/images/common/bar_1x8_c0c0c0.gif new file mode 100644 index 000000000..f37814f58 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/bar_1x8_c0c0c0.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/bg_repeat_x_eaeaea.gif b/modules/member/skins/cozy_simple/images/common/bg_repeat_x_eaeaea.gif new file mode 100644 index 000000000..0b011fe5d Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/bg_repeat_x_eaeaea.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn4_rss.gif b/modules/member/skins/cozy_simple/images/common/btn4_rss.gif new file mode 100644 index 000000000..50584f6d5 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn4_rss.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_add_group.gif b/modules/member/skins/cozy_simple/images/common/btn_add_group.gif new file mode 100644 index 000000000..e4b264572 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_add_group.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_admin.gif b/modules/member/skins/cozy_simple/images/common/btn_admin.gif new file mode 100644 index 000000000..bea6e158e Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_admin.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_cancel.gif b/modules/member/skins/cozy_simple/images/common/btn_cancel.gif new file mode 100644 index 000000000..65b303e06 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_cancel.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_cancel2.gif b/modules/member/skins/cozy_simple/images/common/btn_cancel2.gif new file mode 100644 index 000000000..dc6e196f2 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_cancel2.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_cancel3.gif b/modules/member/skins/cozy_simple/images/common/btn_cancel3.gif new file mode 100644 index 000000000..5dfcfd0b7 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_cancel3.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_delete.gif b/modules/member/skins/cozy_simple/images/common/btn_delete.gif new file mode 100644 index 000000000..84a26c508 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_delete.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_delete2.gif b/modules/member/skins/cozy_simple/images/common/btn_delete2.gif new file mode 100644 index 000000000..1fcb5e906 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_delete2.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_edit.gif b/modules/member/skins/cozy_simple/images/common/btn_edit.gif new file mode 100644 index 000000000..3f7bd62b1 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_edit.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_findid.gif b/modules/member/skins/cozy_simple/images/common/btn_findid.gif new file mode 100644 index 000000000..de53c3d16 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_findid.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_findpw.gif b/modules/member/skins/cozy_simple/images/common/btn_findpw.gif new file mode 100644 index 000000000..26f254d9a Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_findpw.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_joinus.gif b/modules/member/skins/cozy_simple/images/common/btn_joinus.gif new file mode 100644 index 000000000..beed35641 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_joinus.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_list.gif b/modules/member/skins/cozy_simple/images/common/btn_list.gif new file mode 100644 index 000000000..8e56215c8 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_list.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_login.gif b/modules/member/skins/cozy_simple/images/common/btn_login.gif new file mode 100644 index 000000000..3488d0466 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_login.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_logout.gif b/modules/member/skins/cozy_simple/images/common/btn_logout.gif new file mode 100644 index 000000000..0233282e6 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_logout.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_manage.gif b/modules/member/skins/cozy_simple/images/common/btn_manage.gif new file mode 100755 index 000000000..6f5cd05b7 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_manage.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_modify.gif b/modules/member/skins/cozy_simple/images/common/btn_modify.gif new file mode 100644 index 000000000..7b4321472 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_modify.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_my.gif b/modules/member/skins/cozy_simple/images/common/btn_my.gif new file mode 100644 index 000000000..72e626189 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_my.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_ok.gif b/modules/member/skins/cozy_simple/images/common/btn_ok.gif new file mode 100644 index 000000000..93ff914df Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_ok.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_preview.gif b/modules/member/skins/cozy_simple/images/common/btn_preview.gif new file mode 100755 index 000000000..e66ee6ca5 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_preview.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_print.gif b/modules/member/skins/cozy_simple/images/common/btn_print.gif new file mode 100755 index 000000000..56e0efb04 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_print.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_reply.gif b/modules/member/skins/cozy_simple/images/common/btn_reply.gif new file mode 100644 index 000000000..1482218b6 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_reply.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_reply2.gif b/modules/member/skins/cozy_simple/images/common/btn_reply2.gif new file mode 100644 index 000000000..5f34a2ea8 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_reply2.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_rss.gif b/modules/member/skins/cozy_simple/images/common/btn_rss.gif new file mode 100755 index 000000000..424624cfd Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_rss.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_sand.gif b/modules/member/skins/cozy_simple/images/common/btn_sand.gif new file mode 100644 index 000000000..297889ca9 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_sand.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_sand2.gif b/modules/member/skins/cozy_simple/images/common/btn_sand2.gif new file mode 100644 index 000000000..d101204f4 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_sand2.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_scrap.gif b/modules/member/skins/cozy_simple/images/common/btn_scrap.gif new file mode 100755 index 000000000..29d9beb44 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_scrap.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_search.gif b/modules/member/skins/cozy_simple/images/common/btn_search.gif new file mode 100644 index 000000000..0a12014d3 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_search.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_vote.gif b/modules/member/skins/cozy_simple/images/common/btn_vote.gif new file mode 100755 index 000000000..5a637cb0e Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_vote.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/btn_write.gif b/modules/member/skins/cozy_simple/images/common/btn_write.gif new file mode 100644 index 000000000..53a2e1cf0 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/btn_write.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/buttonAscending.gif b/modules/member/skins/cozy_simple/images/common/buttonAscending.gif new file mode 100644 index 000000000..b405cc323 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/buttonAscending.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/buttonDescending.gif b/modules/member/skins/cozy_simple/images/common/buttonDescending.gif new file mode 100644 index 000000000..2dc5575ff Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/buttonDescending.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/buttonTypeInput24.gif b/modules/member/skins/cozy_simple/images/common/buttonTypeInput24.gif new file mode 100644 index 000000000..0dcfc0e3d Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/buttonTypeInput24.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/iconArrow.gif b/modules/member/skins/cozy_simple/images/common/iconArrow.gif new file mode 100644 index 000000000..267b36495 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/iconArrow.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/iconArrow99.gif b/modules/member/skins/cozy_simple/images/common/iconArrow99.gif new file mode 100644 index 000000000..15c36291e Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/iconArrow99.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/iconFile.gif b/modules/member/skins/cozy_simple/images/common/iconFile.gif new file mode 100644 index 000000000..d48f9c181 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/iconFile.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/iconTag.gif b/modules/member/skins/cozy_simple/images/common/iconTag.gif new file mode 100644 index 000000000..ecfdb5585 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/iconTag.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/icon_arrow_reply.gif b/modules/member/skins/cozy_simple/images/common/icon_arrow_reply.gif new file mode 100644 index 000000000..bbabbd7ea Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/icon_arrow_reply.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/icon_gofirst.gif b/modules/member/skins/cozy_simple/images/common/icon_gofirst.gif new file mode 100644 index 000000000..68ba6ef96 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/icon_gofirst.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/icon_golast.gif b/modules/member/skins/cozy_simple/images/common/icon_golast.gif new file mode 100644 index 000000000..f2450047d Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/icon_golast.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/icon_notice.gif b/modules/member/skins/cozy_simple/images/common/icon_notice.gif new file mode 100644 index 000000000..d9fb255f3 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/icon_notice.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/txt3_total_friend.gif b/modules/member/skins/cozy_simple/images/common/txt3_total_friend.gif new file mode 100644 index 000000000..bdce426e6 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/txt3_total_friend.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/txt_date.gif b/modules/member/skins/cozy_simple/images/common/txt_date.gif new file mode 100644 index 000000000..524d2d782 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/txt_date.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/txt_hit.gif b/modules/member/skins/cozy_simple/images/common/txt_hit.gif new file mode 100644 index 000000000..cc9771319 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/txt_hit.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/txt_hot.gif b/modules/member/skins/cozy_simple/images/common/txt_hot.gif new file mode 100644 index 000000000..34e12c1ee Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/txt_hot.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/txt_id.gif b/modules/member/skins/cozy_simple/images/common/txt_id.gif new file mode 100644 index 000000000..824c5f158 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/txt_id.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/txt_name.gif b/modules/member/skins/cozy_simple/images/common/txt_name.gif new file mode 100644 index 000000000..789dba359 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/txt_name.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/txt_nickname.gif b/modules/member/skins/cozy_simple/images/common/txt_nickname.gif new file mode 100644 index 000000000..6c8594649 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/txt_nickname.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/txt_option.gif b/modules/member/skins/cozy_simple/images/common/txt_option.gif new file mode 100644 index 000000000..9cb5202b7 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/txt_option.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/txt_pw.gif b/modules/member/skins/cozy_simple/images/common/txt_pw.gif new file mode 100644 index 000000000..4f7bc706f Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/txt_pw.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/txt_sand.gif b/modules/member/skins/cozy_simple/images/common/txt_sand.gif new file mode 100644 index 000000000..158fd34f6 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/txt_sand.gif differ diff --git a/modules/member/skins/cozy_simple/images/common/txt_title.gif b/modules/member/skins/cozy_simple/images/common/txt_title.gif new file mode 100644 index 000000000..34125f7a7 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/common/txt_title.gif differ diff --git a/modules/member/skins/cozy_simple/images/green/bg_title.gif b/modules/member/skins/cozy_simple/images/green/bg_title.gif new file mode 100644 index 000000000..9223e8058 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/green/bg_title.gif differ diff --git a/modules/member/skins/cozy_simple/images/green/bg_title_norepeat.gif b/modules/member/skins/cozy_simple/images/green/bg_title_norepeat.gif new file mode 100644 index 000000000..57aa0ebea Binary files /dev/null and b/modules/member/skins/cozy_simple/images/green/bg_title_norepeat.gif differ diff --git a/modules/member/skins/cozy_simple/images/green/bg_title_repeat_x.gif b/modules/member/skins/cozy_simple/images/green/bg_title_repeat_x.gif new file mode 100644 index 000000000..909498c61 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/green/bg_title_repeat_x.gif differ diff --git a/modules/member/skins/cozy_simple/images/green/bg_top_title.gif b/modules/member/skins/cozy_simple/images/green/bg_top_title.gif new file mode 100644 index 000000000..95cfa0245 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/green/bg_top_title.gif differ diff --git a/modules/member/skins/cozy_simple/images/openid_input_bg.gif b/modules/member/skins/cozy_simple/images/openid_input_bg.gif new file mode 100644 index 000000000..cde836c89 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/openid_input_bg.gif differ diff --git a/modules/member/skins/cozy_simple/images/pink/bg_title.gif b/modules/member/skins/cozy_simple/images/pink/bg_title.gif new file mode 100644 index 000000000..4c587d473 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/pink/bg_title.gif differ diff --git a/modules/member/skins/cozy_simple/images/pink/bg_title_norepeat.gif b/modules/member/skins/cozy_simple/images/pink/bg_title_norepeat.gif new file mode 100644 index 000000000..80a473e84 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/pink/bg_title_norepeat.gif differ diff --git a/modules/member/skins/cozy_simple/images/pink/bg_title_repeat_x.gif b/modules/member/skins/cozy_simple/images/pink/bg_title_repeat_x.gif new file mode 100644 index 000000000..0ab53486c Binary files /dev/null and b/modules/member/skins/cozy_simple/images/pink/bg_title_repeat_x.gif differ diff --git a/modules/member/skins/cozy_simple/images/pink/bg_top_title.gif b/modules/member/skins/cozy_simple/images/pink/bg_top_title.gif new file mode 100644 index 000000000..d218b2a9e Binary files /dev/null and b/modules/member/skins/cozy_simple/images/pink/bg_top_title.gif differ diff --git a/modules/member/skins/cozy_simple/images/red/bg_title.gif b/modules/member/skins/cozy_simple/images/red/bg_title.gif new file mode 100644 index 000000000..f693fc693 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/red/bg_title.gif differ diff --git a/modules/member/skins/cozy_simple/images/red/bg_title_norepeat.gif b/modules/member/skins/cozy_simple/images/red/bg_title_norepeat.gif new file mode 100644 index 000000000..f1b2417f5 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/red/bg_title_norepeat.gif differ diff --git a/modules/member/skins/cozy_simple/images/red/bg_title_repeat_x.gif b/modules/member/skins/cozy_simple/images/red/bg_title_repeat_x.gif new file mode 100644 index 000000000..8c9219098 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/red/bg_title_repeat_x.gif differ diff --git a/modules/member/skins/cozy_simple/images/red/bg_top_title.gif b/modules/member/skins/cozy_simple/images/red/bg_top_title.gif new file mode 100644 index 000000000..c4ae66243 Binary files /dev/null and b/modules/member/skins/cozy_simple/images/red/bg_top_title.gif differ diff --git a/modules/member/skins/cozy_simple/js/member.js b/modules/member/skins/cozy_simple/js/member.js new file mode 100644 index 000000000..92b4c3d45 --- /dev/null +++ b/modules/member/skins/cozy_simple/js/member.js @@ -0,0 +1,226 @@ +/* 사용자 추가 */ +function completeInsert(ret_obj, response_tags, args, fo_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var redirect_url = ret_obj['redirect_url']; + + alert(message); + + if(redirect_url) location.href = redirect_url; + else location.href = current_url.setQuery('act',''); +} + +/* 정보 수정 */ +function completeModify(ret_obj, response_tags, args, fo_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + alert(message); + + location.href = current_url.setQuery('act','dispMemberInfo'); +} + +/* 회원 탈퇴 */ +function completeLeave(ret_obj, response_tags, args, fo_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + alert(message); + + location.href = current_url.setQuery('act',''); +} + +/* 이미지 업로드 */ +function _doUploadImage(fo_obj, act) { + // 업로드용 iframe을 생성 + if(!xGetElementById('tmp_upload_iframe')) { + if(xIE4Up) { + window.document.body.insertAdjacentHTML("afterEnd", ""); + } else { + var obj_iframe = xCreateElement('IFRAME'); + obj_iframe.name = obj_iframe.id = 'tmp_upload_iframe'; + obj_iframe.style.display = 'none'; + obj_iframe.style.width = '1px'; + obj_iframe.style.height = '1px'; + obj_iframe.style.position = 'absolute'; + obj_iframe.style.top = '-10px'; + obj_iframe.style.left = '-10px'; + window.document.body.appendChild(obj_iframe); + } + } + + fo_obj.target = "tmp_upload_iframe"; + fo_obj.act.value = act; + fo_obj.submit(); +} + +/* 이미지 이름/마크 등록 */ +function doUploadImageName() { + var fo_obj = xGetElementById("fo_insert_member"); + if(!fo_obj.image_name.value) return; + _doUploadImage(fo_obj, 'procMemberInsertImageName'); +} + +function doUploadImageMark() { + var fo_obj = xGetElementById("fo_insert_member"); + if(!fo_obj.image_mark.value) return; + _doUploadImage(fo_obj, 'procMemberInsertImageMark'); +} + +/* 로그인 영역에 포커스 */ +function doFocusUserId(fo_id) { + var fo_obj = xGetElementById(fo_id); + if(xGetCookie('user_id')) { + fo_obj.user_id.value = xGetCookie('user_id'); + fo_obj.remember_user_id.checked = true; + fo_obj.password.focus(); + } else { + fo_obj.user_id.focus(); + } +} + +/* 로그인 후 */ +function completeLogin(ret_obj, response_tags, params, fo_obj) { + if(fo_obj.remember_user_id && fo_obj.remember_user_id.checked) { + var expire = new Date(); + expire.setTime(expire.getTime()+ (7000 * 24 * 3600000)); + xSetCookie('user_id', fo_obj.user_id.value, expire); + } + + var url = current_url.setQuery('act',''); + location.href = current_url.setQuery('act',''); +} + +/* 로그아웃 후 */ +function completeLogout(ret_obj) { + location.href = current_url.setQuery('act',''); +} + +/* 오픈아이디 로그인 후 */ +function completeOpenIDLogin(ret_obj, response_tags) { + var redirect_url = ret_obj['redirect_url']; + location.href = redirect_url; +} + + +/* 이미지 이름, 마크 삭제 */ +function doDeleteImageName(member_srl) { + var fo_obj = xGetElementById("fo_insert_member"); + fo_obj.member_srl.value = member_srl; + procFilter(fo_obj, delete_image_name); +} + +function doDeleteImageMark(member_srl) { + var fo_obj = xGetElementById("fo_insert_member"); + fo_obj.member_srl.value = member_srl; + procFilter(fo_obj, delete_image_mark); +} + + +/* 쪽지 발송 */ +function completeSendMessage(ret_obj) { + alert(ret_obj['message']); + window.close(); +} + +function doSendMessage(member_srl) { + var url = current_url.setQuery('module','member').setQuery('act','dispMemberSendMessage').setQuery('receiver_srl',member_srl); + popopen(url, 'sendMessage'); +} + +/* 쪽지 모두 선택 */ +function doCheckAll(obj, fo_id) { + var fo_obj = xGetElementById(fo_id); + for(var i=0; imsg_leave_member} + + + + +
    + + + + + + + + + + + + + + + +
    {$lang->user_id}{$member_info->user_id}
    + + +
    + diff --git a/modules/member/skins/cozy_simple/login_form.html b/modules/member/skins/cozy_simple/login_form.html new file mode 100644 index 000000000..02574c7a7 --- /dev/null +++ b/modules/member/skins/cozy_simple/login_form.html @@ -0,0 +1,63 @@ + + + + + +
    + +
    +

    {$lang->cmd_login}

    +
    + +
    + +
    + +
      +
    • {$lang->cmd_signup}
    • +
    +
    + + + +
    + +
    +

    {$lang->openid}

    +
    + +
    + +
    + +
    {$lang->about_openid}
    + +
    + + + + + diff --git a/modules/member/skins/cozy_simple/logout.html b/modules/member/skins/cozy_simple/logout.html new file mode 100644 index 000000000..585f9658a --- /dev/null +++ b/modules/member/skins/cozy_simple/logout.html @@ -0,0 +1,22 @@ + + + +
    + + +
    +
    +

    {$lang->cmd_logout}

    +
    +
    +

    {$lang->confirm_logout}

    +
    + +
      +
    • +
    • {$lang->cmd_back}
    • +
    +
    + +
    + diff --git a/modules/member/skins/cozy_simple/member_info.html b/modules/member/skins/cozy_simple/member_info.html new file mode 100644 index 000000000..203311c72 --- /dev/null +++ b/modules/member/skins/cozy_simple/member_info.html @@ -0,0 +1,108 @@ +{@ $member_title = $lang->cmd_view_member_info } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->member_default_info}
    {$lang->user_id} + {$member_info->user_id} + + ({$lang->denied}) + +
    {$lang->user_name}{htmlspecialchars($member_info->user_name)}
    {$lang->nick_name}{htmlspecialchars($member_info->nick_name)}
    {$lang->image_name}image_name
    {$lang->image_mark}image_mark
    {$lang->homepage}{htmlspecialchars($member_info->homepage)} 
    {$lang->blog}{htmlspecialchars($member_info->blog)} 
    {$lang->birthday}{zdate($member_info->birthday,"Y-m-d")} 
    {$lang->signature}{$member_info->signature}
    {$lang->group}{$val}
    {$lang->signup_date}{zdate($member_info->regdate,"Y-m-d H:i")}
    {$lang->last_login}{zdate($member_info->last_login,"Y-m-d H:i")}
    + + + + + + + {@ $dummy_chk = 0 } + + class="first-child" {@ $dummy_chk = 1; }> + + + + +
    {$lang->member_extend_info}
    {htmlspecialchars($val->column_title)} + + {htmlspecialchars($val->value[0])} - {htmlspecialchars($val->value[1])} - {htmlspecialchars($val->value[2])}  + + {$val->value[0]} {htmlspecialchars($val->value[1])}  + + {htmlspecialchars(implode(",",$val->value))}  + + {zdate($val->value, "Y-m-d")}  + + {htmlspecialchars($val->value)}  + +
    + + + + + diff --git a/modules/member/skins/cozy_simple/member_messages.html b/modules/member/skins/cozy_simple/member_messages.html new file mode 100644 index 000000000..addfa15a5 --- /dev/null +++ b/modules/member/skins/cozy_simple/member_messages.html @@ -0,0 +1,123 @@ + + + {@ $member_title = $val} + + + + + + +
    +
    +

    {$message->title}

    +
    + + +   + + {$message->nick_name} ({$message->user_id}) + + {zdate($message->regdate, "Y.m.d H:i:s")} + +
    +
    + +
    {$message->content}
    + + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + {$lang->receiver} + + {$lang->sender} + + {$lang->title}{$lang->regdate}{$lang->readed_date}
    + +   + +
    {$val->nick_name} ({$val->user_id})
    + +
    + + {$val->title} + + {$val->title} + + {zdate($val->regdate,"Y-m-d")}{zdate($val->readed_date,"Y-m-d H:i:s")} 
    + + + + + +
    + +
    + +
    + + diff --git a/modules/member/skins/cozy_simple/member_new_message.html b/modules/member/skins/cozy_simple/member_new_message.html new file mode 100644 index 000000000..0540e353d --- /dev/null +++ b/modules/member/skins/cozy_simple/member_new_message.html @@ -0,0 +1,46 @@ + + + + +
    + +
    +

    {$lang->message_received}

    +
    + +
    + + + + + + + + + + + + + + + + +
    {$lang->sender}
    {$message->nick_name} ({$message->user_id})
    {$lang->title}{htmlspecialchars($message->title)}
    {$message->content}
    +
    + + +
    + + + + + diff --git a/modules/member/skins/cozy_simple/modify_info.html b/modules/member/skins/cozy_simple/modify_info.html new file mode 100644 index 000000000..504d25381 --- /dev/null +++ b/modules/member/skins/cozy_simple/modify_info.html @@ -0,0 +1,218 @@ +{@ $member_title = $lang->msg_update_member} + + + + + + + + + + + + +
    image_name=='Y' || $member_config->image_mark=='Y')-->enctype="multipart/form-data"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->member_default_info}
    {$lang->user_id}{htmlspecialchars($member_info->user_id)}
    {$lang->user_name}

    {$lang->about_user_name}

    {$lang->nick_name} *

    {$lang->about_nick_name}

    {$lang->email_address}

    {$lang->about_email_address}

    {$lang->image_name} + +
    + image_name + {$lang->cmd_delete} +
    + + +
    +
    + {$lang->cmd_registration} +
    +
    {$lang->image_mark} + +
    + image_mark + {$lang->cmd_delete} +
    + + +
    +
    + {$lang->cmd_registration} +
    +
    {$lang->homepage}

    {$lang->about_homepage}

    {$lang->blog}

    {$lang->about_blog_url}

    {$lang->birthday} * + +
    {zdate($member_info->birthday,"Y-m-d")}
    + {$lang->cmd_open_calendar} +

    {$lang->about_birthday}

    +
    {$lang->allow_mailing}allow_mailing!='N')-->checked="checked" />

    {$lang->about_allow_mailing}

    {$lang->allow_message} + +

    {$lang->about_allow_message}

    +
    {$lang->signature}{$editor}
    + + + + + + + {@ $dummy_chk = 0 } + + class="first-child" {@ $dummy_chk = 1; }> + + + + +
    {$lang->member_extend_info}
    + {htmlspecialchars($val->column_title)} + * + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
    • value)&&in_array($v, $val->value))-->checked="checked"/>{$v}
    • + +
    + + + + + + + + + + + + + + + + + +
    {zdate($val->value,"Y-m-d")}
    + {$lang->cmd_open_calendar} + + + +
    {$val->description}
    +
    + + + +
    + diff --git a/modules/member/skins/cozy_simple/modify_password.html b/modules/member/skins/cozy_simple/modify_password.html new file mode 100644 index 000000000..7338ff5a1 --- /dev/null +++ b/modules/member/skins/cozy_simple/modify_password.html @@ -0,0 +1,40 @@ +{@ $member_title = $lang->cmd_modify_member_password } + + +
    + + + + + + + + + + + + + + + + + + + +
    {$lang->user_id}{$member_info->user_id}
    + +
    + + {$lang->password2} +
    +

    {$lang->about_password}

    +
    + + + + +
    + diff --git a/modules/member/skins/cozy_simple/scrapped_list.html b/modules/member/skins/cozy_simple/scrapped_list.html new file mode 100644 index 000000000..fbf512627 --- /dev/null +++ b/modules/member/skins/cozy_simple/scrapped_list.html @@ -0,0 +1,59 @@ +{@ $member_title = $lang->cmd_view_scrapped_document } + + + +
    + Total : {number_format($total_count)}, + Page {number_format($page)}/{number_format($total_page)} +
    + + + ++++++ + + + + + + + + + + + + + + + + + + + +
    {$lang->no}{$lang->title}{$lang->writer}{$lang->date}{$lang->cmd_delete}
    {$no} + {htmlspecialchars($val->title)} +
    {$val->nick_name}
    {zdate($val->regdate, "Y-m-d H:i")}
    + + + + + + + + diff --git a/modules/member/skins/cozy_simple/screenshot/blue.gif b/modules/member/skins/cozy_simple/screenshot/blue.gif new file mode 100644 index 000000000..c99ed47bc Binary files /dev/null and b/modules/member/skins/cozy_simple/screenshot/blue.gif differ diff --git a/modules/member/skins/cozy_simple/screenshot/bluish_green.gif b/modules/member/skins/cozy_simple/screenshot/bluish_green.gif new file mode 100644 index 000000000..96128c1d3 Binary files /dev/null and b/modules/member/skins/cozy_simple/screenshot/bluish_green.gif differ diff --git a/modules/member/skins/cozy_simple/screenshot/green.gif b/modules/member/skins/cozy_simple/screenshot/green.gif new file mode 100644 index 000000000..023945214 Binary files /dev/null and b/modules/member/skins/cozy_simple/screenshot/green.gif differ diff --git a/modules/member/skins/cozy_simple/screenshot/pink.gif b/modules/member/skins/cozy_simple/screenshot/pink.gif new file mode 100644 index 000000000..cc655f4cf Binary files /dev/null and b/modules/member/skins/cozy_simple/screenshot/pink.gif differ diff --git a/modules/member/skins/cozy_simple/screenshot/red.gif b/modules/member/skins/cozy_simple/screenshot/red.gif new file mode 100644 index 000000000..d2ebc7240 Binary files /dev/null and b/modules/member/skins/cozy_simple/screenshot/red.gif differ diff --git a/modules/member/skins/cozy_simple/send_message.html b/modules/member/skins/cozy_simple/send_message.html new file mode 100644 index 000000000..a001cff0c --- /dev/null +++ b/modules/member/skins/cozy_simple/send_message.html @@ -0,0 +1,47 @@ + + + + +
    + +
    +

    {$lang->cmd_send_message}

    +
    + +
    + + + +
    + + + + + + + + + + + +
    {$receiver_info->nick_name} ({$receiver_info->user_id})
    {$lang->title}
    + +
    + {$editor} +
    + +
    + +
      +
    • +
    • {$lang->cmd_close}
    • +
    + +
    +
    + + + + diff --git a/modules/member/skins/cozy_simple/signup_form.html b/modules/member/skins/cozy_simple/signup_form.html new file mode 100644 index 000000000..438beb8dd --- /dev/null +++ b/modules/member/skins/cozy_simple/signup_form.html @@ -0,0 +1,179 @@ + + + + + +
    +

    {$lang->msg_new_member}

    +
    + +
    + + + + + +
    + {nl2br($member_config->agreement)} +
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->member_default_info}
    {$lang->user_id} *

    {$lang->about_user_id}

    {$lang->password} *

    {$lang->about_password}

    {$lang->password2} *
    {$lang->user_name} *

    {$lang->about_user_name}

    {$lang->nick_name} *

    {$lang->about_nick_name}

    {$lang->email_address} *

    {$lang->about_email_address}

    {$lang->homepage}

    {$lang->about_homepage}

    {$lang->blog}

    {$lang->about_blog_url}

    {$lang->birthday} * + +
     
    + {$lang->cmd_open_calendar} +

    {$lang->about_birthday}

    +
    {$lang->allow_mailing}

    {$lang->about_allow_mailing}

    + + + + + + + + {@ $dummy_chk = 0 } + + class="first-child" {@ $dummy_chk = 1; }> + + + + +
    {$lang->member_extend_info}
    + {htmlspecialchars($val->column_title)} + * + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
    • value)&&in_array($v, $val->value))-->checked="checked"/>{$v}
    • + +
    + + + + + + + + + + + + + + + + + +
    {zdate($val->value,"Y-m-d")}
    + {$lang->cmd_open_calendar} + + + +
    {$val->description}
    +
    + + + +
    + + diff --git a/modules/member/skins/cozy_simple/skin.xml b/modules/member/skins/cozy_simple/skin.xml new file mode 100644 index 000000000..50efd66c9 --- /dev/null +++ b/modules/member/skins/cozy_simple/skin.xml @@ -0,0 +1,65 @@ + + + cozy_simple 회원 스킨 + Cozyシンプル会員スキン + cozy_simple member skin + Cozy样式会员皮肤 + + (주)NHN + (株)NHN + (株)NHN + NHN Corp + + cozy simple 스킨의 갤러리형입니다. + 디자인 : 서기정 (http://blog.naver.com/addcozy) + HTML/CSS : 소지훈 + + + Cozyシンプルスキンのギャラリースタイルです。 + デザイン:ソギジョン(http://blog.naver.com/addcozy) + HTML/CSS:ソジフン + + + This is gallery style of cozy simple skin. + Design : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + Cozy样式会员皮肤。 + 设计 : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + + + 빨간색(기본) + + Red (default) + 红色(默认) + + + 녹색 + + Green + 绿色 + + + 파란색 + + Blue + 蓝色 + + + 분홍색 + ピンク + Pink + 粉红色 + + + 청록색 + 青緑 + Cyan + 青绿色 + + + diff --git a/modules/member/skins/default/add_friend.html b/modules/member/skins/default/add_friend.html new file mode 100644 index 000000000..e9344dc4a --- /dev/null +++ b/modules/member/skins/default/add_friend.html @@ -0,0 +1,49 @@ + + + +
    +
    +

    {$lang->cmd_add_friend}

    +
    + +
    + + +
    + + + + + + + + + + + + + + + +
    {$lang->user_id}{$target_info->user_id}
    {$lang->user_name}{$target_info->user_name}
    {$lang->nick_name}
    {$target_info->nick_name}
    + +
    + + {$lang->cmd_add_friend_group} +
    +
    + + + +
    +
    + + diff --git a/modules/member/skins/default/add_friend_group.html b/modules/member/skins/default/add_friend_group.html new file mode 100644 index 000000000..9749500cb --- /dev/null +++ b/modules/member/skins/default/add_friend_group.html @@ -0,0 +1,34 @@ + + + +
    +
    + + +
    +

    + + {$lang->cmd_rename_friend_group} + + {$lang->cmd_add_friend_group} + +

    +
    + +
    +

    {$lang->msg_insert_group_name}

    + +
    + +
    + + + + + + {$lang->cmd_close} +
    +
    +
    + + diff --git a/modules/member/skins/default/common_footer.html b/modules/member/skins/default/common_footer.html new file mode 100644 index 000000000..04f5b8449 --- /dev/null +++ b/modules/member/skins/default/common_footer.html @@ -0,0 +1 @@ +
    diff --git a/modules/member/skins/default/common_header.html b/modules/member/skins/default/common_header.html new file mode 100644 index 000000000..b77e6e7ed --- /dev/null +++ b/modules/member/skins/default/common_header.html @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + +
    + + +
    +

    {$member_title}

    + + +
    + + + +
    + +
    + diff --git a/modules/member/skins/default/css/common.css b/modules/member/skins/default/css/common.css new file mode 100644 index 000000000..a862b2a74 --- /dev/null +++ b/modules/member/skins/default/css/common.css @@ -0,0 +1,151 @@ +@charset "utf-8"; + +/* common */ +.memberSmallBox { border:1px solid #e0e1db; margin:5em auto 1em auto;} + +.memberSmallBox.w400 { width:400px;} +.memberSmallBox.w500 { width:500px;} + +.memberSmallBox.w400pop { width:400px; margin:0; padding:0;} +.memberSmallBox.w500pop { width:500px; margin:0; padding:0;} +.memberSmallBox.w600pop { width:600px; margin:0; padding:0;} + +.memberSmallBox .header { position:relative; _width:100%; background:#ffffff url(../images/common/bgH3.gif) no-repeat left bottom; overflow:hidden;} + +.boardInformation { width:100%; clear:both; margin:1em 0 .5em 0; overflow:hidden; color:#666666; height:25px;} + +.boardHeader { position:relative; _width:100%; border-top:1px solid #e1e1dd; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} +.boardHeader .member_option { float:right; position:relative; top:1em; right:1em; } +.boardHeader select { vertical-align:bottom; } +.boardHeader input { vertical-align:bottom; _padding-bottom:1px;} +.boardHeader .essential { position:absolute; top:1.5em; right:1em; color:#54564b; font-size:.9em;} +.boardHeader .essential:first-letter { color:#ff0000;} + +/* list */ +.list { width:100%; border:1px solid #e0e1db; table-layout:fixed;} +.list tr:first-child td, .list tr.first-child td { border-top:1px solid #e0e1db; white-space:nowrap;} +.list tr.bg1 { background:#ffffff} +.list tr.bg2 { background:#fbfbfb;} +.list th { color:#3e3f3e; font-weight:white; border-bottom:1px solid #ffffff; padding:.5em .2em .5em .2em; background:#ffffff url(../images/common/lineBoardListTh.gif) no-repeat left bottom; white-space:nowrap;} +.list th a { color:#3e3f3e;} +.list th:first-child, .list th.first-child { background-position:-3px bottom; border-left:1px solid #ffffff;} +.list th.check { padding:0;} +.list th select, .list th input { vertical-align:middle;} +.list td { border-top:1px solid #eff0ed; padding:.5em; text-align:center; height:35px;} +.list td.registDate { font:.8em Tahoma; color:#999999; text-align:center;} +.list td.num { font:.8em Tahoma; color:#999999; text-align:center;} +.list td.check { text-align:center;} +.list td.user { color:#333333; font-size:.9em; text-align:left;} +.list td.user a { color:#333333;} +.list td.userId { font:.9em Tahoma;} +.list td.userNick { font-size:.9em; color:#999999;} +.list td.sendMessage { text-align:center; padding:0;} +.list td.sendMessage .buttonFixedLeft { float:left; position:relative; margin-left:1em;} +.list td input { _margin:-3px;} +.list td.title { text-align:left; } +.list td.title.bold { font-size:1.2em; font-weight:bold;} +.list td.title.bold a { position:relative; top:.3em;} +.list td.title * { vertical-align:middle;} +.list td.title, .list td.title a { color:#444444; text-decoration:none;} +.list td.title a:visited { color:#777777; text-decoration:none;} +.list td.checkDate { font:.8em Tahoma; color:#333333; text-align:center;} +.memberSelect { margin-top:2px; } + +/* login */ +.memberSmallBox .login { border:none; padding:2em 0 1.5em 2em;} +.memberSmallBox .login legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} +.memberSmallBox .login dl { overflow:hidden; float:left; margin-right:10px; width:250px;} +.memberSmallBox .login dl dt { width:100px; clear:left; float:left; color:#54564b; height:24px; padding-top:3px;} +.memberSmallBox .login dl dd { float:left; height:27px; width:150px; } +.memberSmallBox .login .keep { clear:both; white-space:nowrap; margin-left:100px;} +.memberSmallBox .login .keep input { vertical-align:middle;} +.memberSmallBox .login .keep label { font-size:11px; color:#999999;} +.memberSmallBox .openid_user_id { background: url(../images/openid_input_bg.gif) left no-repeat; background-color: #ffffff; background-position: 0 50%; padding:3px 3px 3px 18px; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; line-height:1em; vertical-align:middle; color:#666666; width:120px;} +.memberSmallBox .help { background:#f5f5f3; color:#666666; border-top:1px solid #eaebe7; overflow:hidden; padding:1.1em; } + +/* logout */ +.memberSmallBox .text { color:#54564b; text-align:center; padding:4em 2em 5em 2em;} +.memberSmallBox .text p { margin-bottom:.5em;} + +/* friend */ +.friendNum { float:left; background:url(../images/common/iconFriend.gif) no-repeat .5em .4em; padding:.4em 0 0 2em;} +.friendNum strong { font:bold 11px Tahoma; color:#ff6600;} + +/* message */ +.readMessage { border:1px solid #e0e1db; border-top:none; margin-bottom:2em;} +.readMessage .messageHeader { padding:1.5em; height:1em; overflow:hidden;} +.readMessage .messageHeader h4 { float:left; padding-left:.5em; font-size:1em; background:url(../images/common/iconArrow99.gif) no-repeat left .3em;} +.readMessage .messageHeader address { float:right; white-space:nowrap;} +.readMessage .messageHeader address em { font-size:1em; font-style:white; color:#333333; margin-right:.3em; float:left;} +.readMessage .messageHeader address em a { color:#333333;} +.readMessage .messageHeader address .date { font:.8em Tahoma; color:#999999; margin-left:10px;} +.readMessage .messageBody { border:1px solid #e0e1db; margin:0 1.5em 1.5em 1.5em; padding:1em; position:relative; color:#666666;} +.readMessage .deleteOrKeep { padding:.5em 0; overflow:hidden; background:#f5f5f3; border-top:1px solid #eaebe7; _width:100%;} +.instantMessage { float:right; overflow:hidden;} +.instantMessage li { float:left; padding:0 .8em 0 .8em; margin-left:-1px; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left center; list-style:none; } +.instantMessage li a { text-decoration:none; display:block; float:left; height:1em; height:1.1em; overflow:hidden; font-size:1em; white-space:nowrap; color:#666666; padding-left:1.8em; background:url(../images/common/iconInstantMessage.gif) no-repeat left top;} +.instantMessage li.on a { background-position:left -14px; font-weight:bold;} +.instantMessage li a strong { color:#ff6600;} + +/* member info */ +.memberInfoTable { width:100%; border:1px solid #e0e1db; margin-bottom:10px;} +.memberInfoTable caption { padding:2em 0 .5em 1.5em; font-weight:bold; text-align:left; background:url(../images/common/iconH3.gif) no-repeat .5em 2em;} +.memberInfoTable tr.first-child th, .memberInfoTable tr.first-child td { border-top:none;} +.memberInfoTable th, .memberInfoTable td { border-top:1px solid #eaebe7; padding:.5em;} +.memberInfoTable th { background:#f5f5f3; text-align:left; padding:.5em 1em;} +.memberInfoTable td { border-left:1px solid #eaebe7;} +.memberInfoTable td input { border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:3px; height:1em; line-height:1em; background:#fbfbfb; vertical-align:middle; float:left; margin-right:.5em; margin-bottom:.5em; color:#666666;} +.memberInfoTable td input.radio, .memberInfoTable td input.check { border:none; padding:0; margin:0; background:none; margin-top:.4em;} +.memberInfoTable td input.w4em { width:4em;} +.memberInfoTable td input.w2em { width:2em;} +.memberInfoTable td select { float:left; margin-right:.5em;} +.memberInfoTable td .fl { margin-right:.5em;} +.memberInfoTable td br { clear:both;} +.memberInfoTable td p { float:left; font-size:.9em; color:#999999; padding-top:.5em; margin-right:.5em;} +.memberInfoTable td label { float:left; color:#3f4040; padding-top:.3em; margin-right:.5em;} +.memberInfoTable td .checkbox { border:none; } + +/* modify/ insert member info */ +.memberImage { clear:both; } +.memberImage .info { margin-bottom:1.5em; float:left; margin-right:1em;} +.memberImage .form { float:left; } +.memberImage .form input { height:1.5em; margin:0 .3em 0 0; padding:0;} +.checkbox li { float:left; margin-right:2em; } +.checkbox li input { border:none; } +.str_birthday { cursor:pointer; float:left; width:80px; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; height:1em; padding:3px 3px 3px 18px; margin-right:.3em;} +.krZip .address2 { clear:both; margin-top:10px;} +.extendDesc { clear:both; margin-top:0; font-size:.9em; color:#999999; } + +.agreementBox { border:1px solid #AAAAAA; margin:.5em 0 0 0; padding:1em; border-bottom:none;} +.agreementButton { background-color:#EEEEEE; padding:1em; border:1px solid #AAAAAA; border-top:none;} + +/* popup common */ +.memberSmallBox .complex { padding:1.5em 2em 2em 2em;} +.memberSmallBox .leftHeaderType { border-top:1px solid #e0e1db; border-left:1px solid #e0e1db; width:100%;} +.memberSmallBox .leftHeaderType th, .memberSmallBox .leftHeaderType td { border-right:1px solid #e0e1db; border-bottom:1px solid #e0e1db; padding:.8em 1em .6em 1em;} +.memberSmallBox .leftHeaderType th { color:#333333; text-align:left; background:#f5f5f3;} +.memberSmallBox .leftHeaderType td { color:#444444;} +.memberSmallBox .group { border:1px solid #e0e1db; border-width:1px 0; overflow:hidden; padding:.5em 0; margin-top:.7em; height:23px;} +.memberSmallBox .group select { width:11em; margin-top:1px;} +.memberSmallBox .editor { margin:10px 0 0 0; _height:400px; } + +/* password change */ +.memberSmallBox .pwModify { border:none;} +.memberSmallBox .pwModify legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;} +.memberSmallBox .pwModify input { width:9em;} +.memberSmallBox .pwModify br { display:block; margin-bottom:.2em} +.memberSmallBox .pwModify p { text-align:center; margin-top:1em; color:#54564b;} + +/* pageNavigation */ +.pageNavigation { position:relative; display:block; padding:1.5em 0 2em 0; text-align:center; font:bold .8em Tahoma; } +.pageNavigation a { position:relative; margin-left:-4px; font:bold 1em Tahoma; color:#666666; display:inline-block; padding:1px 7px 2px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } +.pageNavigation a:hover { background:#F7F7F7; text-decoration:none; } +.pageNavigation a:visited { color:#999999;} +.pageNavigation a.goToFirst { border:none; border-right:1px solid #ffffff; border-left:1px solid #ffffff; z-index:99; vertical-align:top; padding:0px 7px 4px 6px;} +.pageNavigation a.goToLast { border:none; border-right:1px solid #ffffff; border-left:1px solid #ffffff; z-index:99; vertical-align:top; padding:0px 7px 4px 6px;} +.pageNavigation a.goToFirst img, .pageNavigation a.goToLast img { display:inline-block; padding:2px 0; position:relative; top:2px; _top:1px;} +.pageNavigation .current { position:relative; margin-left:-4px; font:bold 1em Tahoma; color:#ff6600; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } + +/* Own Document */ +img.button_go { position:relative; bottom:-4px; } +.boardInformation strong { font:bold 11px Tahoma; color:#ff6600;} diff --git a/modules/member/skins/default/css/cyan.css b/modules/member/skins/default/css/cyan.css new file mode 100644 index 000000000..f1b1227f1 --- /dev/null +++ b/modules/member/skins/default/css/cyan.css @@ -0,0 +1,4 @@ +@charset "utf-8"; +.boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d1d9db; border-bottom:3px solid #2895c0; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.memberSmallBox .header h3 { margin:0; float:left; clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border-bottom:3px solid #2895c0; background:url(../images/common/lineH3.gif) no-repeat right bottom;} diff --git a/modules/member/skins/default/css/green.css b/modules/member/skins/default/css/green.css new file mode 100644 index 000000000..c8cfafe64 --- /dev/null +++ b/modules/member/skins/default/css/green.css @@ -0,0 +1,4 @@ +@charset "utf-8"; +.boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d0dbd1; border-bottom:3px solid #38b549; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.memberSmallBox .header h3 { margin:0; float:left; clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border-bottom:3px solid #38b549; background:url(../images/common/lineH3.gif) no-repeat right bottom;} diff --git a/modules/member/skins/default/css/purple.css b/modules/member/skins/default/css/purple.css new file mode 100644 index 000000000..1e7882b43 --- /dev/null +++ b/modules/member/skins/default/css/purple.css @@ -0,0 +1,4 @@ +@charset "utf-8"; +.boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d1d9db; border-bottom:3px solid #ac19a9; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.memberSmallBox .header h3 { margin:0; float:left; clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border-bottom:3px solid #ac19a9; background:url(../images/common/lineH3.gif) no-repeat right bottom;} diff --git a/modules/member/skins/default/css/red.css b/modules/member/skins/default/css/red.css new file mode 100644 index 000000000..96cd17842 --- /dev/null +++ b/modules/member/skins/default/css/red.css @@ -0,0 +1,4 @@ +@charset "utf-8"; +.boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #e1e1dd; border-bottom:3px solid #fe3614; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.memberSmallBox .header h3 { margin:0; float:left; clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border-bottom:3px solid #fe3614; background:url(../images/common/lineH3.gif) no-repeat right bottom;} diff --git a/modules/member/skins/default/css/white.css b/modules/member/skins/default/css/white.css new file mode 100644 index 000000000..b465c7c99 --- /dev/null +++ b/modules/member/skins/default/css/white.css @@ -0,0 +1,5 @@ +@charset "utf-8"; +.boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #e1e1dd; border-bottom:3px solid #fe3614; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + +.memberSmallBox .header h3 { margin:0; float:left; clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border-bottom:3px solid #fe3614; background:url(../images/common/lineH3.gif) no-repeat right bottom;} + diff --git a/modules/member/skins/default/document_list.html b/modules/member/skins/default/document_list.html new file mode 100644 index 000000000..cb338f060 --- /dev/null +++ b/modules/member/skins/default/document_list.html @@ -0,0 +1,78 @@ +{@ $member_title = $lang->cmd_view_own_document } + + + +
    + Total : {number_format($total_count)}, + Page {number_format($page)}/{number_format($total_page)} +
    + + + ++++++ + + + + + + + + + + + + + + + + + + + +
    {$lang->no} +
    +   + +
    +
    {$lang->readed_count}{$lang->voted_count}{$lang->date}
    {$no} + {htmlspecialchars($module_list[$oDocument->get('module_srl')]->browser_title)} - + {$oDocument->getTitleText()} + + + [{$oDocument->getCommentCount()}] + + + + [{$oDocument->getTrackbackCount()}] + + {$oDocument->get('readed_count')}{$oDocument->get('voted_count')}{$oDocument->getRegdate("Y-m-d")}
    + + + + + + + + diff --git a/modules/member/skins/default/filter/add_friend.xml b/modules/member/skins/default/filter/add_friend.xml new file mode 100644 index 000000000..9f48f408d --- /dev/null +++ b/modules/member/skins/default/filter/add_friend.xml @@ -0,0 +1,9 @@ + +
    + + + + + + + diff --git a/modules/member/skins/default/filter/add_friend_group.xml b/modules/member/skins/default/filter/add_friend_group.xml new file mode 100644 index 000000000..2db9891e2 --- /dev/null +++ b/modules/member/skins/default/filter/add_friend_group.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/modules/member/skins/default/filter/delete_checked_friend.xml b/modules/member/skins/default/filter/delete_checked_friend.xml new file mode 100644 index 000000000..7fda453f2 --- /dev/null +++ b/modules/member/skins/default/filter/delete_checked_friend.xml @@ -0,0 +1 @@ + diff --git a/modules/member/skins/default/filter/delete_checked_message.xml b/modules/member/skins/default/filter/delete_checked_message.xml new file mode 100644 index 000000000..93c79a67c --- /dev/null +++ b/modules/member/skins/default/filter/delete_checked_message.xml @@ -0,0 +1 @@ + diff --git a/modules/member/skins/default/filter/delete_friend_group.xml b/modules/member/skins/default/filter/delete_friend_group.xml new file mode 100644 index 000000000..b6246a07f --- /dev/null +++ b/modules/member/skins/default/filter/delete_friend_group.xml @@ -0,0 +1 @@ + diff --git a/modules/member/skins/default/filter/delete_image_mark.xml b/modules/member/skins/default/filter/delete_image_mark.xml new file mode 100644 index 000000000..95ae69d58 --- /dev/null +++ b/modules/member/skins/default/filter/delete_image_mark.xml @@ -0,0 +1,2 @@ + + diff --git a/modules/member/skins/default/filter/delete_image_name.xml b/modules/member/skins/default/filter/delete_image_name.xml new file mode 100644 index 000000000..70efc0365 --- /dev/null +++ b/modules/member/skins/default/filter/delete_image_name.xml @@ -0,0 +1 @@ + diff --git a/modules/member/skins/default/filter/leave_member.xml b/modules/member/skins/default/filter/leave_member.xml new file mode 100644 index 000000000..18eb8287d --- /dev/null +++ b/modules/member/skins/default/filter/leave_member.xml @@ -0,0 +1,12 @@ + +
    + + + + + + + + + +
    diff --git a/modules/member/skins/default/filter/login.xml b/modules/member/skins/default/filter/login.xml new file mode 100644 index 000000000..442dfd16e --- /dev/null +++ b/modules/member/skins/default/filter/login.xml @@ -0,0 +1,11 @@ + +
    + + + + + + + + +
    diff --git a/modules/member/skins/default/filter/logout.xml b/modules/member/skins/default/filter/logout.xml new file mode 100644 index 000000000..3dacc54e3 --- /dev/null +++ b/modules/member/skins/default/filter/logout.xml @@ -0,0 +1,7 @@ + +
    + + + + + diff --git a/modules/member/skins/default/filter/modify_info.xml b/modules/member/skins/default/filter/modify_info.xml new file mode 100644 index 000000000..3a40aab79 --- /dev/null +++ b/modules/member/skins/default/filter/modify_info.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + +
    diff --git a/modules/member/skins/default/filter/modify_password.xml b/modules/member/skins/default/filter/modify_password.xml new file mode 100644 index 000000000..242a7f9cc --- /dev/null +++ b/modules/member/skins/default/filter/modify_password.xml @@ -0,0 +1,15 @@ + +
    + + + + + + + + + + + + +
    diff --git a/modules/member/skins/default/filter/move_friend.xml b/modules/member/skins/default/filter/move_friend.xml new file mode 100644 index 000000000..de31a8025 --- /dev/null +++ b/modules/member/skins/default/filter/move_friend.xml @@ -0,0 +1 @@ + diff --git a/modules/member/skins/default/filter/openid_login.xml b/modules/member/skins/default/filter/openid_login.xml new file mode 100644 index 000000000..61bba2ff2 --- /dev/null +++ b/modules/member/skins/default/filter/openid_login.xml @@ -0,0 +1,10 @@ + +
    + + + + + + + +
    diff --git a/modules/member/skins/default/filter/send_message.xml b/modules/member/skins/default/filter/send_message.xml new file mode 100644 index 000000000..2756c3398 --- /dev/null +++ b/modules/member/skins/default/filter/send_message.xml @@ -0,0 +1,12 @@ + +
    + + + + + + + + + +
    diff --git a/modules/member/skins/default/filter/signup.xml b/modules/member/skins/default/filter/signup.xml new file mode 100644 index 000000000..8765250c6 --- /dev/null +++ b/modules/member/skins/default/filter/signup.xml @@ -0,0 +1,28 @@ + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    diff --git a/modules/member/skins/default/friends_list.html b/modules/member/skins/default/friends_list.html new file mode 100644 index 000000000..1cbb88735 --- /dev/null +++ b/modules/member/skins/default/friends_list.html @@ -0,0 +1,103 @@ +{@ $member_title = $lang->cmd_view_friend } + + + + + +
    + +
    + {$lang->friend} : {$total_count} +
    + + {$lang->cmd_modify} + {$lang->cmd_delete} + {$lang->cmd_add_friend_group} +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + GO + {$lang->user_id}{$lang->user_name}{$lang->nick_name}{$lang->regdate}{$lang->cmd_send_message}
    {$val->group_title?$val->group_title:" "}{$val->user_id}{$val->user_name}
    {$val->nick_name}
    {zdate($val->regdate,"Y-m-d")}{$lang->cmd_send_message}
    + + + + +
    + +
    + + + + +
    + + + +
    + +
    + + + diff --git a/modules/member/skins/default/images/blank.gif b/modules/member/skins/default/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/modules/member/skins/default/images/blank.gif differ diff --git a/modules/member/skins/default/images/bottomGotoFirst.gif b/modules/member/skins/default/images/bottomGotoFirst.gif new file mode 100644 index 000000000..e0297fecb Binary files /dev/null and b/modules/member/skins/default/images/bottomGotoFirst.gif differ diff --git a/modules/member/skins/default/images/bottomGotoLast.gif b/modules/member/skins/default/images/bottomGotoLast.gif new file mode 100644 index 000000000..0a7141d0d Binary files /dev/null and b/modules/member/skins/default/images/bottomGotoLast.gif differ diff --git a/modules/member/skins/default/images/button_go.gif b/modules/member/skins/default/images/button_go.gif new file mode 100755 index 000000000..895d1a078 Binary files /dev/null and b/modules/member/skins/default/images/button_go.gif differ diff --git a/modules/member/skins/default/images/common/bgH3.gif b/modules/member/skins/default/images/common/bgH3.gif new file mode 100644 index 000000000..0d07bb456 Binary files /dev/null and b/modules/member/skins/default/images/common/bgH3.gif differ diff --git a/modules/member/skins/default/images/common/bottomGotoFirst.gif b/modules/member/skins/default/images/common/bottomGotoFirst.gif new file mode 100644 index 000000000..e0297fecb Binary files /dev/null and b/modules/member/skins/default/images/common/bottomGotoFirst.gif differ diff --git a/modules/member/skins/default/images/common/bottomGotoLast.gif b/modules/member/skins/default/images/common/bottomGotoLast.gif new file mode 100644 index 000000000..0a7141d0d Binary files /dev/null and b/modules/member/skins/default/images/common/bottomGotoLast.gif differ diff --git a/modules/member/skins/default/images/common/buttonTypeInput24.gif b/modules/member/skins/default/images/common/buttonTypeInput24.gif new file mode 100644 index 000000000..0dcfc0e3d Binary files /dev/null and b/modules/member/skins/default/images/common/buttonTypeInput24.gif differ diff --git a/modules/member/skins/default/images/common/iconAdd.gif b/modules/member/skins/default/images/common/iconAdd.gif new file mode 100644 index 000000000..f2bdb7868 Binary files /dev/null and b/modules/member/skins/default/images/common/iconAdd.gif differ diff --git a/modules/member/skins/default/images/common/iconArrow99.gif b/modules/member/skins/default/images/common/iconArrow99.gif new file mode 100644 index 000000000..15c36291e Binary files /dev/null and b/modules/member/skins/default/images/common/iconArrow99.gif differ diff --git a/modules/member/skins/default/images/common/iconCheck.gif b/modules/member/skins/default/images/common/iconCheck.gif new file mode 100644 index 000000000..c4fb37ae0 Binary files /dev/null and b/modules/member/skins/default/images/common/iconCheck.gif differ diff --git a/modules/member/skins/default/images/common/iconFriend.gif b/modules/member/skins/default/images/common/iconFriend.gif new file mode 100644 index 000000000..1daf6c66d Binary files /dev/null and b/modules/member/skins/default/images/common/iconFriend.gif differ diff --git a/modules/member/skins/default/images/common/iconH3.gif b/modules/member/skins/default/images/common/iconH3.gif new file mode 100644 index 000000000..8ea0cec82 Binary files /dev/null and b/modules/member/skins/default/images/common/iconH3.gif differ diff --git a/modules/member/skins/default/images/common/iconInstantMessage.gif b/modules/member/skins/default/images/common/iconInstantMessage.gif new file mode 100644 index 000000000..d63a69506 Binary files /dev/null and b/modules/member/skins/default/images/common/iconInstantMessage.gif differ diff --git a/modules/member/skins/default/images/common/iconInstantMessage2.gif b/modules/member/skins/default/images/common/iconInstantMessage2.gif new file mode 100644 index 000000000..380548e91 Binary files /dev/null and b/modules/member/skins/default/images/common/iconInstantMessage2.gif differ diff --git a/modules/member/skins/default/images/common/lineBoardListTh.gif b/modules/member/skins/default/images/common/lineBoardListTh.gif new file mode 100644 index 000000000..6d891d82c Binary files /dev/null and b/modules/member/skins/default/images/common/lineBoardListTh.gif differ diff --git a/modules/member/skins/default/images/common/lineH3.gif b/modules/member/skins/default/images/common/lineH3.gif new file mode 100644 index 000000000..fe42fe378 Binary files /dev/null and b/modules/member/skins/default/images/common/lineH3.gif differ diff --git a/modules/member/skins/default/images/common/line_1x10_e0e0e0.gif b/modules/member/skins/default/images/common/line_1x10_e0e0e0.gif new file mode 100644 index 000000000..6a848dd58 Binary files /dev/null and b/modules/member/skins/default/images/common/line_1x10_e0e0e0.gif differ diff --git a/modules/member/skins/default/images/openid_input_bg.gif b/modules/member/skins/default/images/openid_input_bg.gif new file mode 100644 index 000000000..cde836c89 Binary files /dev/null and b/modules/member/skins/default/images/openid_input_bg.gif differ diff --git a/modules/member/skins/default/js/member.js b/modules/member/skins/default/js/member.js new file mode 100644 index 000000000..92b4c3d45 --- /dev/null +++ b/modules/member/skins/default/js/member.js @@ -0,0 +1,226 @@ +/* 사용자 추가 */ +function completeInsert(ret_obj, response_tags, args, fo_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var redirect_url = ret_obj['redirect_url']; + + alert(message); + + if(redirect_url) location.href = redirect_url; + else location.href = current_url.setQuery('act',''); +} + +/* 정보 수정 */ +function completeModify(ret_obj, response_tags, args, fo_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + alert(message); + + location.href = current_url.setQuery('act','dispMemberInfo'); +} + +/* 회원 탈퇴 */ +function completeLeave(ret_obj, response_tags, args, fo_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + alert(message); + + location.href = current_url.setQuery('act',''); +} + +/* 이미지 업로드 */ +function _doUploadImage(fo_obj, act) { + // 업로드용 iframe을 생성 + if(!xGetElementById('tmp_upload_iframe')) { + if(xIE4Up) { + window.document.body.insertAdjacentHTML("afterEnd", ""); + } else { + var obj_iframe = xCreateElement('IFRAME'); + obj_iframe.name = obj_iframe.id = 'tmp_upload_iframe'; + obj_iframe.style.display = 'none'; + obj_iframe.style.width = '1px'; + obj_iframe.style.height = '1px'; + obj_iframe.style.position = 'absolute'; + obj_iframe.style.top = '-10px'; + obj_iframe.style.left = '-10px'; + window.document.body.appendChild(obj_iframe); + } + } + + fo_obj.target = "tmp_upload_iframe"; + fo_obj.act.value = act; + fo_obj.submit(); +} + +/* 이미지 이름/마크 등록 */ +function doUploadImageName() { + var fo_obj = xGetElementById("fo_insert_member"); + if(!fo_obj.image_name.value) return; + _doUploadImage(fo_obj, 'procMemberInsertImageName'); +} + +function doUploadImageMark() { + var fo_obj = xGetElementById("fo_insert_member"); + if(!fo_obj.image_mark.value) return; + _doUploadImage(fo_obj, 'procMemberInsertImageMark'); +} + +/* 로그인 영역에 포커스 */ +function doFocusUserId(fo_id) { + var fo_obj = xGetElementById(fo_id); + if(xGetCookie('user_id')) { + fo_obj.user_id.value = xGetCookie('user_id'); + fo_obj.remember_user_id.checked = true; + fo_obj.password.focus(); + } else { + fo_obj.user_id.focus(); + } +} + +/* 로그인 후 */ +function completeLogin(ret_obj, response_tags, params, fo_obj) { + if(fo_obj.remember_user_id && fo_obj.remember_user_id.checked) { + var expire = new Date(); + expire.setTime(expire.getTime()+ (7000 * 24 * 3600000)); + xSetCookie('user_id', fo_obj.user_id.value, expire); + } + + var url = current_url.setQuery('act',''); + location.href = current_url.setQuery('act',''); +} + +/* 로그아웃 후 */ +function completeLogout(ret_obj) { + location.href = current_url.setQuery('act',''); +} + +/* 오픈아이디 로그인 후 */ +function completeOpenIDLogin(ret_obj, response_tags) { + var redirect_url = ret_obj['redirect_url']; + location.href = redirect_url; +} + + +/* 이미지 이름, 마크 삭제 */ +function doDeleteImageName(member_srl) { + var fo_obj = xGetElementById("fo_insert_member"); + fo_obj.member_srl.value = member_srl; + procFilter(fo_obj, delete_image_name); +} + +function doDeleteImageMark(member_srl) { + var fo_obj = xGetElementById("fo_insert_member"); + fo_obj.member_srl.value = member_srl; + procFilter(fo_obj, delete_image_mark); +} + + +/* 쪽지 발송 */ +function completeSendMessage(ret_obj) { + alert(ret_obj['message']); + window.close(); +} + +function doSendMessage(member_srl) { + var url = current_url.setQuery('module','member').setQuery('act','dispMemberSendMessage').setQuery('receiver_srl',member_srl); + popopen(url, 'sendMessage'); +} + +/* 쪽지 모두 선택 */ +function doCheckAll(obj, fo_id) { + var fo_obj = xGetElementById(fo_id); + for(var i=0; imsg_leave_member} + + + + +
    + + + + + + + + + + + + + + + +
    {$lang->user_id}{$member_info->user_id}
    + + +
    + diff --git a/modules/member/skins/default/login_form.html b/modules/member/skins/default/login_form.html new file mode 100644 index 000000000..f38bbf270 --- /dev/null +++ b/modules/member/skins/default/login_form.html @@ -0,0 +1,63 @@ + + + + + +
    + +
    +

    {$lang->cmd_login}

    +
    + +
    + +
    + + +
    + + + +
    + +
    +

    {$lang->openid}

    +
    + +
    + +
    + +
    {$lang->about_openid}
    + +
    + + + + + diff --git a/modules/member/skins/default/logout.html b/modules/member/skins/default/logout.html new file mode 100644 index 000000000..74982e98a --- /dev/null +++ b/modules/member/skins/default/logout.html @@ -0,0 +1,22 @@ + + + +
    + + +
    +
    +

    {$lang->cmd_logout}

    +
    +
    +

    {$lang->confirm_logout}

    +
    + + +
    + +
    + diff --git a/modules/member/skins/default/member_info.html b/modules/member/skins/default/member_info.html new file mode 100644 index 000000000..fcee83a59 --- /dev/null +++ b/modules/member/skins/default/member_info.html @@ -0,0 +1,108 @@ +{@ $member_title = $lang->cmd_view_member_info } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->member_default_info}
    {$lang->user_id} + {$member_info->user_id} + + ({$lang->denied}) + +
    {$lang->user_name}{htmlspecialchars($member_info->user_name)}
    {$lang->nick_name}{htmlspecialchars($member_info->nick_name)}
    {$lang->image_name}image_name
    {$lang->image_mark}image_mark
    {$lang->homepage}{htmlspecialchars($member_info->homepage)} 
    {$lang->blog}{htmlspecialchars($member_info->blog)} 
    {$lang->birthday}{zdate($member_info->birthday,"Y-m-d")} 
    {$lang->signature}{$member_info->signature}
    {$lang->group}{$val}
    {$lang->signup_date}{zdate($member_info->regdate,"Y-m-d H:i")}
    {$lang->last_login}{zdate($member_info->last_login,"Y-m-d H:i")}
    + + + + + + + {@ $dummy_chk = 0 } + + class="first-child" {@ $dummy_chk = 1; }> + + + + +
    {$lang->member_extend_info}
    {htmlspecialchars($val->column_title)} + + {htmlspecialchars($val->value[0])} - {htmlspecialchars($val->value[1])} - {htmlspecialchars($val->value[2])}  + + {$val->value[0]} {htmlspecialchars($val->value[1])}  + + {htmlspecialchars(implode(",",$val->value))}  + + {zdate($val->value, "Y-m-d")}  + + {htmlspecialchars($val->value)}  + +
    + + + + + diff --git a/modules/member/skins/default/member_messages.html b/modules/member/skins/default/member_messages.html new file mode 100644 index 000000000..b3576371e --- /dev/null +++ b/modules/member/skins/default/member_messages.html @@ -0,0 +1,123 @@ + + + {@ $member_title = $val} + + + + + + +
    +
    +

    {$message->title}

    +
    + + +   + + {$message->nick_name} ({$message->user_id}) + + {zdate($message->regdate, "Y.m.d H:i:s")} + +
    +
    + +
    {$message->content}
    + + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + {$lang->receiver} + + {$lang->sender} + + {$lang->title}{$lang->regdate}{$lang->readed_date}
    + +   + +
    {$val->nick_name} ({$val->user_id})
    + + {$val->title} + + {$val->title} + + {zdate($val->regdate,"Y-m-d")}{zdate($val->readed_date,"Y-m-d H:i:s")} 
    + + + + + +
    + +
    + +
    + + diff --git a/modules/member/skins/default/member_new_message.html b/modules/member/skins/default/member_new_message.html new file mode 100644 index 000000000..3873ff509 --- /dev/null +++ b/modules/member/skins/default/member_new_message.html @@ -0,0 +1,46 @@ + + + + +
    + +
    +

    {$lang->message_received}

    +
    + +
    + + + + + + + + + + + + + + + + +
    {$lang->sender}
    {$message->nick_name} ({$message->user_id})
    {$lang->title}{htmlspecialchars($message->title)}
    {$message->content}
    +
    + + +
    + + + + + diff --git a/modules/member/skins/default/modify_info.html b/modules/member/skins/default/modify_info.html new file mode 100644 index 000000000..695927aa0 --- /dev/null +++ b/modules/member/skins/default/modify_info.html @@ -0,0 +1,218 @@ +{@ $member_title = $lang->msg_update_member} + + + + + + + + + + + + +
    image_name=='Y' || $member_config->image_mark=='Y')-->enctype="multipart/form-data"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->member_default_info}
    {$lang->user_id}{htmlspecialchars($member_info->user_id)}
    {$lang->user_name}

    {$lang->about_user_name}

    {$lang->nick_name} *

    {$lang->about_nick_name}

    {$lang->email_address}

    {$lang->about_email_address}

    {$lang->image_name} + + + + + +
    {$lang->image_mark} + + + + + +
    {$lang->homepage}

    {$lang->about_homepage}

    {$lang->blog}

    {$lang->about_blog_url}

    {$lang->birthday} * + +
    {zdate($member_info->birthday,"Y-m-d")}
    + {$lang->cmd_open_calendar} +

    {$lang->about_birthday}

    +
    {$lang->allow_mailing}allow_mailing!='N')-->checked="checked" />

    {$lang->about_allow_mailing}

    {$lang->allow_message} + +

    {$lang->about_allow_message}

    +
    {$lang->signature}{$editor}
    + + + + + + + {@ $dummy_chk = 0 } + + class="first-child" {@ $dummy_chk = 1; }> + + + + +
    {$lang->member_extend_info}
    + {htmlspecialchars($val->column_title)} + * + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
    • value)&&in_array($v, $val->value))-->checked="checked"/>{$v}
    • + +
    + + + + + + + + + + + + + + + + + +
    {zdate($val->value,"Y-m-d")}
    + {$lang->cmd_open_calendar} + + + +
    {$val->description}
    +
    + + + +
    + diff --git a/modules/member/skins/default/modify_password.html b/modules/member/skins/default/modify_password.html new file mode 100644 index 000000000..ed15582dd --- /dev/null +++ b/modules/member/skins/default/modify_password.html @@ -0,0 +1,40 @@ +{@ $member_title = $lang->cmd_modify_member_password } + + +
    + + + + + + + + + + + + + + + + + + + +
    {$lang->user_id}{$member_info->user_id}
    + +
    + + {$lang->password2} +
    +

    {$lang->about_password}

    +
    + + + + +
    + diff --git a/modules/member/skins/default/scrapped_list.html b/modules/member/skins/default/scrapped_list.html new file mode 100644 index 000000000..7fcc9512e --- /dev/null +++ b/modules/member/skins/default/scrapped_list.html @@ -0,0 +1,59 @@ +{@ $member_title = $lang->cmd_view_scrapped_document } + + + +
    + Total : {number_format($total_count)}, + Page {number_format($page)}/{number_format($total_page)} +
    + + + ++++++ + + + + + + + + + + + + + + + + + + + +
    {$lang->no}{$lang->title}{$lang->writer}{$lang->date}{$lang->cmd_delete}
    {$no} + {htmlspecialchars($val->title)} +
    {$val->nick_name}
    {zdate($val->regdate, "Y-m-d H:i")}{$lang->cmd_delete}
    + + + + + + + + diff --git a/modules/member/skins/default/screenshot/cyan.gif b/modules/member/skins/default/screenshot/cyan.gif new file mode 100644 index 000000000..bae2fa162 Binary files /dev/null and b/modules/member/skins/default/screenshot/cyan.gif differ diff --git a/modules/member/skins/default/screenshot/green.gif b/modules/member/skins/default/screenshot/green.gif new file mode 100644 index 000000000..126923f68 Binary files /dev/null and b/modules/member/skins/default/screenshot/green.gif differ diff --git a/modules/member/skins/default/screenshot/purple.gif b/modules/member/skins/default/screenshot/purple.gif new file mode 100644 index 000000000..1b5e0d717 Binary files /dev/null and b/modules/member/skins/default/screenshot/purple.gif differ diff --git a/modules/member/skins/default/screenshot/red.gif b/modules/member/skins/default/screenshot/red.gif new file mode 100644 index 000000000..c9fd68653 Binary files /dev/null and b/modules/member/skins/default/screenshot/red.gif differ diff --git a/modules/member/skins/default/screenshot/white.gif b/modules/member/skins/default/screenshot/white.gif new file mode 100644 index 000000000..c9fd68653 Binary files /dev/null and b/modules/member/skins/default/screenshot/white.gif differ diff --git a/modules/member/skins/default/send_message.html b/modules/member/skins/default/send_message.html new file mode 100644 index 000000000..fb77492e1 --- /dev/null +++ b/modules/member/skins/default/send_message.html @@ -0,0 +1,47 @@ + + + + +
    + +
    +

    {$lang->cmd_send_message}

    +
    + +
    + + + +
    + + + + + + + + + + + +
    {$receiver_info->nick_name} ({$receiver_info->user_id})
    {$lang->title}
    + +
    + {$editor} +
    + +
    + + + +
    +
    + + + + diff --git a/modules/member/skins/default/signup_form.html b/modules/member/skins/default/signup_form.html new file mode 100644 index 000000000..74eaa308a --- /dev/null +++ b/modules/member/skins/default/signup_form.html @@ -0,0 +1,179 @@ + + + + + +
    +

    {$lang->msg_new_member}

    +
    + +
    + + + + + +
    + {nl2br($member_config->agreement)} +
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->member_default_info}
    {$lang->user_id} *

    {$lang->about_user_id}

    {$lang->password} *

    {$lang->about_password}

    {$lang->password2} *
    {$lang->user_name} *

    {$lang->about_user_name}

    {$lang->nick_name} *

    {$lang->about_nick_name}

    {$lang->email_address} *

    {$lang->about_email_address}

    {$lang->homepage}

    {$lang->about_homepage}

    {$lang->blog}

    {$lang->about_blog_url}

    {$lang->birthday} * + +
     
    + {$lang->cmd_open_calendar} +

    {$lang->about_birthday}

    +
    {$lang->allow_mailing}

    {$lang->about_allow_mailing}

    + + + + + + + + {@ $dummy_chk = 0 } + + class="first-child" {@ $dummy_chk = 1; }> + + + + +
    {$lang->member_extend_info}
    + {htmlspecialchars($val->column_title)} + * + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
    • value)&&in_array($v, $val->value))-->checked="checked"/>{$v}
    • + +
    + + + + + + + + + + + + + + + + + +
    {zdate($val->value,"Y-m-d")}
    + {$lang->cmd_open_calendar} + + + +
    {$val->description}
    +
    + + + +
    + + diff --git a/modules/member/skins/default/skin.xml b/modules/member/skins/default/skin.xml new file mode 100644 index 000000000..1b1a753e8 --- /dev/null +++ b/modules/member/skins/default/skin.xml @@ -0,0 +1,65 @@ + + + 회원 기본 스킨 + 会员默认皮肤 + 会員デフォルトスキン + Default Member Skin + + (주)NHN + (株)NHN + (株)NHN + NHN Corp + + 회원모듈의 default스킨 + 디자인 : 서기정 (http://blog.naver.com/addcozy) + HTML/CSS : 정찬명 (http://naradesign.net) + + + 会员模块的默认皮肤。 + 设计 : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Chan-Myung Jeong (http://naradesign.net) + + + 会員モジュールのデフォルトスキン + デザイン:ソギジョン (http://blog.naver.com/addcozy) + HTML/CSS:ジョンチャンミョン (http://naradesign.net) + + + default skin of member module + Design : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Chan-Myung Jeong (http://naradesign.net) + + + + + 기본 + 默认 + デフォルト + default + + + 청록색 + cyan + 青绿色 + cyan + + + 초록색 + green + 绿色 + green + + + 빨간색 + red + 红色 + red + + + 보라색 + purple + 紫色 + purple + + + diff --git a/modules/member/tpl/colorset_list.html b/modules/member/tpl/colorset_list.html new file mode 100644 index 000000000..ddfc4d0b6 --- /dev/null +++ b/modules/member/tpl/colorset_list.html @@ -0,0 +1,16 @@ + + + {@ $_img_info = getImageSize($val->screenshot); $_height = $_img_info[1]+40; $_width = $_img_info[0]+20; $_talign = "center"; } + + {@ $_width = 200; $_height = 20; $_talign = "left"; } + +
    + colorset==$val->name)-->checked="checked"/> + + +
    + {$val->title} + +
    +
    + diff --git a/modules/member/tpl/delete_form.html b/modules/member/tpl/delete_form.html new file mode 100644 index 000000000..b3a4b3a7b --- /dev/null +++ b/modules/member/tpl/delete_form.html @@ -0,0 +1,34 @@ + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    {$lang->confirm_delete}
    {$lang->user_id}{$member_info->user_id}
    {$lang->nick_name}{$member_info->nick_name}
    {$lang->email_address}{$member_info->email_address}
    + + + +
    + diff --git a/modules/member/tpl/denied_id_list.html b/modules/member/tpl/denied_id_list.html new file mode 100644 index 000000000..05518d784 --- /dev/null +++ b/modules/member/tpl/denied_id_list.html @@ -0,0 +1,71 @@ + + + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->no}{$lang->user_id}{$lang->regdate}{$lang->description}{$lang->cmd_delete}
    {$no}{$val->user_id}{zdate($val->regdate,"Y-m-d")}{$val->description} {$lang->cmd_delete}
    + + + + + +
    + + +
    + + + + + + + + + + + +
    {$lang->user_id}
    {$lang->description}
    + +
    + +
    +
    + +
    diff --git a/modules/member/tpl/filter/delete_image_mark.xml b/modules/member/tpl/filter/delete_image_mark.xml new file mode 100644 index 000000000..95ae69d58 --- /dev/null +++ b/modules/member/tpl/filter/delete_image_mark.xml @@ -0,0 +1,2 @@ + + diff --git a/modules/member/tpl/filter/delete_image_name.xml b/modules/member/tpl/filter/delete_image_name.xml new file mode 100644 index 000000000..70efc0365 --- /dev/null +++ b/modules/member/tpl/filter/delete_image_name.xml @@ -0,0 +1 @@ + diff --git a/modules/member/tpl/filter/delete_member.xml b/modules/member/tpl/filter/delete_member.xml new file mode 100644 index 000000000..ca3a6bcf5 --- /dev/null +++ b/modules/member/tpl/filter/delete_member.xml @@ -0,0 +1,11 @@ + +
    + + + + + + + +
    + diff --git a/modules/member/tpl/filter/insert.xml b/modules/member/tpl/filter/insert.xml new file mode 100644 index 000000000..684f0c9cc --- /dev/null +++ b/modules/member/tpl/filter/insert.xml @@ -0,0 +1,33 @@ + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    diff --git a/modules/member/tpl/filter/insert_config.xml b/modules/member/tpl/filter/insert_config.xml new file mode 100644 index 000000000..33ba120c7 --- /dev/null +++ b/modules/member/tpl/filter/insert_config.xml @@ -0,0 +1,7 @@ + +
    + + + + + diff --git a/modules/member/tpl/filter/insert_denied_id.xml b/modules/member/tpl/filter/insert_denied_id.xml new file mode 100644 index 000000000..3af715be5 --- /dev/null +++ b/modules/member/tpl/filter/insert_denied_id.xml @@ -0,0 +1,10 @@ + + + + + + + + + +
    diff --git a/modules/member/tpl/filter/insert_group.xml b/modules/member/tpl/filter/insert_group.xml new file mode 100644 index 000000000..52f35ac36 --- /dev/null +++ b/modules/member/tpl/filter/insert_group.xml @@ -0,0 +1,10 @@ + +
    + + + + + + + +
    diff --git a/modules/member/tpl/filter/insert_join_form.xml b/modules/member/tpl/filter/insert_join_form.xml new file mode 100644 index 000000000..5d3cd97ee --- /dev/null +++ b/modules/member/tpl/filter/insert_join_form.xml @@ -0,0 +1,12 @@ + +
    + + + + + + + + + +
    diff --git a/modules/member/tpl/filter/update_denied_id.xml b/modules/member/tpl/filter/update_denied_id.xml new file mode 100644 index 000000000..1620e11be --- /dev/null +++ b/modules/member/tpl/filter/update_denied_id.xml @@ -0,0 +1,11 @@ + +
    + + + + + + + + +
    diff --git a/modules/member/tpl/filter/update_group.xml b/modules/member/tpl/filter/update_group.xml new file mode 100644 index 000000000..b15ad6a10 --- /dev/null +++ b/modules/member/tpl/filter/update_group.xml @@ -0,0 +1,10 @@ + +
    + + + + + + + +
    diff --git a/modules/member/tpl/filter/update_join_form.xml b/modules/member/tpl/filter/update_join_form.xml new file mode 100644 index 000000000..dd0d331fb --- /dev/null +++ b/modules/member/tpl/filter/update_join_form.xml @@ -0,0 +1,10 @@ + +
    + + + + + + + +
    diff --git a/modules/member/tpl/group_list.html b/modules/member/tpl/group_list.html new file mode 100644 index 000000000..255a4697e --- /dev/null +++ b/modules/member/tpl/group_list.html @@ -0,0 +1,76 @@ + + + + + + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->group_title}{$lang->regdate}{$lang->description}{$lang->is_default}{$lang->cmd_modify}{$lang->cmd_delete}
    {$lang->msg_group_is_null}
    {$group_info->title}{zdate($group_info->regdate,"Y-m-d H:i:s")}{nl2br($group_info->description)} {$group_info->is_default}{$lang->cmd_modify} + + {$lang->cmd_delete} + +   + +
    + + + +
    + + + + + + + + + + + + + + + + + + +
    {$lang->group_title}
    {$lang->is_default} {$lang->about_member_default}
    {$lang->description}
    + +
    + +
    + +
    diff --git a/modules/member/tpl/group_update_form.html b/modules/member/tpl/group_update_form.html new file mode 100644 index 000000000..728687483 --- /dev/null +++ b/modules/member/tpl/group_update_form.html @@ -0,0 +1,35 @@ + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    {$lang->group_title}
    {$lang->is_default} {$lang->about_member_default}
    {$lang->description}
    + +
    + +
    + +
    + + diff --git a/modules/member/tpl/header.html b/modules/member/tpl/header.html new file mode 100644 index 000000000..8a3074235 --- /dev/null +++ b/modules/member/tpl/header.html @@ -0,0 +1,25 @@ + + + +

    {$lang->member} {$lang->cmd_management}

    + + +
    {nl2br($lang->about_member)}
    + + +
    + + +
    + Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)} +
    + + + +
    diff --git a/modules/member/tpl/images/icon_add_friend.gif b/modules/member/tpl/images/icon_add_friend.gif new file mode 100644 index 000000000..97e8e3d52 Binary files /dev/null and b/modules/member/tpl/images/icon_add_friend.gif differ diff --git a/modules/member/tpl/images/icon_blog.gif b/modules/member/tpl/images/icon_blog.gif new file mode 100644 index 000000000..80f892e39 Binary files /dev/null and b/modules/member/tpl/images/icon_blog.gif differ diff --git a/modules/member/tpl/images/icon_friend_box.gif b/modules/member/tpl/images/icon_friend_box.gif new file mode 100644 index 000000000..2557a106f Binary files /dev/null and b/modules/member/tpl/images/icon_friend_box.gif differ diff --git a/modules/member/tpl/images/icon_homepage.gif b/modules/member/tpl/images/icon_homepage.gif new file mode 100644 index 000000000..30df51134 Binary files /dev/null and b/modules/member/tpl/images/icon_homepage.gif differ diff --git a/modules/member/tpl/images/icon_management.gif b/modules/member/tpl/images/icon_management.gif new file mode 100755 index 000000000..0e9a40c81 Binary files /dev/null and b/modules/member/tpl/images/icon_management.gif differ diff --git a/modules/member/tpl/images/icon_message_box.gif b/modules/member/tpl/images/icon_message_box.gif new file mode 100644 index 000000000..14c365418 Binary files /dev/null and b/modules/member/tpl/images/icon_message_box.gif differ diff --git a/modules/member/tpl/images/icon_on.gif b/modules/member/tpl/images/icon_on.gif new file mode 100644 index 000000000..9a1566245 Binary files /dev/null and b/modules/member/tpl/images/icon_on.gif differ diff --git a/modules/member/tpl/images/icon_sendmail.gif b/modules/member/tpl/images/icon_sendmail.gif new file mode 100644 index 000000000..370f8f2c0 Binary files /dev/null and b/modules/member/tpl/images/icon_sendmail.gif differ diff --git a/modules/member/tpl/images/icon_view_info.gif b/modules/member/tpl/images/icon_view_info.gif new file mode 100644 index 000000000..bce3adda2 Binary files /dev/null and b/modules/member/tpl/images/icon_view_info.gif differ diff --git a/modules/member/tpl/images/icon_view_written.gif b/modules/member/tpl/images/icon_view_written.gif new file mode 100644 index 000000000..540ed6b95 Binary files /dev/null and b/modules/member/tpl/images/icon_view_written.gif differ diff --git a/modules/member/tpl/images/icon_write_message.gif b/modules/member/tpl/images/icon_write_message.gif new file mode 100644 index 000000000..8ad51dda5 Binary files /dev/null and b/modules/member/tpl/images/icon_write_message.gif differ diff --git a/modules/member/tpl/insert_join_form.html b/modules/member/tpl/insert_join_form.html new file mode 100644 index 000000000..81743af73 --- /dev/null +++ b/modules/member/tpl/insert_join_form.html @@ -0,0 +1,89 @@ + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->column_type} + +

    {$lang->about_column_type}

    + +
    + +
    + +
    + + +
    +
    {$lang->column_name} + +

    {$lang->about_column_name}

    +
    {$lang->column_title} + +

    {$lang->about_column_title}

    +
    {$lang->is_active} + is_active=='Y')-->checked="checked"/> + {$lang->about_active} +
    {$lang->is_required} + required=='Y')-->checked="checked"/> + {$lang->about_required} +
    {$lang->description} + +

    {$lang->about_form_description}

    +
    + + +
    + +
    + +
    diff --git a/modules/member/tpl/insert_member.html b/modules/member/tpl/insert_member.html new file mode 100644 index 000000000..c3fadbec0 --- /dev/null +++ b/modules/member/tpl/insert_member.html @@ -0,0 +1,250 @@ + + + +
    + + + + + + + +
    + {$lang->member_default_info} +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->user_id} + + {htmlspecialchars($member_info->user_id)} + + +

    {$lang->about_user_id}

    + +
    {$lang->password} + +
    {$lang->user_name} + +

    {$lang->about_user_name}

    +
    {$lang->nick_name} + +

    {$lang->about_nick_name}

    +
    {$lang->email_address} + +
    {$lang->homepage} + +

    {$lang->about_homepage}

    +
    {$lang->blog} + +
    {$lang->birthday} + + +
    {zdate($member_info->birthday,"Y-m-d")}
    + {$lang->cmd_open_calendar} +

    {$lang->about_birthday}

    +
    {$lang->allow_mailing} + allow_mailing!='N')-->checked="checked"/> + {$lang->about_allow_mailing} +
    {$lang->allow_message} + +

    {$lang->about_allow_message}

    +
    {$lang->signature}{$editor}
    {$lang->denied} + denied=='Y')-->checked="checked"/> +

    {$lang->about_denied}

    +
    {$lang->limit_date} + +
    {zdate($member_info->limit_date,"Y-m-d")}
    + {$lang->cmd_open_calendar} +

    {$lang->about_limit_date}

    +
    {$lang->is_admin} + is_admin=='Y')-->checked="checked"/> +

    {$lang->about_is_admin}

    +
    {$lang->description} + +

    {$lang->about_description}

    +
    {$lang->group} + + group_list[$key])-->checked="checked" class="checkbox" /> + + +

    {$lang->about_group}

    +
    + + +
    + {$lang->member_extend_info} +
    + + + + + + + + + + + + +
    + + * + + {$val->column_title} + + + + + + + + + + + + + + + + - + - + + + + + + + + + + + value)&&in_array($v, $val->value))-->checked="checked"/> {$v} + + + + + + + + + +
    + + +
    + +
    + + +
    + +
    + +
    + + + + + + + + +
    {zdate($val->value,"Y-m-d")}
    + {$lang->cmd_open_calendar} + + +

    {htmlspecialchars($val->description)}

    +
    + + + +
    diff --git a/modules/member/tpl/join_form_list.html b/modules/member/tpl/join_form_list.html new file mode 100644 index 000000000..3f7a35158 --- /dev/null +++ b/modules/member/tpl/join_form_list.html @@ -0,0 +1,48 @@ + + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->column_title}{$lang->column_name}{$lang->column_type}{$lang->is_active}{$lang->is_required}{$lang->regdate}{$lang->cmd_move}{$lang->cmd_modify}{$lang->cmd_delete}
    {htmlspecialchars($val->column_title)}{$val->column_name}{$lang->column_type_list[$val->column_type]}{$val->is_active}{$val->required}{zdate($val->regdate,"Y-m-d")} + {$lang->cmd_move_up} + {$lang->cmd_move_down} + {$lang->cmd_modify}{$lang->cmd_delete}
    + + + diff --git a/modules/member/tpl/js/krzip_search.js b/modules/member/tpl/js/krzip_search.js new file mode 100644 index 000000000..fae64ca41 --- /dev/null +++ b/modules/member/tpl/js/krzip_search.js @@ -0,0 +1,71 @@ +/* 한국 우편 번호 관련 */ +function doHideKrZipList(column_name) { + var zone_list_obj = xGetElementById('zone_address_list_'+column_name); + var zone_search_obj = xGetElementById('zone_address_search_'+column_name); + var zone_addr1_obj = xGetElementById('zone_address_1_'+column_name); + var addr1_obj = xGetElementById('fo_insert_member')[column_name][0]; + var field_obj = xGetElementById('fo_insert_member')['_tmp_address_search_'+column_name]; + + zone_addr1_obj.style.display = 'none'; + zone_list_obj.style.display = 'none'; + zone_search_obj.style.display = 'inline'; + addr1_obj.value = ''; + field_obj.focus(); +} + +function doSelectKrZip(column_name) { + var zone_list_obj = xGetElementById('zone_address_list_'+column_name); + var zone_search_obj = xGetElementById('zone_address_search_'+column_name); + var zone_addr1_obj = xGetElementById('zone_address_1_'+column_name); + var sel_obj = xGetElementById('fo_insert_member')['_tmp_address_list_'+column_name]; + var value = sel_obj.options[sel_obj.selectedIndex].value; + var addr1_obj = xGetElementById('fo_insert_member')[column_name][0]; + var addr2_obj = xGetElementById('fo_insert_member')[column_name][1]; + addr1_obj.value = value; + zone_search_obj.style.display = 'none'; + zone_list_obj.style.display = 'none'; + zone_addr1_obj.style.display = 'inline'; + addr2_obj.focus(); +} + +function doSearchKrZip(column_name) { + var field_obj = xGetElementById('fo_insert_member')['_tmp_address_search_'+column_name]; + var addr = field_obj.value; + if(!addr) return; + + var params = new Array(); + params['addr'] = addr; + params['column_name'] = column_name; + + var response_tags = new Array('error','message','address_list'); + exec_xml('krzip', 'getKrzipCodeList', params, completeSearchKrZip, response_tags, params); +} + +function completeSearchKrZip(ret_obj, response_tags, callback_args) { + if(!ret_obj['address_list']) { + alert(alert_msg['address']); + return; + } + var address_list = ret_obj['address_list'].split("\n"); + var column_name = callback_args['column_name']; + + var zone_list_obj = xGetElementById('zone_address_list_'+column_name); + var zone_search_obj = xGetElementById('zone_address_search_'+column_name); + var zone_addr1_obj = xGetElementById('zone_address_1_'+column_name); + var sel_obj = xGetElementById('fo_insert_member')['_tmp_address_list_'+column_name]; + + for(var i=0;i + + + +
    + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->enable_openid} + enable_openid=='Y')-->checked="checked" class="checkbox" /> + {$lang->about_enable_openid} +
    {$lang->enable_join} + enable_join=='Y')-->checked="checked" class="checkbox" /> + {$lang->about_enable_join} +
    {$lang->limit_day} + {$lang->unit_day} +

    {$lang->about_limit_day}

    +
    {$lang->image_name} +

    + image_name=='Y')-->checked="checked" class="checkbox" /> + {$lang->about_image_name} +

    + {$lang->image_name_max_width} : px
    + {$lang->image_name_max_height} : px
    +
    {$lang->image_mark} +

    + image_mark=='Y')-->checked="checked" class="checkbox"/> + {$lang->about_image_mark} +

    + {$lang->image_mark_max_width} : px
    + {$lang->image_mark_max_height} : px
    +
    {$lang->redirect_url} + +

    {$lang->about_redirect_url}

    +
    {$lang->agreement} + {$editor} +

    {$lang->about_agreement}

    +
    {$lang->skin} + +
    {$lang->colorset}
    + +
    + + + {$lang->cmd_back} + +
    + +
    + + diff --git a/modules/member/tpl/member_info.html b/modules/member/tpl/member_info.html new file mode 100644 index 000000000..f91eaec41 --- /dev/null +++ b/modules/member/tpl/member_info.html @@ -0,0 +1,157 @@ + + + + + +
    + +
    + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->user_id}{htmlspecialchars($member_info->user_id)}
    {$lang->user_name}{htmlspecialchars($member_info->user_name)}
    {$lang->nick_name}{htmlspecialchars($member_info->nick_name)}
    {$lang->image_name} + + image_name + {$lang->cmd_delete} + +   + +
    +
    + + + + + +
    +
    {$lang->image_mark} + + image_mark + {$lang->cmd_delete} + +   + +
    +
    + + + + + +
    +
    {$lang->email_address}{htmlspecialchars($member_info->email_address)}
    {$lang->homepage}{htmlspecialchars($member_info->homepage)}
    {$lang->blog}{htmlspecialchars($member_info->blog)}
    {$lang->birthday}{zdate($member_info->birthday,'Y-m-d')}
    {$lang->allow_mailing}{$member_info->allow_mailing}
    {$lang->allow_message}{$lang->allow_message_type[$member_info->allow_message]}
    {$lang->signature}{$member_info->signature}
    {$lang->denied}{$member_info->denied}
    {$lang->limit_date} + + {zdate($member_info->limit_date,"Y-m-d H:i")} + +
    {$lang->is_admin}{$member_info->is_admin}
    {$lang->group} + + {$val} + +
    {htmlspecialchars($val->column_title)} + + {htmlspecialchars($val->value[0])} - {htmlspecialchars($val->value[1])} - {htmlspecialchars($val->value[2])} + + {htmlspecialchars($val->value[0])} {htmlspecialchars($val->value[1])} + + {htmlspecialchars(implode(",",$val->value))} + + {zdate($val->value, "Y-m-d")} + + {htmlspecialchars($val->value)} + +
    {$lang->description}{htmlspecialchars($member_info->description)}
    + + + + diff --git a/modules/member/tpl/member_list.html b/modules/member/tpl/member_list.html new file mode 100644 index 000000000..91eea8141 --- /dev/null +++ b/modules/member/tpl/member_list.html @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->no}{$lang->user_id}{$lang->user_name}{$lang->nick_name}{$lang->allow_mailing}{$lang->denied}{$lang->signup_date}{$lang->last_login}{$lang->cmd_delete}
    {$no}{htmlspecialchars($val->user_id)}{htmlspecialchars($val->user_name)}
    {htmlspecialchars($val->nick_name)}
    {$val->allow_mailing}{$val->denied}{zdate($val->regdate,"Y-m-d")}{zdate($val->last_login,"Y-m-d H:i:s")}{$lang->cmd_delete}
    + + + + + + + + +
    + + + +
    + + + + + + + + {$lang->cmd_cancel} +
    +
    diff --git a/modules/menu/conf/info.xml b/modules/menu/conf/info.xml new file mode 100644 index 000000000..4d278559a --- /dev/null +++ b/modules/menu/conf/info.xml @@ -0,0 +1,17 @@ + + + 메뉴 + 菜单 + メニュー + Menu + + 제로 + zero + Zero + zero + 레이아웃, 모듈을 연결하는 메뉴를 생성/관리하는 모듈입니다. + 此模块将生成并管理连接布局,模块的菜单。 + レイアウト、モジュールを連動させるメニューを作成・管理するモジュールです。 + This module is for creating/managering menues that linking layouts or modules. + + diff --git a/modules/menu/conf/module.xml b/modules/menu/conf/module.xml new file mode 100644 index 000000000..d9c0f3dcd --- /dev/null +++ b/modules/menu/conf/module.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/modules/menu/lang/en.lang.php b/modules/menu/lang/en.lang.php new file mode 100644 index 000000000..3de86df16 --- /dev/null +++ b/modules/menu/lang/en.lang.php @@ -0,0 +1,51 @@ + + * @brief Menu module's basic language pack + **/ + + $lang->cmd_menu_insert = 'Create menu'; + $lang->cmd_menu_management = 'Menu management'; + + $lang->menu = 'Menu'; + $lang->menu_count = 'No. of menu'; + $lang->menu_management = 'Menu management'; + $lang->depth = 'Step'; + $lang->parent_menu_name = 'Parent menu name'; + $lang->menu_name = 'Menu name'; + $lang->menu_srl = 'Menu SRL'; + $lang->menu_id = 'Menu ID'; + $lang->menu_url = 'Menu URL'; + $lang->menu_open_window = 'Open a new window'; + $lang->menu_expand = 'Expand'; + $lang->menu_img_btn = 'Image button'; + $lang->menu_normal_btn = 'Normal'; + $lang->menu_hover_btn = 'Mouse over'; + $lang->menu_active_btn = 'When selected'; + $lang->menu_group_srls = 'Accessable groups'; + $lang->layout_maker = "Layout maker"; + $lang->layout_history = "Update history "; + $lang->layout_info = "Layout info"; + $lang->layout_list = 'Layout list'; + $lang->downloaded_list = 'Downloaded list'; + $lang->limit_menu_depth = 'Display enabled'; + + $lang->cmd_make_child = 'Add a child menu'; + $lang->cmd_move_to_installed_list = "View created lists"; + $lang->cmd_enable_move_menu = "Move menu (Drag the top menu after selecting)"; + $lang->cmd_search_mid = "Search mid"; + + $lang->msg_cannot_delete_for_child = 'Cannot delete a menu having a child menu.'; + + $lang->about_title = 'Enter a title which can be easily recognized when linked to a module.'; + $lang->about_menu_management = "Menu management enables you to consist menu in the selected layout.\nYou can create menu upto setted depth and can enter information in details by clicking the menu.\nMenu will be expanded by cliking the folder image.\nIf menu is not shown normally, refresh the information by clicking the button \"Re-create cache file\".\n* Menu created over the depth limit may not be shown properly."; + $lang->about_menu_name = 'The name will be shown as a menu name if it is not an admin or image button.'; + $lang->about_menu_url = "It is the menu URL when select the menu.
    You may enter only id value to link to other module.
    If no contents exist, nothing will happen even though you click the menu."; + $lang->about_menu_open_window = 'You can assign it to open a page in a new window when the menu clicked.'; + $lang->about_menu_expand = 'It enables the menu to remain expanded when the tree menu(tree_menu.js) is used.'; + $lang->about_menu_img_btn = 'If you register an image button, the image button will automatically replace the text button, and it will be shown in the layout.'; + $lang->about_menu_group_srls = 'If you select a group, only the group members can see the menu. (if xml file is directly opened, it will be shown.)'; + + $lang->about_menu = "Menu module will help you to create a complete site through the convenient menu management which arranges created modules and links to layouts without any manual works..\nMenu is not a site manager, but it just has information which can link to modules and layouts so you can express different types of menu."; +?> diff --git a/modules/menu/lang/jp.lang.php b/modules/menu/lang/jp.lang.php new file mode 100644 index 000000000..cb2e1be03 --- /dev/null +++ b/modules/menu/lang/jp.lang.php @@ -0,0 +1,51 @@ + 翻訳:RisaPapa + * @brief メニュー(menu)モジュールの基本言語パッケージ + **/ + + $lang->cmd_menu_insert = 'メニュー生成'; + $lang->cmd_menu_management = 'メニュー設定'; + + $lang->menu = 'メニュー'; + $lang->menu_count = 'メニュー数'; + $lang->menu_management = 'メニュー管理'; + $lang->depth = 'スレッド'; + $lang->parent_menu_name = '上位メニュー名'; + $lang->menu_name = 'メニュー名'; + $lang->menu_srl = 'メニュー固有番号'; + $lang->menu_id = 'メニュー名'; + $lang->menu_url = 'リンクURL'; + $lang->menu_open_window = '新しいウィンドウズで開く'; + $lang->menu_expand = '拡張表示'; + $lang->menu_img_btn = 'イメージボタン'; + $lang->menu_normal_btn = '一般ボタン'; + $lang->menu_hover_btn = 'マウスオーバー'; + $lang->menu_active_btn = '選択時のボタン'; + $lang->menu_group_srls = 'グループ制限'; + $lang->layout_maker = "レイアウト作者"; + $lang->layout_history = "変更内容"; + $lang->layout_info = "レイアウト情報"; + $lang->layout_list = 'レイアウトリスト'; + $lang->downloaded_list = 'ダウンロードリスト'; + $lang->limit_menu_depth = '表示スレッド'; + + $lang->cmd_make_child = '下位メニュー追加'; + $lang->cmd_move_to_installed_list = "生成されたリスト表示"; + $lang->cmd_enable_move_menu = "メニュー移動(選択後メニューをドラッグしてください)"; + $lang->cmd_search_mid = "mid 検索"; + + $lang->msg_cannot_delete_for_child = '下位メニューが存在するメニューは削除できません。'; + + $lang->about_title = 'モジュールをリンクする際に区別し易いタイトルを入力してください。'; + $lang->about_menu_management = "メニュー管理は、選択されたレイアウトで使用するメニューを構成できるようにします。
    一定レベルまでメニューの構成ができ、入力したメニューをクリックすると詳細情報が入力できます。
    フォルダーのイメージをクリックするとメニューを拡張することができます。
    もしメニューが正常に表示されない場合は、 「キャッシュファイル再生成」ボタンをクリックして情報を更新してください。
    * 一定レベル以上のメニューは正しく表示されない場合があります。"; + $lang->about_menu_name = '管理及びイメージボタンではない場合、メニュー名として表示されるタイトルです。'; + $lang->about_menu_url = "メニュー選択時、移動するURLです。
    他のモジュールとリンクを張る場合はIDの値のみ入力してください。
    内容がない場合は、メニューを選択しても何の動作もありません。"; + $lang->about_menu_open_window = 'メニュー選択時、新しいウィンドウで開くかを指定することができます。'; + $lang->about_menu_expand = 'ツリーメニュー(tree_menu.js)を利用すると常に拡張表示(すべて表示)の状態にすることができます。'; + $lang->about_menu_img_btn = 'イメージボタンを登録するとレイアウトで自動的にイメージボタンに入れ替わって表示されます。'; + $lang->about_menu_group_srls = 'グループを選択すると該当するグループのユーザにのみメニューが表示されます(XMLファイルを直接開くと情報が表示されます)。'; + + $lang->about_menu = "メニューモジュルは、生成されたモジュールを、便利なメニュー管理機能で、整理したりレイアウトをリンクしたりして煩わしい作業なしでサイトを構築できるようにします。メニューは、サイトを管理するというより、モジュールとレイアウトをリンクして様々なメニューを表示させる情報のみ保持します。"; +?> diff --git a/modules/menu/lang/ko.lang.php b/modules/menu/lang/ko.lang.php new file mode 100644 index 000000000..66f52c674 --- /dev/null +++ b/modules/menu/lang/ko.lang.php @@ -0,0 +1,51 @@ + + * @brief 메뉴(menu) 모듈의 기본 언어팩 + **/ + + $lang->cmd_menu_insert = '메뉴 생성'; + $lang->cmd_menu_management = '메뉴 설정'; + + $lang->menu = '메뉴'; + $lang->menu_count = '메뉴의 수'; + $lang->menu_management = '메뉴 관리'; + $lang->depth = '단계'; + $lang->parent_menu_name = '상위 메뉴명'; + $lang->menu_name = '메뉴명'; + $lang->menu_srl = '메뉴의 고유 번호'; + $lang->menu_id = '메뉴의 이름'; + $lang->menu_url = '연결 url'; + $lang->menu_open_window = '새창 열기'; + $lang->menu_expand = '펼침'; + $lang->menu_img_btn = '이미지 버튼'; + $lang->menu_normal_btn = '일반'; + $lang->menu_hover_btn = '마우스오버'; + $lang->menu_active_btn = '선택시'; + $lang->menu_group_srls = '그룹 제한'; + $lang->layout_maker = "레이아웃 제작자"; + $lang->layout_history = "변경 사항 "; + $lang->layout_info = "레이아웃 정보"; + $lang->layout_list = '레이아웃 목록'; + $lang->downloaded_list = '다운로드 목록'; + $lang->limit_menu_depth = '표시 가능'; + + $lang->cmd_make_child = '하부 메뉴 추가'; + $lang->cmd_move_to_installed_list = "생성된 목록 보기"; + $lang->cmd_enable_move_menu = "메뉴 옮기기 (선택후 위 메뉴를 드래그하세요)"; + $lang->cmd_search_mid = "mid 찾기"; + + $lang->msg_cannot_delete_for_child = '하부 메뉴가 있는 메뉴는 삭제하실 수 없습니다'; + + $lang->about_title = '모듈에 연결시 쉽게 구분할 수 있는 제목을 입력해주세요'; + $lang->about_menu_management = "메뉴관리는 선택하신 레이아웃에서 사용하는 메뉴를 구성할 수 있도록 합니다.\n정해진 단계까지 메뉴를 구성 가능하며 입력하신 메뉴를 클릭하시면 상세 정보를 입력할 수 있습니다.\n폴더그림을 클릭하시면 메뉴를 확장하실 수 있습니다.\n간혹 메뉴가 정상적으로 나타나지 않으면 \"캐시파일 재생성\" 버튼을 눌러서 정보를 갱신하세요.\n* 정해진 단계 이상의 메뉴는 제대로 표시되지 않을 수 있습니다."; + $lang->about_menu_name = '관리 및 이미지 버튼이 아닐경우 메뉴 명으로 나타날 제목입니다'; + $lang->about_menu_url = "메뉴를 선택시 이동한 URL입니다.
    다른 모듈을 연결하고자 할 때에는 id값만 입력해주시면 됩니다.
    내용이 없을시 메뉴를 선택하여도 아무런 동작이 없게 됩니다."; + $lang->about_menu_open_window = '메뉴 선택시 새창으로 띄울 것인지를 정할 수 있습니다'; + $lang->about_menu_expand = '트리메뉴(tree_menu.js)를 사용시 늘 펼쳐진 상태로 있게 합니다'; + $lang->about_menu_img_btn = '이미지 버튼을 등록하시면 레이아웃에서 자동으로 이미지 버튼으로 교체되어 표시가 됩니다.'; + $lang->about_menu_group_srls = '그룹을 선택하시면 해당 그룹의 사용자만 메뉴가 보이게 됩니다. (xml파일을 직접 열람하면 노출이 됩니다)'; + + $lang->about_menu = "메뉴모듈은 생성된 모듈을 편리한 메뉴관리기를 통해 정리하고 레이아웃과 연결하여 별도의 수작업 없이 완성된 사이트를 구축하도록 도와줍니다..\n메뉴는 사이트를 관리하기 보다는 모듈과 레이아웃을 연결해 주며 레이아웃을 통해서 여러가지 형태의 메뉴를 표시할 수 있도록 하는 정보만 가지고 있습니다."; +?> diff --git a/modules/menu/lang/zh-CN.lang.php b/modules/menu/lang/zh-CN.lang.php new file mode 100644 index 000000000..5adcb3292 --- /dev/null +++ b/modules/menu/lang/zh-CN.lang.php @@ -0,0 +1,51 @@ + + * @brief 菜单(menu) 模块的基本语言包 + **/ + + $lang->cmd_menu_insert = '生成菜单'; + $lang->cmd_menu_management = '菜单设置'; + + $lang->menu = '菜单'; + $lang->menu_count = '菜单数'; + $lang->menu_management = '菜单管理'; + $lang->depth = '层级'; + $lang->parent_menu_name = '上级菜单名'; + $lang->menu_name = '菜单名'; + $lang->menu_srl = '菜单固有编号'; + $lang->menu_id = '菜单名称'; + $lang->menu_url = '链接'; + $lang->menu_open_window = '新窗口'; + $lang->menu_expand = '展开'; + $lang->menu_img_btn = '图片按钮'; + $lang->menu_normal_btn = '普通'; + $lang->menu_hover_btn = '鼠标滑过'; + $lang->menu_active_btn = '激活链接'; + $lang->menu_group_srls = '用户组'; + $lang->layout_maker = "布局作者"; + $lang->layout_history = "更新列表 "; + $lang->layout_info = "布局信息"; + $lang->layout_list = '布局目录'; + $lang->downloaded_list = '下载目录'; + $lang->limit_menu_depth = '可显示'; + + $lang->cmd_make_child = '添加下级菜单'; + $lang->cmd_move_to_installed_list = "查看生成目录"; + $lang->cmd_enable_move_menu = "移动菜单 (选择后用鼠标拖动)"; + $lang->cmd_search_mid = "查找 mid"; + + $lang->msg_cannot_delete_for_child = '有下级菜单的菜单不能删除。'; + + $lang->about_title = '请输入连接模块时容易区分的标题。'; + $lang->about_menu_management = "菜单管理可以构筑被选布局中使用的菜单。\n不仅可以构筑指定级(层级)菜单,点击输入的菜单项即可对其详细设置。\n点击菜单前置图标可以展开菜单。\n偶尔不能正常显示菜单时,请按\"缓冲文件再生成\"按钮更新信息。\n* 可能不能正常显示指定级(层级)以上的菜单。"; + $lang->about_menu_name = '输入不是图片按钮时显示为菜单名标题。'; + $lang->about_menu_url = "点击菜单时要移动的URL。
    连接其他模块时只输入id值即可。
    没有内容时点击菜单也不会有什么动作。"; + $lang->about_menu_open_window = '可以设置点击菜单时是否要在新窗口中打开。'; + $lang->about_menu_expand = '使用树型(tree_menu.js)菜单时总是呈展开状态。'; + $lang->about_menu_img_btn = '如登录图片按钮,在布局中自动替换显示为图片按钮。'; + $lang->about_menu_group_srls = '如选择用户组,只有所属组用户才能看到此菜单。 —(xml文件中不能隐藏)'; + + $lang->about_menu = "菜单模块可以通过菜单管理器整理已生成的模块并同布局相连接来轻松建设一个完整的网站。\n菜单模块虽然具有连接模块和布局并通过布局来显示多种形态菜单的信息,但它不具备管理网站的功能。"; +?> diff --git a/modules/menu/menu.admin.controller.php b/modules/menu/menu.admin.controller.php new file mode 100644 index 000000000..068589faa --- /dev/null +++ b/modules/menu/menu.admin.controller.php @@ -0,0 +1,432 @@ +title = Context::get('title'); + $args->menu_srl = getNextSequence(); + $args->listorder = $args->menu_srl * -1; + + $output = executeQuery('menu.insertMenu', $args); + if(!$output->toBool()) return $output; + + $this->add('menu_srl', $args->menu_srl); + $this->setMessage('success_registed'); + } + + /** + * @brief 메뉴 제목 변경 + **/ + function procMenuAdminUpdate() { + // 입력할 변수 정리 + $args->title = Context::get('title'); + $args->menu_srl = Context::get('menu_srl'); + + $output = executeQuery('menu.updateMenu', $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_registed'); + } + + /** + * @brief 메뉴 삭제 + * menu_item과 xml 캐시 파일 모두 삭제 + **/ + function procMenuAdminDelete() { + $menu_srl = Context::get('menu_srl'); + + // 캐시 파일 삭제 + $cache_list = FileHandler::readDir("./files/cache/menu","",false,true); + if(count($cache_list)) { + foreach($cache_list as $cache_file) { + $pos = strpos($cache_file, $menu_srl.'_'); + if($pos>0) unlink($cache_file); + } + } + + $args->menu_srl = $menu_srl; + + // 메뉴 메뉴 삭제 + $output = executeQuery("menu.deleteMenuItems", $args); + if(!$output->toBool()) return $output; + + // 메뉴 삭제 + $output = executeQuery("menu.deleteMenu", $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_deleted'); + } + + /** + * @brief 메뉴에 아이템 추가 + **/ + function procMenuAdminInsertItem() { + // 입력할 변수 정리 + $source_args = Context::getRequestVars(); + unset($source_args->module); + unset($source_args->act); + if($source_args->menu_open_window!="Y") $source_args->menu_open_window = "N"; + if($source_args->menu_expand !="Y") $source_args->menu_expand = "N"; + $source_args->group_srls = str_replace('|@|',',',$source_args->group_srls); + $source_args->parent_srl = (int)$source_args->parent_srl; + + // 변수를 다시 정리 (form문의 column과 DB column이 달라서) + $args->menu_srl = $source_args->menu_srl; + $args->menu_item_srl = $source_args->menu_item_srl; + $args->parent_srl = $source_args->parent_srl; + $args->menu_srl = $source_args->menu_srl; + $args->menu_id = $source_args->menu_id; + $args->name = $source_args->menu_name; + $args->url = trim($source_args->menu_url); + $args->open_window = $source_args->menu_open_window; + $args->expand = $source_args->menu_expand; + $args->normal_btn = $source_args->menu_normal_btn; + $args->hover_btn = $source_args->menu_hover_btn; + $args->active_btn = $source_args->menu_active_btn; + $args->group_srls = $source_args->group_srls; + + // 이미 존재하는지를 확인 + $oMenuModel = &getAdminModel('menu'); + $item_info = $oMenuModel->getMenuItemInfo($args->menu_item_srl); + + // 존재하게 되면 update를 해준다 + if($item_info->menu_item_srl == $args->menu_item_srl) { + $output = executeQuery('menu.updateMenuItem', $args); + if(!$output->toBool()) return $output; + + // 존재하지 않으면 insert를 해준다 + } else { + $args->listorder = -1*$args->menu_item_srl; + $output = executeQuery('menu.insertMenuItem', $args); + if(!$output->toBool()) return $output; + } + + // 해당 메뉴의 정보를 구함 + $menu_info = $oMenuModel->getMenu($args->menu_srl); + $menu_title = $menu_info->title; + + // XML 파일을 갱신하고 위치을 넘겨 받음 + $xml_file = $this->makeXmlFile($args->menu_srl); + + // url이 mid일 경우 기록 남김 + if(eregi('^([a-zA-Z0-9\_\-]+)$', $args->url)) { + $mid = $args->url; + + $mid_args->menu_srl = $args->menu_srl; + $mid_args->mid = $mid; + + // menu_srl에 해당하는 레이아웃 값을 구함 + $output = executeQuery('menu.getMenuLayout', $args); + + // 해당 모듈에 레이아웃 값이 정해져 있지 않으면 지정 + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByMid($mid); + if(!$module_info->layout_srl&&$output->data->layout_srl) $mid_args->layout_srl = $output->data->layout_srl; + + // 해당 mid의 메뉴값을 선택된 메뉴로 변경 + $oModuleController = &getController('module'); + $oModuleController->updateModuleMenu($mid_args); + } + + $this->add('xml_file', $xml_file); + $this->add('menu_srl', $args->menu_srl); + $this->add('menu_item_srl', $args->menu_item_srl); + $this->add('menu_title', $menu_title); + $this->add('parent_srl', $args->parent_srl); + } + + /** + * @brief 메뉴 메뉴 삭제 + **/ + function procMenuAdminDeleteItem() { + // 변수 정리 + $args = Context::gets('menu_srl','menu_item_srl'); + + $oMenuAdminModel = &getAdminModel('menu'); + + // 원정보를 가져옴 + $item_info = $oMenuAdminModel->getMenuItemInfo($args->menu_item_srl); + if($item_info->parent_srl) $parent_srl = $item_info->parent_srl; + + // 자식 노드가 있는지 체크하여 있으면 삭제 못한다는 에러 출력 + $output = executeQuery('menu.getChildMenuCount', $args); + if(!$output->toBool()) return $output; + if($output->data->count>0) return new Object(-1, 'msg_cannot_delete_for_child'); + + // DB에서 삭제 + $output = executeQuery("menu.deleteMenuItem", $args); + if(!$output->toBool()) return $output; + + // 해당 메뉴의 정보를 구함 + $menu_info = $oMenuAdminModel->getMenu($args->menu_srl); + $menu_title = $menu_info->title; + + // XML 파일을 갱신하고 위치을 넘겨 받음 + $xml_file = $this->makeXmlFile($args->menu_srl); + + $this->add('xml_file', $xml_file); + $this->add('menu_title', $menu_title); + $this->add('menu_item_srl', $parent_srl); + $this->setMessage('success_deleted'); + } + + /** + * @brief 메뉴의 메뉴를 이동 + **/ + function procMenuAdminMoveItem() { + // 변수 설정 + $menu_id = Context::get('menu_id'); + $source_item_srl = str_replace('menu_'.$menu_id.'_','',Context::get('source_item_srl')); + $target_item_srl = str_replace('menu_'.$menu_id.'_','',Context::get('target_item_srl')); + + // target_item 의 값을 구함 + $oMenuModel = &getAdminModel('menu'); + $target_item = $oMenuModel->getMenuItemInfo($target_item_srl); + + // source_item에 target_item_srl의 parent_srl, listorder 값을 입력 + $source_args->menu_item_srl = $source_item_srl; + $source_args->parent_srl = $target_item->parent_srl; + $source_args->listorder = $target_item->listorder; + $output = executeQuery('menu.updateMenuItemParent', $source_args); + if(!$output->toBool()) return $output; + + // target_item의 listorder값을 +1해 준다 + $target_args->menu_item_srl = $target_item_srl; + $target_args->parent_srl = $target_item->parent_srl; + $target_args->listorder = $target_item->listorder -1; + $output = executeQuery('menu.updateMenuItemParent', $target_args); + if(!$output->toBool()) return $output; + + // xml파일 재생성 + $xml_file = $this->makeXmlFile($target_item->menu_srl); + + // return 변수 설정 + $this->add('menu_srl', $target_item->menu_srl); + $this->add('xml_file', $xml_file); + $this->add('source_item_srl', $source_item_srl); + } + + /** + * @brief xml 파일을 갱신 + * 관리자페이지에서 메뉴 구성 후 간혹 xml파일이 재생성 안되는 경우가 있는데\n + * 이럴 경우 관리자의 수동 갱신 기능을 구현해줌\n + * 개발 중간의 문제인 것 같고 현재는 문제가 생기지 않으나 굳이 없앨 필요 없는 기능 + **/ + function procMenuAdminMakeXmlFile() { + // 입력값을 체크 + $menu_srl = Context::get('menu_srl'); + + // 해당 메뉴의 정보를 구함 + $oMenuAdminModel = &getAdminModel('menu'); + $menu_info = $oMenuAdminModel->getMenu($menu_srl); + $menu_title = $menu_info->title; + + // xml파일 재생성 + $xml_file = $this->makeXmlFile($menu_srl); + + // return 값 설정 + $this->add('menu_title',$menu_title); + $this->add('xml_file',$xml_file); + } + + /** + * @brief 메뉴의 xml 파일을 만들고 위치를 return + **/ + function makeXmlFile($menu_srl) { + // xml파일 생성시 필요한 정보가 없으면 그냥 return + if(!$menu_srl) return; + + // DB에서 menu_srl에 해당하는 메뉴 아이템 목록을 listorder순으로 구해옴 + $args->menu_srl = $menu_srl; + $args->sort_index = 'listorder'; + $output = executeQuery('menu.getMenuItems', $args); + if(!$output->toBool()) return; + + // 캐시 파일의 이름을 지정 + $xml_file = sprintf("./files/cache/menu/%s.xml.php", $menu_srl); + $php_file = sprintf("./files/cache/menu/%s.php", $menu_srl); + + // 구해온 데이터가 없다면 노드데이터가 없는 xml 파일만 생성 + $list = $output->data; + if(!$list) { + $xml_buff = ""; + FileHandler::writeFile($xml_file, $xml_buff); + return $xml_file; + } + + // 구해온 데이터가 하나라면 array로 바꾸어줌 + if(!is_array($list)) $list = array($list); + + // 루프를 돌면서 tree 구성 + $list_count = count($list); + for($i=0;$i<$list_count;$i++) { + $node = $list[$i]; + $menu_item_srl = $node->menu_item_srl; + $parent_srl = $node->parent_srl; + + $tree[$parent_srl][$menu_item_srl] = $node; + } + + // xml 캐시 파일 생성 + $xml_buff = sprintf('%s', $this->getXmlTree($tree[0], $tree)); + + // php 캐시 파일 생성 + $php_output = $this->getPhpCacheCode($tree[0], $tree); + $php_buff = sprintf('list = array(%s); ?>', $php_output['buff']); + + // 파일 저장 + FileHandler::writeFile($xml_file, $xml_buff); + FileHandler::writeFile($php_file, $php_buff); + return $xml_file; + } + + /** + * @brief array로 정렬된 노드들을 parent_srl을 참조하면서 recursive하게 돌면서 xml 데이터 생성 + * 메뉴 xml파일은 node라는 tag가 중첩으로 사용되며 이 xml doc으로 관리자 페이지에서 메뉴를 구성해줌\n + * (tree_menu.js 에서 xml파일을 바로 읽고 tree menu를 구현) + **/ + function getXmlTree($source_node, $tree) { + if(!$source_node) return; + foreach($source_node as $menu_item_srl => $node) { + $child_buff = ""; + + // 자식 노드의 데이터 가져옴 + if($menu_item_srl&&$tree[$menu_item_srl]) $child_buff = $this->getXmlTree($tree[$menu_item_srl], $tree); + + // 변수 정리 + $name = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->name); + $url = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->url); + if(eregi('^([0-9a-zA-Z\_\-]+)$', $node->url)) $href = getUrl('','mid',$node->url); + else $href = $url; + $open_window = $node->open_window; + $expand = $node->expand; + $normal_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->normal_btn); + $hover_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->hover_btn); + $active_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->active_btn); + $group_srls = $node->group_srls; + + // node->group_srls값이 있으면 + if($group_srls) $group_check_code = sprintf('($_SESSION["is_admin"]==true||(is_array($_SESSION["group_srls"])&&count(array_intersect($_SESSION["group_srls"], array(%s)))))',$group_srls); + else $group_check_code = "true"; + $attribute = sprintf( + 'node_srl="%s" text="" url="" href="" open_window="%s" expand="%s" normal_btn="%s" hover_btn="%s" active_btn="%s" ', + $menu_item_srl, + $group_check_code, + $name, + $group_check_code, + $url, + $group_check_code, + $href, + $open_window, + $expand, + $normal_btn, + $hover_btn, + $active_btn + ); + + if($child_buff) $buff .= sprintf('%s', $attribute, $child_buff); + else $buff .= sprintf('', $attribute); + } + return $buff; + } + + /** + * @brief array로 정렬된 노드들을 php code로 변경하여 return + * 메뉴에서 메뉴를 tpl에 사용시 xml데이터를 사용할 수도 있지만 별도의 javascript 사용이 필요하기에 + * php로 된 캐시파일을 만들어서 db이용없이 바로 메뉴 정보를 구할 수 있도록 한다 + * 이 캐시는 ModuleHandler::displayContent() 에서 include하여 Context::set() 한다 + **/ + function getPhpCacheCode($source_node, $tree) { + $output = array("buff"=>"", "url_list"=>array()); + if(!$source_node) return $output; + + foreach($source_node as $menu_item_srl => $node) { + // 자식 노드가 있으면 자식 노드의 데이터를 먼저 얻어옴 + if($menu_item_srl&&$tree[$menu_item_srl]) $child_output = $this->getPhpCacheCode($tree[$menu_item_srl], $tree); + else $child_output = array("buff"=>"", "url_list"=>array()); + + // 현재 노드의 url값이 공란이 아니라면 url_list 배열값에 입력 + if($node->url) $child_output['url_list'][] = $node->url; + $output['url_list'] = array_merge($output['url_list'], $child_output['url_list']); + + // node->group_srls값이 있으면 + if($node->group_srls) $group_check_code = sprintf('($_SESSION["is_admin"]==true||(is_array($_SESSION["group_srls"])&&count(array_intersect($_SESSION["group_srls"], array(%s)))))',$node->group_srls); + else $group_check_code = "true"; + + // 변수 정리 + $name = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->name); + $href = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->href); + $url = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->url); + if(eregi('^([0-9a-zA-Z\_\-]+)$', $node->url)) $href = getUrl('','mid',$node->url); + else $href = $url; + $open_window = $node->open_window; + $normal_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->normal_btn); + $hover_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->hover_btn); + $active_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->active_btn); + $selected = '"'.implode('","',$child_output['url_list']).'"'; + $child_buff = $child_output['buff']; + + // 속성을 생성한다 ( url_list를 이용해서 선택된 메뉴의 노드에 속하는지를 검사한다. 꽁수지만 빠르고 강력하다고 생각;;) + $attribute = sprintf( + '"node_srl"=>"%s","text"=>(%s?"%s":""),"href"=>(%s?"%s":""),"url"=>(%s?"%s":""),"open_window"=>"%s","normal_btn"=>"%s","hover_btn"=>"%s","active_btn"=>"%s","selected"=>(array(%s)&&in_array(Context::get("mid"),array(%s))?1:0),"list"=>array(%s)', + $node->menu_item_srl, + $group_check_code, + $name, + $group_check_code, + $href, + $group_check_code, + $url, + $open_window, + $normal_btn, + $hover_btn, + $active_btn, + $selected, + $selected, + $child_buff + ); + + // buff 데이터를 생성한다 + $output['buff'] .= sprintf('%s=>array(%s),', $node->menu_item_srl, $attribute); + } + return $output; + } + + /** + * @brief 메뉴와 레이아웃 매핑 + * 레이아웃에서 메뉴를 지정할때 지정된 메뉴의 기본 레이아웃을 매핑 + **/ + function updateMenuLayout($layout_srl, $menu_srl_list) { + if(!count($menu_srl_list)) return; + + // 일단 menu_srls의 값을 지움 + $args->menu_srls = implode(',',$menu_srl_list); + $output = executeQuery('menu.deleteMenuLayout', $args); + if(!$output->toBool()) return $output; + + $args->layout_srl = $layout_srl; + + // menu_srls, layout_srl 매핑 + for($i=0;$imenu_srl = $menu_srl_list[$i]; + $output = executeQuery('menu.insertMenuLayout', $args); + if(!$output->toBool()) return $output; + } + } + + } +?> diff --git a/modules/menu/menu.admin.model.php b/modules/menu/menu.admin.model.php new file mode 100644 index 000000000..47978ea07 --- /dev/null +++ b/modules/menu/menu.admin.model.php @@ -0,0 +1,125 @@ +sort_index = $obj->sort_index; + $args->page = $obj->page?$obj->page:1; + $args->list_count = $obj->list_count?$obj->list_count:20; + $args->page_count = $obj->page_count?$obj->page_count:10; + + // document.getDocumentList 쿼리 실행 + $output = executeQuery('menu.getMenuList', $args); + + // 결과가 없거나 오류 발생시 그냥 return + if(!$output->toBool()||!count($output->data)) return $output; + + return $output; + } + + /** + * @brief 등록된 모든 메뉴를 return + **/ + function getMenus() { + // 일단 DB에서 정보를 가져옴 + $args->menu_srl = $menu_srl; + $output = executeQuery('menu.getMenus', $args); + if(!$output->data) return; + $menus = $output->data; + if(!is_array($menus)) $menus = array($menus); + return $menus; + } + + /** + * @brief DB 에 생성된 한개의 메뉴 정보를 구함 + * 생성된 메뉴의 DB정보+XML정보를 return + **/ + function getMenu($menu_srl) { + // 일단 DB에서 정보를 가져옴 + $args->menu_srl = $menu_srl; + $output = executeQuery('menu.getMenu', $args); + if(!$output->data) return; + + $menu_info = $output->data; + $menu_info->xml_file = sprintf('./files/cache/menu/%s.xml.php',$menu_srl); + $menu_info->php_file = sprintf('./files/cache/menu/%s.php',$menu_srl); + return $menu_info; + } + + /** + * @brief 특정 menu_srl의 아이템 정보를 return + * 이 정보중에 group_srls의 경우는 , 로 연결되어 들어가며 사용시에는 explode를 통해 array로 변환 시킴 + **/ + function getMenuItemInfo($menu_item_srl) { + // menu_item_srl이 있으면 해당 메뉴의 정보를 가져온다 + $args->menu_item_srl = $menu_item_srl; + $output = executeQuery('menu.getMenuItem', $args); + $node = $output->data; + if($node->group_srls) $node->group_srls = explode(',',$node->group_srls); + else $node->group_srls = array(); + return $node; + } + + /** + * @brief 특정 menu_srl의 정보를 이용하여 템플릿을 구한후 return + * 관리자 페이지에서 특정 메뉴의 정보를 추가하기 위해 서버에서 tpl을 컴파일 한후 컴파일 된 html을 직접 return + **/ + function getMenuAdminTplInfo() { + // 해당 메뉴의 정보를 가져오기 위한 변수 설정 + $menu_item_srl = Context::get('menu_item_srl'); + $parent_srl = Context::get('parent_srl'); + + // 회원 그룹의 목록을 가져옴 + $oMemberModel = &getModel('member'); + $group_list = $oMemberModel->getGroups(); + Context::set('group_list', $group_list); + + // parent_srl이 있고 menu_item_srl이 없으면 하부 메뉴 추가임 + if(!$menu_item_srl && $parent_srl) { + // 상위 메뉴의 정보를 가져옴 + $parent_info = $this->getMenuItemInfo($parent_srl); + + // 추가하려는 메뉴의 기본 변수 설정 + $item_info->menu_item_srl = getNextSequence(); + $item_info->parent_srl = $parent_srl; + $item_info->parent_menu_name = $parent_info->name; + + // root에 메뉴 추가하거나 기존 메뉴의 수정일 경우 + } else { + // menu_item_srl 이 있으면 해당 메뉴의 정보를 가져온다 + if($menu_item_srl) $item_info = $this->getMenuItemInfo($menu_item_srl); + + // 찾아진 값이 없다면 신규 메뉴 추가로 보고 menu_item_srl값만 구해줌 + if(!$item_info->menu_item_srl) { + $item_info->menu_item_srl = getNextSequence(); + } + } + + Context::set('item_info', $item_info); + + // template 파일을 직접 컴파일한후 tpl변수에 담아서 return한다. + $oTemplate = &TemplateHandler::getInstance(); + $tpl = $oTemplate->compile($this->module_path.'tpl', 'menu_item_info'); + + // return 할 변수 설정 + $this->add('tpl', $tpl); + } + + } +?> diff --git a/modules/menu/menu.admin.view.php b/modules/menu/menu.admin.view.php new file mode 100644 index 000000000..247d8a653 --- /dev/null +++ b/modules/menu/menu.admin.view.php @@ -0,0 +1,106 @@ +setTemplatePath($this->module_path.'tpl'); + Context::addJsFile('./common/js/tree_menu.js'); + } + + /** + * @brief 메뉴 관리의 첫 페이지 + **/ + function dispMenuAdminContent() { + // 등록된 메뉴 목록을 구해옴 + $obj->page = Context::get('page'); + $obj->sort_index = 'listorder'; + $obj->list_count = 20; + $obj->page_count = 20; + + $oMenuModel = &getAdminModel('menu'); + $output = $oMenuModel->getMenuList($obj); + + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('menu_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + $this->setTemplateFile('index'); + } + + /** + * @brief 메뉴 등록 페이지 + **/ + function dispMenuAdminInsert() { + // 선택된 메뉴의 정보르 구해서 세팅 + $menu_srl = Context::get('menu_srl'); + + if($menu_srl) { + // 메뉴의 정보를 가져옴 + $oMenuModel = &getAdminModel('menu'); + $menu_info = $oMenuModel->getMenu($menu_srl); + if($menu_info->menu_srl == $menu_srl) Context::set('menu_info', $menu_info); + } + + $this->setTemplateFile('menu_insert'); + } + + /** + * @brief 메뉴 관리 페이지 + **/ + function dispMenuAdminManagement() { + // 선택된 메뉴의 정보르 구해서 세팅 + $menu_srl = Context::get('menu_srl'); + + if(!$menu_srl) return $this->dispMenuAdminContent(); + + // 메뉴의 정보를 가져옴 + $oMenuModel = &getAdminModel('menu'); + $menu_info = $oMenuModel->getMenu($menu_srl); + if($menu_info->menu_srl != $menu_srl) return $this->dispMenuAdminContent(); + + Context::set('menu_info', $menu_info); + + // 레이아웃을 팝업으로 지정 + Context::set('layout','none'); + $this->setTemplateFile('menu_management'); + } + + + /** + * @brief 메뉴에서 선택할 수 있는 mid목록을 보여줌 + **/ + function dispMenuAdminMidList() { + $oModuleModel = &getModel('module'); + + // 모듈 카테고리 목록을 구함 + $module_category = $oModuleModel->getModuleCategories(); + Context::set('module_category', $module_category); + + // 모듈 목록을 구함 + $module_list = $oModuleModel->getModuleList(); + Context::set('module_list', $module_list); + + // mid 목록을 구해옴 + $args->module_category_srl = Context::get('module_category_srl'); + $args->module = Context::get('target_module'); + $mid_list = $oModuleModel->getMidList($args); + Context::set('mid_list', $mid_list); + + // 메뉴을 팝업으로 지정 + $this->setLayoutFile('popup_layout'); + + // 템플릿 파일 지정 + $this->setTemplateFile('mid_list'); + } + } +?> diff --git a/modules/menu/menu.class.php b/modules/menu/menu.class.php new file mode 100644 index 000000000..d862e8913 --- /dev/null +++ b/modules/menu/menu.class.php @@ -0,0 +1,40 @@ +insertActionForward('menu', 'view', 'dispMenuAdminContent'); + $oModuleController->insertActionForward('menu', 'view', 'dispMenuAdminInsert'); + $oModuleController->insertActionForward('menu', 'view', 'dispMenuAdminManagement'); + + // 메뉴 사용할 디렉토리 생성 + FileHandler::makeDir('./files/cache/menu'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + } +?> diff --git a/modules/menu/queries/deleteMenu.xml b/modules/menu/queries/deleteMenu.xml new file mode 100644 index 000000000..344bc9af0 --- /dev/null +++ b/modules/menu/queries/deleteMenu.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/menu/queries/deleteMenuItem.xml b/modules/menu/queries/deleteMenuItem.xml new file mode 100644 index 000000000..2d09a5227 --- /dev/null +++ b/modules/menu/queries/deleteMenuItem.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/menu/queries/deleteMenuItems.xml b/modules/menu/queries/deleteMenuItems.xml new file mode 100644 index 000000000..cc637539a --- /dev/null +++ b/modules/menu/queries/deleteMenuItems.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/menu/queries/deleteMenuLayout.xml b/modules/menu/queries/deleteMenuLayout.xml new file mode 100644 index 000000000..178be8fe4 --- /dev/null +++ b/modules/menu/queries/deleteMenuLayout.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/menu/queries/getChildMenuCount.xml b/modules/menu/queries/getChildMenuCount.xml new file mode 100644 index 000000000..d60cf92a4 --- /dev/null +++ b/modules/menu/queries/getChildMenuCount.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/menu/queries/getMenu.xml b/modules/menu/queries/getMenu.xml new file mode 100644 index 000000000..a51fc0611 --- /dev/null +++ b/modules/menu/queries/getMenu.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/menu/queries/getMenuItem.xml b/modules/menu/queries/getMenuItem.xml new file mode 100644 index 000000000..3245463bb --- /dev/null +++ b/modules/menu/queries/getMenuItem.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/menu/queries/getMenuItems.xml b/modules/menu/queries/getMenuItems.xml new file mode 100644 index 000000000..4c82034fb --- /dev/null +++ b/modules/menu/queries/getMenuItems.xml @@ -0,0 +1,14 @@ + + +
    + + + + + + + + + + + diff --git a/modules/menu/queries/getMenuLayout.xml b/modules/menu/queries/getMenuLayout.xml new file mode 100644 index 000000000..47cf445d2 --- /dev/null +++ b/modules/menu/queries/getMenuLayout.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/menu/queries/getMenuList.xml b/modules/menu/queries/getMenuList.xml new file mode 100644 index 000000000..cf57379e2 --- /dev/null +++ b/modules/menu/queries/getMenuList.xml @@ -0,0 +1,14 @@ + + +
    + + + + + + + + + + + diff --git a/modules/menu/queries/getMenus.xml b/modules/menu/queries/getMenus.xml new file mode 100644 index 000000000..1c2667537 --- /dev/null +++ b/modules/menu/queries/getMenus.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/menu/queries/insertMenu.xml b/modules/menu/queries/insertMenu.xml new file mode 100644 index 000000000..6f09c6708 --- /dev/null +++ b/modules/menu/queries/insertMenu.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/menu/queries/insertMenuItem.xml b/modules/menu/queries/insertMenuItem.xml new file mode 100644 index 000000000..9dfbe3808 --- /dev/null +++ b/modules/menu/queries/insertMenuItem.xml @@ -0,0 +1,20 @@ + + +
    + + + + + + + + + + + + + + + + + diff --git a/modules/menu/queries/insertMenuLayout.xml b/modules/menu/queries/insertMenuLayout.xml new file mode 100644 index 000000000..2cc7e84fe --- /dev/null +++ b/modules/menu/queries/insertMenuLayout.xml @@ -0,0 +1,9 @@ + + +
    + + + + + + diff --git a/modules/menu/queries/updateMenu.xml b/modules/menu/queries/updateMenu.xml new file mode 100644 index 000000000..ba21fcb72 --- /dev/null +++ b/modules/menu/queries/updateMenu.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/menu/queries/updateMenuItem.xml b/modules/menu/queries/updateMenuItem.xml new file mode 100644 index 000000000..986300365 --- /dev/null +++ b/modules/menu/queries/updateMenuItem.xml @@ -0,0 +1,18 @@ + + +
    + + + + + + + + + + + + + + + diff --git a/modules/menu/queries/updateMenuItemParent.xml b/modules/menu/queries/updateMenuItemParent.xml new file mode 100644 index 000000000..d8c4ca707 --- /dev/null +++ b/modules/menu/queries/updateMenuItemParent.xml @@ -0,0 +1,12 @@ + + +
    + + + + + + + + + diff --git a/modules/menu/schemas/menu.xml b/modules/menu/schemas/menu.xml new file mode 100644 index 000000000..c8c6300b9 --- /dev/null +++ b/modules/menu/schemas/menu.xml @@ -0,0 +1,6 @@ +
    + + + + +
    diff --git a/modules/menu/schemas/menu_item.xml b/modules/menu/schemas/menu_item.xml new file mode 100644 index 000000000..217045dac --- /dev/null +++ b/modules/menu/schemas/menu_item.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + +
    diff --git a/modules/menu/schemas/menu_layout.xml b/modules/menu/schemas/menu_layout.xml new file mode 100644 index 000000000..279f8fe09 --- /dev/null +++ b/modules/menu/schemas/menu_layout.xml @@ -0,0 +1,4 @@ + + + +
    diff --git a/modules/menu/tpl/css/menu.css b/modules/menu/tpl/css/menu.css new file mode 100644 index 000000000..59cd716f9 --- /dev/null +++ b/modules/menu/tpl/css/menu.css @@ -0,0 +1,12 @@ +@charset "utf-8"; + +h3 { margin:0 20px 0 20px; } +.menuManagement { margin:20px; } +.menuListZone td { vertical-align:top; } +.menuListZone td.category_zone { padding-right:10px; } + +#category_list { padding:.5em 0 .5em 0; margin-bottom:2em; } +#category_list .checkbox { margin-top:1em; border:0px; } + +#menu_zone_info { background-color:#FFFFFF; z-index:999; display:none; overflow:hidden; padding-left:10px; border-left:1px dashed #CCCCCC; } +#category_info { background-color:#FFFFFF; z-index:999; display:none; overflow:hidden; padding-left:10px; border-left:1px dashed #CCCCCC; } diff --git a/modules/menu/tpl/filter/delete_menu.xml b/modules/menu/tpl/filter/delete_menu.xml new file mode 100644 index 000000000..b013fcd76 --- /dev/null +++ b/modules/menu/tpl/filter/delete_menu.xml @@ -0,0 +1,9 @@ + +
    + + + + + + +
    diff --git a/modules/menu/tpl/filter/delete_menu_item.xml b/modules/menu/tpl/filter/delete_menu_item.xml new file mode 100644 index 000000000..5faf59ae0 --- /dev/null +++ b/modules/menu/tpl/filter/delete_menu_item.xml @@ -0,0 +1,13 @@ + +
    + + + + + + + + + + +
    diff --git a/modules/menu/tpl/filter/insert_menu.xml b/modules/menu/tpl/filter/insert_menu.xml new file mode 100644 index 000000000..8e220f66f --- /dev/null +++ b/modules/menu/tpl/filter/insert_menu.xml @@ -0,0 +1,10 @@ + +
    + + + + + + + +
    diff --git a/modules/menu/tpl/filter/insert_menu_item.xml b/modules/menu/tpl/filter/insert_menu_item.xml new file mode 100644 index 000000000..e2bda88d8 --- /dev/null +++ b/modules/menu/tpl/filter/insert_menu_item.xml @@ -0,0 +1,14 @@ + +
    + + + + + + + + + + + +
    diff --git a/modules/menu/tpl/filter/move_menu_item.xml b/modules/menu/tpl/filter/move_menu_item.xml new file mode 100644 index 000000000..40a5bfbc5 --- /dev/null +++ b/modules/menu/tpl/filter/move_menu_item.xml @@ -0,0 +1,10 @@ + +
    + + + + + + + + diff --git a/modules/menu/tpl/filter/update_menu_title.xml b/modules/menu/tpl/filter/update_menu_title.xml new file mode 100644 index 000000000..0735aeb5c --- /dev/null +++ b/modules/menu/tpl/filter/update_menu_title.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/modules/menu/tpl/header.html b/modules/menu/tpl/header.html new file mode 100644 index 000000000..e4bde061d --- /dev/null +++ b/modules/menu/tpl/header.html @@ -0,0 +1,3 @@ + + +

    {$lang->menu} {$lang->cmd_management}

    diff --git a/modules/menu/tpl/index.html b/modules/menu/tpl/index.html new file mode 100644 index 000000000..31dcc4de1 --- /dev/null +++ b/modules/menu/tpl/index.html @@ -0,0 +1,55 @@ + + + + +
    {nl2br($lang->about_menu)}
    + + +
    + Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)} +
    + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +
    {$lang->no}{$lang->title}{$lang->regdate}{$lang->cmd_delete}
    {$no}{htmlspecialchars($val->title)}{zdate($val->regdate,"Y-m-d")}{$lang->cmd_delete}
    + + + + + + diff --git a/modules/menu/tpl/js/menu_admin.js b/modules/menu/tpl/js/menu_admin.js new file mode 100644 index 000000000..84ede30ca --- /dev/null +++ b/modules/menu/tpl/js/menu_admin.js @@ -0,0 +1,197 @@ +/* 메뉴 입력후 */ +function completeInsertMenu(ret_obj) { + var menu_srl = ret_obj['menu_srl']; + alert(ret_obj['message']); + location.href = current_url.setQuery('act','dispMenuAdminContent'); + + //var url = current_url.setQuery('act','dispMenuAdminManagement').setQuery('menu_srl',menu_srl); + //window.open(url); +} + +/* 메뉴 삭제 */ +function doDeleteMenu(menu_srl) { + var fo_obj = xGetElementById("fo_menu"); + if(!fo_obj) return; + fo_obj.menu_srl.value = menu_srl; + procFilter(fo_obj, delete_menu); +} + +/* 메뉴 삭제 후 */ +function completeDeleteMenu(ret_obj) { + var menu_srl = ret_obj['menu_srl']; + alert(ret_obj['message']); + location.href = current_url.setQuery('act','dispMenuAdminContent').setQuery('menu_srl',''); +} + +/* 빈 메뉴 아이템 추가 */ +function doInsertMenuItem(parent_srl) { + if(typeof(parent_srl)=='undefined') parent_srl = 0; + var params = {node_srl:0, parent_srl:parent_srl} + doGetMenuItemInfo('menu', params); + deSelectNode(); +} + +/* 메뉴 클릭시 적용할 함수 */ +function doGetMenuItemInfo(menu_id, obj) { + // menu, menu_id, node_srl을 추출 + var fo_obj = xGetElementById("fo_menu"); + var node_srl = 0; + var parent_srl = 0; + + if(typeof(obj)!="undefined") { + if(typeof(obj.getAttribute)!="undefined") { + node_srl = obj.getAttribute("node_srl"); + } else { + node_srl = obj.node_srl; + parent_srl = obj.parent_srl; + } + } + + var params = new Array(); + params["menu_item_srl"] = node_srl; + params["parent_srl"] = parent_srl; + + // 서버에 요청하여 해당 노드의 정보를 수정할 수 있도록 한다. + var response_tags = new Array('error','message','tpl'); + exec_xml('menu', 'getMenuAdminTplInfo', params, completeGetMenuItemTplInfo, response_tags, params); +} + +/* 서버로부터 받아온 메뉴 정보를 출력 */ +/* +xAddEventListener(document,'mousedown',checkMousePosition); +var _xPos = 0; +var _yPos = 0; +function checkMousePosition(e) { + var evt = new xEvent(e); + _xPos = evt.pageX; + _yPos = evt.pageY; +} +*/ + +function hideCategoryInfo() { + var obj = xGetElementById('menu_zone_info'); + xInnerHtml(obj,''); + obj.style.display = "none"; +} + +function completeGetMenuItemTplInfo(ret_obj, response_tags) { + var obj = xGetElementById('menu_zone_info'); + var tpl = ret_obj['tpl']; + xInnerHtml(obj, tpl); + obj.style.display = 'block'; + + var fo_obj = xGetElementById("fo_menu"); + fo_obj.menu_name.focus(); + + /* + var x = _xPos + 50; + var y = _yPos - xHeight(obj)/2 + 80 + xScrollTop(); + xLeft(obj, x); + xTop(obj, y); + xRemoveEventListener(document,'mousedown',checkMousePosition); + + if(xGetElementById('cBody') && xHeight('cBody')< y+xHeight(obj)+50) { + xHeight('cBody', y + xHeight(obj) + 50); + } + + if(typeof('fixAdminLayoutFooter')=="function") fixAdminLayoutFooter(); + */ +} + +/* 메뉴 아이템 입력후 */ +function completeInsertMenuItem(ret_obj) { + var menu_id = ret_obj['menu_id']; + var xml_file = ret_obj['xml_file']; + var menu_title = ret_obj['menu_title']; + var menu_srl = ret_obj['menu_srl']; + var menu_item_srl = ret_obj['menu_item_srl']; + var parent_srl = ret_obj['parent_srl']; + + if(!xml_file) return; + + loadTreeMenu(xml_file, 'menu', 'menu_zone_menu', menu_title, '', doGetMenuItemInfo, menu_item_srl, doMoveTree); + + if(!menu_srl) xInnerHtml("menu_zone_info", ""); + else { + var params = {node_srl:menu_item_srl, parent_srl:parent_srl} + doGetMenuItemInfo('menu', params) + } + + if(typeof('fixAdminLayoutFooter')=="function") fixAdminLayoutFooter(); +} + + +/* 메뉴를 드래그하여 이동한 후 실행할 함수 , 이동하는 item_srl과 대상 item_srl을 받음 */ +function doMoveTree(menu_id, source_item_srl, target_item_srl) { + var fo_obj = xGetElementById("fo_move_menu"); + fo_obj.menu_id.value = menu_id; + fo_obj.source_item_srl.value = source_item_srl; + fo_obj.target_item_srl.value = target_item_srl; + + // 이동 취소를 선택하였을 경우 다시 그림;; + if(!procFilter(fo_obj, move_menu_item)) { + var params = new Array(); + params["xml_file"] = xGetElementById('fo_menu').xml_file.value; + params["source_item_srl"] = source_item_srl; + completeMoveMenuItem(params); + } +} + +function completeMoveMenuItem(ret_obj) { + var source_item_srl = ret_obj['source_item_srl']; + var xml_file = ret_obj['xml_file']; + + var fo_menu = xGetElementById("fo_menu"); + if(!fo_menu) return; + + var title = fo_menu.title.value; + loadTreeMenu(xml_file, 'menu', "menu_zone_menu", title, '', doGetMenuItemInfo, source_item_srl, doMoveTree); +} + +/* 메뉴 목록 갱신 */ +function doReloadTreeMenu(menu_srl) { + var params = new Array(); + params["menu_srl"] = menu_srl; + + // 서버에 요청하여 해당 노드의 정보를 수정할 수 있도록 한다. + var response_tags = new Array('error','message', 'xml_file', 'menu_title'); + exec_xml('menu', 'procMenuAdminMakeXmlFile', params, completeInsertMenuItem, response_tags, params); +} + +/* 메뉴 삭제 */ +function doDeleteMenuItem(menu_item_srl) { + var fo_obj = xGetElementById("fo_menu"); + if(!fo_obj) return; + + procFilter(fo_obj, delete_menu_item); +} + +/* 메뉴 아이템 삭제 후 */ +function completeDeleteMenuItem(ret_obj) { + var menu_title = ret_obj['menu_title']; + var menu_srl = ret_obj['menu_srl']; + var menu_item_srl = ret_obj['menu_item_srl']; + var xml_file = ret_obj['xml_file']; + alert(ret_obj['message']); + + loadTreeMenu(xml_file, 'menu', 'menu_zone_menu', menu_title, '', doGetMenuItemInfo, menu_item_srl, doMoveTree); + xInnerHtml("menu_zone_info", ""); +} + + +/* 레이아웃의 메뉴에 mid 추가 */ +function doInsertMid(mid, menu_id) { + if(!opener) { + window.close(); + return; + } + + var fo_obj = opener.xGetElementById("fo_menu"); + if(!fo_obj) { + window.close(); + return; + } + + fo_obj.menu_url.value = mid; + window.close(); +} diff --git a/modules/menu/tpl/menu_insert.html b/modules/menu/tpl/menu_insert.html new file mode 100644 index 000000000..732332902 --- /dev/null +++ b/modules/menu/tpl/menu_insert.html @@ -0,0 +1,26 @@ + + + + +
    + + + + + + + + + + +
    {$lang->cmd_menu_insert}{nl2br($lang->about_menu_management)}
    {$lang->title} + +

    {$lang->about_title}

    +
    + + +
    + +
    + +
    diff --git a/modules/menu/tpl/menu_item_info.html b/modules/menu/tpl/menu_item_info.html new file mode 100644 index 000000000..133dd9204 --- /dev/null +++ b/modules/menu/tpl/menu_item_info.html @@ -0,0 +1,82 @@ + + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->parent_menu_name}{$item_info->parent_menu_name}
    {$lang->menu_name} + +

    {$lang->about_menu_name}

    +
    {$lang->menu_url} + + {$lang->cmd_search_mid} +

    {$lang->about_menu_url}

    +
    {$lang->menu_open_window} + open_window=="Y")-->checked="checked" /> +

    {$lang->about_menu_open_window}

    +
    {$lang->menu_expand} + expand=="Y")-->checked="checked" /> +

    {$lang->about_menu_expand}

    +
    {$lang->menu_img_btn}{$lang->about_menu_img_btn}
    {$lang->menu_normal_btn}
    {$lang->menu_hover_btn}
    {$lang->menu_active_btn}
    {$lang->menu_group_srls} + + group_srls)&&in_array($key, $item_info->group_srls))-->checked="checked"/> + + +

    {$lang->about_menu_group_srls}

    +
    + + + + diff --git a/modules/menu/tpl/menu_management.html b/modules/menu/tpl/menu_management.html new file mode 100644 index 000000000..a57376ac8 --- /dev/null +++ b/modules/menu/tpl/menu_management.html @@ -0,0 +1,91 @@ + + + + + + + + + diff --git a/modules/menu/tpl/mid_list.html b/modules/menu/tpl/mid_list.html new file mode 100644 index 000000000..2cd9372a2 --- /dev/null +++ b/modules/menu/tpl/mid_list.html @@ -0,0 +1,58 @@ + +
    +

    {$lang->cmd_search_mid}

    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    + + + + {$lang->mid}{$lang->cmd_select}
    + + {$lang->not_exists} + + {$module_category[$val->module_category_srl]->title} + + {$val->module}{$val->browser_title} ({$key}){$lang->cmd_select}
    + +
    +
    + + diff --git a/modules/message/conf/info.xml b/modules/message/conf/info.xml new file mode 100644 index 000000000..113c7e182 --- /dev/null +++ b/modules/message/conf/info.xml @@ -0,0 +1,17 @@ + + + 오류 표시 + エラー表示 + 错误信息 + Display Errors + + 제로 + Zero + zero + zero + 오류 및 각종 시스템 메세지 관리 모듈 + エラー及びシステムメッセージ管理モジュール + 管理错误信息及各种系统信息的模块。 + This module managers erros and system messages + + diff --git a/modules/message/conf/module.xml b/modules/message/conf/module.xml new file mode 100644 index 000000000..7c34885c1 --- /dev/null +++ b/modules/message/conf/module.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/modules/message/lang/en.lang.php b/modules/message/lang/en.lang.php new file mode 100644 index 000000000..2b6a35055 --- /dev/null +++ b/modules/message/lang/en.lang.php @@ -0,0 +1,10 @@ + + * @brief English language pack (basic) + **/ + + $lang->message = 'Show error'; + $lang->about_skin = "You can select skins of error messages"; +?> diff --git a/modules/message/lang/jp.lang.php b/modules/message/lang/jp.lang.php new file mode 100644 index 000000000..d1f6945b2 --- /dev/null +++ b/modules/message/lang/jp.lang.php @@ -0,0 +1,10 @@ + 翻訳:RisaPapa + * @brief 日本語言語パッページ(基本的な内容のみ) + **/ + + $lang->message = 'エラー表示'; + $lang->about_skin = "メッセージを表示する際のスキンが指定できます。"; +?> diff --git a/modules/message/lang/ko.lang.php b/modules/message/lang/ko.lang.php new file mode 100644 index 000000000..451552332 --- /dev/null +++ b/modules/message/lang/ko.lang.php @@ -0,0 +1,10 @@ + + * @brief 한국어 언어팩 (기본적인 내용만 수록) + **/ + + $lang->message = '오류 표시'; + $lang->about_skin = "메세지 출력시 스킨을 지정하실 수 있습니다."; +?> diff --git a/modules/message/lang/zh-CN.lang.php b/modules/message/lang/zh-CN.lang.php new file mode 100644 index 000000000..1d7e6f49c --- /dev/null +++ b/modules/message/lang/zh-CN.lang.php @@ -0,0 +1,10 @@ + + * @brief 简体中文语言包(只收录基本内容) + **/ + + $lang->message = '错误提示'; + $lang->about_skin = "提示信息时,可以指定皮肤。"; +?> \ No newline at end of file diff --git a/modules/message/message.admin.controller.php b/modules/message/message.admin.controller.php new file mode 100644 index 000000000..82a575927 --- /dev/null +++ b/modules/message/message.admin.controller.php @@ -0,0 +1,29 @@ +skin = Context::get('skin'); + + // module Controller 객체 생성하여 입력 + $oModuleController = &getController('module'); + $output = $oModuleController->insertModuleConfig('message',$args); + return $output; + } + } +?> diff --git a/modules/message/message.admin.view.php b/modules/message/message.admin.view.php new file mode 100644 index 000000000..e4727908d --- /dev/null +++ b/modules/message/message.admin.view.php @@ -0,0 +1,31 @@ +getskins($this->module_path); + Context::set('skin_list', $skin_list); + + // 템플릿 파일 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('config'); + } + + } +?> diff --git a/modules/message/message.class.php b/modules/message/message.class.php new file mode 100644 index 000000000..07be57488 --- /dev/null +++ b/modules/message/message.class.php @@ -0,0 +1,37 @@ +insertActionForward('message', 'view', 'dispMessage'); + $oModuleController->insertActionForward('message', 'view', 'dispMessageAdminConfig'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + + } +?> diff --git a/modules/message/message.view.php b/modules/message/message.view.php new file mode 100644 index 000000000..1d7adf2ff --- /dev/null +++ b/modules/message/message.view.php @@ -0,0 +1,35 @@ +getModuleConfig('rss'); + if(!$config->skin) $config->skin = 'default'; + + // 템플릿 경로를 지정 + $template_path = sprintf('%sskins/%s', $this->module_path, $config->skin); + + Context::set('system_message', $this->getMessage()); + + $this->setTemplatePath($template_path); + $this->setTemplateFile('system_message'); + } + + } +?> diff --git a/modules/message/skins/default/css/message.css b/modules/message/skins/default/css/message.css new file mode 100644 index 000000000..c6e533347 --- /dev/null +++ b/modules/message/skins/default/css/message.css @@ -0,0 +1,16 @@ +@charset "utf-8"; + + +.system_message { + color:#666666; + text-align:center; + padding:1em 0 1em 0; +} + +.system_button { + margin-top:1em; +} + +.system_message a { + margin-top:1em; +} diff --git a/modules/message/skins/default/system_message.html b/modules/message/skins/default/system_message.html new file mode 100644 index 000000000..3087d490a --- /dev/null +++ b/modules/message/skins/default/system_message.html @@ -0,0 +1,12 @@ + +
    + {$system_message} + + +
    + diff --git a/modules/message/tpl/config.html b/modules/message/tpl/config.html new file mode 100644 index 000000000..3249c03dc --- /dev/null +++ b/modules/message/tpl/config.html @@ -0,0 +1,24 @@ + + +

    {$lang->message} {$lang->cmd_management}

    + +
    + + + + + +
    {$lang->skin} + +

    {$lang->about_skin}

    +
    + + +
    + +
    +
    diff --git a/modules/message/tpl/filter/insert_config.xml b/modules/message/tpl/filter/insert_config.xml new file mode 100644 index 000000000..d8c78261a --- /dev/null +++ b/modules/message/tpl/filter/insert_config.xml @@ -0,0 +1,7 @@ + +
    + + + + + diff --git a/modules/module/conf/info.xml b/modules/module/conf/info.xml new file mode 100644 index 000000000..72e555359 --- /dev/null +++ b/modules/module/conf/info.xml @@ -0,0 +1,17 @@ + + + 모듈 + 模块 + モジュール + Module + + 제로 + zero + Zero + zero + 모듈 생성 및 관리하는 모듈입니다. + 生成及管理模块的模块。 + モジュールの生成、管理するモジュールです。 + This module is for creating/managering the other modules. + + diff --git a/modules/module/conf/module.xml b/modules/module/conf/module.xml new file mode 100644 index 000000000..090efec80 --- /dev/null +++ b/modules/module/conf/module.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/modules/module/lang/en.lang.php b/modules/module/lang/en.lang.php new file mode 100644 index 000000000..ed5ba0935 --- /dev/null +++ b/modules/module/lang/en.lang.php @@ -0,0 +1,67 @@ +module_list = "Module List"; + $lang->module_index = "Module List"; + $lang->module_category = "Module Category"; + $lang->module_info = "Info"; + $lang->add_shortcut = "Add Shortcuts"; + $lang->module_action = "Actions"; + $lang->module_maker = "Module Developer"; + $lang->module_history = "Update history"; + $lang->category_title = "Category Title"; + $lang->header_text = 'Header Text'; + $lang->footer_text = 'Footer Text'; + $lang->use_category = 'Enable Category'; + $lang->category_title = 'Category Title'; + $lang->checked_count = 'Number of checked article'; + $lang->skin_default_info = 'Default Skin Info'; + $lang->skin_maker = 'Skin Developer'; + $lang->skin_maker_homepage = "Skin Developer's Homepage"; + $lang->open_rss = 'Open RSS'; + $lang->open_rss_types = array( + 'Y' => 'Open all', + 'H' => 'Open summary', + 'N' => 'Not open', + ); + + $lang->cmd_add_shortcut = "Add Shortcut"; + $lang->cmd_install = "Install"; + $lang->cmd_update = "Update"; + $lang->cmd_manage_category = 'Manage Categories'; + $lang->cmd_manage_grant = 'Manage Permission'; + $lang->cmd_manage_skin = 'Manage Skins'; + $lang->cmd_manage_document = 'Manage Articles'; + + $lang->msg_new_module = "Create new module"; + $lang->msg_update_module = "Modify module"; + $lang->msg_module_name_exists = "The name already exists. Please try other name."; + $lang->msg_category_is_null = 'No registered category exists.'; + $lang->msg_grant_is_null = 'No list exists for grant.'; + $lang->msg_no_checked_document = 'No checked articles exist.'; + $lang->msg_move_failed = 'Failed to move'; + $lang->msg_cannot_delete_for_child = 'Cannot delete a category having child categories.'; + + $lang->about_browser_title = "It will be shown in the browser title. It will be also used in a RSS/Trackback."; + $lang->about_mid = "The module name will be used like http://address/?mid=ModuleName.\n(only english alphabet,numbers, and underscore(_) are allowed)"; + $lang->about_default = "If checked, the default will be shown when access to the site without no mid value(mid=NoValue)."; + $lang->about_module_category = "It enables you to manage it through module category.\n The URL for the module manager is Manage module > Module category ."; + $lang->about_description= 'It is the description only for a manager.'; + $lang->about_default = 'If cheched, the default will be shown when access to the site without no mid value(mid=NoValue).'; + $lang->about_header_text = 'The contents will be shown on the top of the module.(html tags available)'; + $lang->about_footer_text = 'The contents will be shown on the bottom of the module.(html tags available)'; + $lang->about_skin = 'You may choose a module skin.'; + $lang->about_use_category = 'If checked, category function will be enabled.'; + $lang->about_list_count = 'You can set the number of limit to show article in a page.(default is 1)'; + $lang->about_page_count = 'You can set the number of page link to move pages in a bottom of page.(default is 10)'; + $lang->about_admin_id = 'You can grant a manager to have all permissions to the module.\n You can enter multiple IDs using
    ,(comma) \n(but the module manager cannot access the site admin page.)'; + $lang->about_grant = 'If you disable all objects having specific permissions, all members even not logined may have permission.'; + $lang->about_open_rss = 'You can select RSS on the current module to be open to the public.\nNo matter the view permission of article , RSS will be open to the public by its option.'; + $lang->about_module = "All of Zeroboard XE except the basic library consist of module.\n [Manage module] module will show all installed modules and help you to manage them.\nThrough [Add shortcut] feature, you can manage frequently used modules easily."; + + $lang->about_extra_vars_default_value = 'If multiple default values are needed, you can link them with comma(,).'; +?> diff --git a/modules/module/lang/jp.lang.php b/modules/module/lang/jp.lang.php new file mode 100644 index 000000000..9d7d4aebc --- /dev/null +++ b/modules/module/lang/jp.lang.php @@ -0,0 +1,67 @@ +module_list = "モジュールリスト"; + $lang->module_index = "モジュールインデックス"; + $lang->module_category = "モジュールカテゴリ"; + $lang->module_info = "モジュール情報"; + $lang->add_shortcut = "管理者メニューに追加する"; + $lang->module_action = "動作"; + $lang->module_maker = "モジュール作者"; + $lang->module_history = "変更内容 "; + $lang->category_title = "カテゴリ名"; + $lang->header_text = 'ヘッダー内容'; + $lang->footer_text = 'フッター内容'; + $lang->use_category = 'カテゴリ使用'; + $lang->category_title = 'カテゴリ名'; + $lang->checked_count = '選択された書き込み数'; + $lang->skin_default_info = 'スキン基本情報'; + $lang->skin_maker = 'スキン作者'; + $lang->skin_maker_homepage = '作者ホームページ'; + $lang->open_rss = 'RSS配信'; + $lang->open_rss_types = array( + 'Y' => '全文配信 ', + 'H' => '要約配信', + 'N' => '配信しない', + ); + + $lang->cmd_add_shortcut = "ショットカット追加"; + $lang->cmd_install = "インストール"; + $lang->cmd_update = "アップデート"; + $lang->cmd_manage_category = 'カテゴリ管理'; + $lang->cmd_manage_grant = '権限管理'; + $lang->cmd_manage_skin = 'スキン管理'; + $lang->cmd_manage_document = '書き込み管理'; + + $lang->msg_new_module = "モジュール作成"; + $lang->msg_update_module = "モジュール修正"; + $lang->msg_module_name_exists = "既に存在するモジュール名です。他の名前を入力してください。"; + $lang->msg_category_is_null = '登録されているカテゴリがありません。'; + $lang->msg_grant_is_null = '登録された権限がありません。'; + $lang->msg_no_checked_document = '選択された書き込みがありません。'; + $lang->msg_move_failed = '移動することができませんでした。'; + $lang->msg_cannot_delete_for_child = '下位カテゴリのカテゴリは削除することができません。'; + + $lang->about_browser_title = "ブラウザのタイトルバーに表示される内容です。RSS/Trackbackでも使用します。"; + $lang->about_mid = "モジュール名は、http://アドレス/?mid=モジュール名、のように直接呼び出せる値です(英数+_のみ可)。"; + $lang->about_default = "チェックすると、サイトに「 mid値」なしで接続した場合、デフォルトで表示します。"; + $lang->about_module_category = "カテゴリで管理できるようにします。モジュールのカテゴリの管理は、モジュール管理 > モジュールカテゴリ で行うことができます。"; + $lang->about_description= '管理用に用いられる説明です。'; + $lang->about_default = 'チェックすると、サイトに「mid値」なしで接続した場合、デフォルトで表示します。'; + $lang->about_header_text = 'モジュールのヘッダーに表示される内容です(HTMLタグが使用できる)。'; + $lang->about_footer_text = 'モジュールのフッターに表示される内容です。(HTMLタグが使用できる)。'; + $lang->about_skin = 'モジュールのスキンを選択することができます。'; + $lang->about_use_category = 'チェックするとカテゴリ機能が使用できます。'; + $lang->about_list_count = '1ページ当たりに表示される書き込みの数が指定できます(デフォルト1個)。'; + $lang->about_page_count = 'リストの下段に移動できるページのリンク数が指定できます(デフォルト10個)。'; + $lang->about_admin_id = '該当するモジュールに対して最高権限を持つ管理者を指定することができます。「,(コンマ)」で区切って多数のIDが指定できます(管理者ページへのアクセスはできません)。'; + $lang->about_grant = '特定権限の対象をすべて解除するとログインしていない会員ユーザまで権限が与えられます。'; + $lang->about_open_rss = '現在のモジュールに対して「RSS配信」を選択することができます。書き込みの内容が読める権限とは関係なくオプションによってRSSが配信されます。'; + $lang->about_module = "ゼロボードXEは、基本ライブラリの他は、すべてモジュールで構成されています。モジュール管理用のモジュールはインストールされたすべてを表示し、管理できるようにします。頻繁に使うモジュールは、【ショットカット追加】で行うと管理しやすなります。"; + + $lang->about_extra_vars_default_value = '多重・単一選択などのデフォルト値が、複数必要な場合は、「, (コンマ)」でリンクを張ることができます。'; +?> diff --git a/modules/module/lang/ko.lang.php b/modules/module/lang/ko.lang.php new file mode 100644 index 000000000..f00e69a6e --- /dev/null +++ b/modules/module/lang/ko.lang.php @@ -0,0 +1,67 @@ +module_list = "모듈 목록"; + $lang->module_index = "모듈 목록"; + $lang->module_category = "모듈 분류"; + $lang->module_info = "모듈 정보"; + $lang->add_shortcut = "관리자 메뉴에 추가"; + $lang->module_action = "동작"; + $lang->module_maker = "모듈 제작자"; + $lang->module_history = "변경 사항 "; + $lang->category_title = "분류 이름"; + $lang->header_text = '상단 내용'; + $lang->footer_text = '하단 내용'; + $lang->use_category = '분류 사용'; + $lang->category_title = '분류명'; + $lang->checked_count = '선택된 글 수'; + $lang->skin_default_info = '스킨 기본정보'; + $lang->skin_maker = '스킨제작자'; + $lang->skin_maker_homepage = '제작자 홈페이지'; + $lang->open_rss = 'RSS 공개'; + $lang->open_rss_types = array( + 'Y' => '전문 공개 ', + 'H' => '요약 공개', + 'N' => '공개하지 않음', + ); + + $lang->cmd_add_shortcut = "바로가기 추가"; + $lang->cmd_install = "설치"; + $lang->cmd_update = "업데이트"; + $lang->cmd_manage_category = '분류관리'; + $lang->cmd_manage_grant = '권한관리'; + $lang->cmd_manage_skin = '스킨관리'; + $lang->cmd_manage_document = '게시글 관리'; + + $lang->msg_new_module = "모듈 생성"; + $lang->msg_update_module = "모듈 수정"; + $lang->msg_module_name_exists = "이미 존재하는 모듈이름입니다. 다른 이름을 입력해주세요."; + $lang->msg_category_is_null = '등록된 분류가 없습니다'; + $lang->msg_grant_is_null = '등록된 권한 대상이 없습니다'; + $lang->msg_no_checked_document = '선택된 게시물이 없습니다'; + $lang->msg_move_failed = '이동 실패하였습니다'; + $lang->msg_cannot_delete_for_child = '하부 분류가 있는 분류는 삭제하실 수 없습니다'; + + $lang->about_browser_title = "브라우저의 제목에 나타나는 값입니다. RSS/Trackback에서도 사용됩니다."; + $lang->about_mid = "모듈이름은 http://주소/?mid=모듈이름 처럼 직접 호출할 수 있는 값입니다. (영문+숫자+_ 만 가능)"; + $lang->about_default = "선택하시면 사이트에 mid값 없이 접속하였을 경우 기본으로 보여줍니다"; + $lang->about_module_category = "분류를 통한 관리를 할 수 있도록 합니다. 모듈 분류의 관리는 모듈관리 > 모듈분류 에서 하실 수 있습니다."; + $lang->about_description= '관리용으로 사용되는 설명입니다'; + $lang->about_default = '선택하시면 사이트에 mid값 없이 접속하였을 경우 기본으로 보여줍니다'; + $lang->about_header_text = '모듈의 상단에 표시되는 내용입니다 (html 태그 사용 가능)'; + $lang->about_footer_text = '모듈의 하단에 표시되는 내용입니다 (html 태그 사용 가능)'; + $lang->about_skin = '모듈의 스킨을 선택하실 수 있습니다'; + $lang->about_use_category = '선택하시면 분류기능을 사용할 수 있습니다'; + $lang->about_list_count = '한페이지에 표시될 글의 수를 지정하실 수 있습니다. (기본 1개)'; + $lang->about_page_count = '목록 하단 페이지 이동 하는 링크의 수를 지정하실 수 있습니다. (기본 10개)'; + $lang->about_admin_id = '해당 모듈에 대해 최고 권한을 가지는 관리자를 지정할 수 있습니다.
    ,(콤마)로 다수 아이디 지정이 가능합니다. (관리자페이지 접근은 불가능)'; + $lang->about_grant = '특정 권한의 대상을 모두 해제하시면 로그인하지 않은 회원까지 권한을 가질 수 있습니다'; + $lang->about_open_rss = '현재 모듈에 대한 RSS 공개를 선택하실 수 있습니다. 글 보는 권한과 상관없이 옵션에 따라 RSS가 공개됩니다'; + $lang->about_module = "제로보드XE는 기본 라이브러리를 제외한 나머지는 모두 모듈로 구성되어 있습니다.\n모듈관리 모듈은 설치된 모든 모듈을 보여주고 관리를 도와줍니다.\n자주 쓰는 모듈은 [바로가기 추가]를 통해서 편하게 관리하실 수 있습니다."; + + $lang->about_extra_vars_default_value = '다중/단일 선택등 기본값이 여러개가 필요한 경우 , (콤마)로 연결하시면 됩니다'; +?> diff --git a/modules/module/lang/zh-CN.lang.php b/modules/module/lang/zh-CN.lang.php new file mode 100644 index 000000000..40f1379c0 --- /dev/null +++ b/modules/module/lang/zh-CN.lang.php @@ -0,0 +1,67 @@ +module_list = "模块目录"; + $lang->module_index = "模块目录"; + $lang->module_category = "模块分类"; + $lang->module_info = "模块信息"; + $lang->add_shortcut = "添加到快捷菜单"; + $lang->module_action = "动作"; + $lang->module_maker = "模块作者"; + $lang->module_history = "更新事项 "; + $lang->category_title = "分类名称"; + $lang->header_text = '上端内容'; + $lang->footer_text = '下端内容'; + $lang->use_category = '使用分类'; + $lang->category_title = '分类名'; + $lang->checked_count = '被选择的主题数'; + $lang->skin_default_info = '皮肤默认信息'; + $lang->skin_maker = '皮肤作者'; + $lang->skin_maker_homepage = '作者主页'; + $lang->open_rss = '公开RSS'; + $lang->open_rss_types = array( + 'Y' => '公开全文', + 'H' => '公开摘要', + 'N' => '不公开', + ); + + $lang->cmd_add_shortcut = "添加到快捷菜单"; + $lang->cmd_install = "安装"; + $lang->cmd_update = "升级"; + $lang->cmd_manage_category = '分类管理'; + $lang->cmd_manage_grant = '权限管理'; + $lang->cmd_manage_skin = '皮肤管理'; + $lang->cmd_manage_document = '主题管理'; + + $lang->msg_new_module = "模块生成"; + $lang->msg_update_module = "模块修改"; + $lang->msg_module_name_exists = "已存在的模块名称。请输入其他名称。"; + $lang->msg_category_is_null = '没有登录的分类'; + $lang->msg_grant_is_null = '没有登录的权限对象'; + $lang->msg_no_checked_document = '没有被选择的主题'; + $lang->msg_move_failed = '移动失败!'; + $lang->msg_cannot_delete_for_child = '不能删除有下级分类的分类!'; + + $lang->about_browser_title = "显示在浏览器窗口的标题值。 在RSS/Trackback也可以使用。"; + $lang->about_mid = "模块名称只允许使用英文,数字和下划线。"; + $lang->about_default = "用没有mid值的网址访问网站时,将会显示默认。"; + $lang->about_module_category = "可以分类管理模块。 模块分类可以在 模块管理 > 模块分类 中进行管理。"; + $lang->about_description= '管理用使用说明。'; + $lang->about_default = '用没有mid值的网址访问网站时,将会显示默认。'; + $lang->about_header_text = '显示在模块顶部的内容。(可以使用HTML)'; + $lang->about_footer_text = '显示在模块底部的内容。(可以使用HTML)'; + $lang->about_skin = '可以选择模块皮肤。'; + $lang->about_use_category = '选择此项可以使用分类功能。'; + $lang->about_list_count = '可以指定每页显示的主题数。(默认为1个)'; + $lang->about_page_count = '可以指定显示在目录下方的页面数。 (默认为10个)'; + $lang->about_admin_id = '可以对该模块指定最高管理权限。
    有多名管理员时,可以用,(逗号)来分隔。 (不能访问管理页面)'; + $lang->about_grant = '全部解除特定权限的对象时,没有登录的会员也将具有相关权限。'; + $lang->about_open_rss = '可以选择对该模块的RSS公开程度。RSS公开将不受查看内容权限的限制,随公开RSS的选项公开RSS。'; + $lang->about_module = "除基本library以外Zeroboard XE全部由模块组成。\n模块管理中列出所有已安装的模块,因此易于管理。\n常用模块可以通过『添加到快捷菜单』来方便管理。"; + + $lang->about_extra_vars_default_value = '复选/单选缺省值需要多个时,用,(逗号)来分隔。'; +?> diff --git a/modules/module/module.admin.controller.php b/modules/module/module.admin.controller.php new file mode 100644 index 000000000..5ab409b8e --- /dev/null +++ b/modules/module/module.admin.controller.php @@ -0,0 +1,66 @@ +title = Context::get('title'); + $output = executeQuery('module.insertModuleCategory', $args); + if(!$output->toBool()) return $output; + + $this->setMessage("success_registed"); + } + + /** + * @brief 카테고리의 내용 수정 + **/ + function procModuleAdminUpdateCategory() { + $mode = Context::get('mode'); + + switch($mode) { + case 'delete' : + $output = $this->doDeleteModuleCategory(); + $msg_code = 'success_deleted'; + break; + case 'update' : + $output = $this->doUpdateModuleCategory(); + $msg_code = 'success_updated'; + break; + } + if(!$output->toBool()) return $output; + + $this->setMessage($msg_code); + } + + /** + * @brief 모듈 카테고리의 제목 변경 + **/ + function doUpdateModuleCategory() { + $args->title = Context::get('title'); + $args->module_category_srl = Context::get('module_category_srl'); + return executeQuery('module.updateModuleCategory', $args); + } + + /** + * @brief 모듈 카테고리 삭제 + **/ + function doDeleteModuleCategory() { + $args->module_category_srl = Context::get('module_category_srl'); + return executeQuery('module.deleteModuleCategory', $args); + } + + } +?> diff --git a/modules/module/module.admin.view.php b/modules/module/module.admin.view.php new file mode 100644 index 000000000..255e82015 --- /dev/null +++ b/modules/module/module.admin.view.php @@ -0,0 +1,82 @@ +setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 모듈 관리자 페이지 + **/ + function dispModuleAdminContent() { + $this->dispModuleAdminList(); + } + + /** + * @brief 모듈 목록 출력 + **/ + function dispModuleAdminList() { + // 모듈 목록을 구해서 + $oModuleModel = &getModel('module'); + $module_list = $oModuleModel->getModuleList(); + Context::set('module_list', $module_list); + + // 템플릿 파일 지정 + $this->setTemplateFile('module_list'); + } + + /** + * @brief 모듈의 상세 정보(conf/info.xml)를 팝업 출력 + **/ + function dispModuleAdminInfo() { + // 모듈 목록을 구해서 + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoXml(Context::get('selected_module')); + Context::set('module_info', $module_info); + + // 레이아웃을 팝업으로 지정 + $this->setLayoutFile('popup_layout'); + + // 템플릿 파일 지정 + $this->setTemplateFile('module_info'); + } + + /** + * @brief 모듈 카테고리 목록 + **/ + function dispModuleAdminCategory() { + $module_category_srl = Context::get('module_category_srl'); + + // 모듈 목록을 구해서 + $oModuleModel = &getModel('module'); + + // 선택된 카테고리가 있으면 해당 카테고리의 정보 수정 페이지로 + if($module_category_srl) { + $selected_category = $oModuleModel->getModuleCategory($module_category_srl); + Context::set('selected_category', $selected_category); + + // 템플릿 파일 지정 + $this->setTemplateFile('category_update_form'); + + // 아니면 전체 목록 + } else { + $category_list = $oModuleModel->getModuleCategories(); + Context::set('category_list', $category_list); + + // 템플릿 파일 지정 + $this->setTemplateFile('category_list'); + } + } + + } +?> diff --git a/modules/module/module.class.php b/modules/module/module.class.php new file mode 100644 index 000000000..3db20dcf5 --- /dev/null +++ b/modules/module/module.class.php @@ -0,0 +1,42 @@ +insertActionForward('module', 'view', 'dispModuleAdminContent'); + $oModuleController->insertActionForward('module', 'view', 'dispModuleAdminList'); + $oModuleController->insertActionForward('module', 'view', 'dispModuleAdminCategory'); + $oModuleController->insertActionForward('module', 'view', 'dispModuleAdminInfo'); + + // module 모듈에서 사용할 디렉토리 생성 + FileHandler::makeDir('./files/cache/module_info'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + + } +?> diff --git a/modules/module/module.controller.php b/modules/module/module.controller.php new file mode 100644 index 000000000..2cfe30487 --- /dev/null +++ b/modules/module/module.controller.php @@ -0,0 +1,251 @@ +module = $module; + $args->config = serialize($config); + + // 일단 삭제 (캐쉬 파일도 지운다) + $output = executeQuery('module.deleteModuleConfig', $args); + if(!$output->toBool()) return $output; + + @unlink( sprintf('./files/cache/module_info/%s.config.php',$module) ); + + // 변수 정리후 query 실행 + $output = executeQuery('module.insertModuleConfig', $args); + return $output; + } + + /** + * @brief 모듈 입력 + **/ + function insertModule($args) { + // begin transaction + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 이미 존재하는 모듈 이름인지 체크 + $output = executeQuery('module.isExistsModuleName', $args); + if(!$output->toBool() || $output->data->count) { + $oDB->rollback(); + return new Object(-1, 'msg_module_name_exists'); + } + + // module model 객체 생성 + $oModuleModel = &getModel('module'); + + // 선택된 스킨정보에서 colorset을 구함 + $module_path = ModuleHandler::getModulePath($args->module); + $skin_info = $oModuleModel->loadSkinInfo($module_path, $args->skin); + $skin_vars->colorset = $skin_info->colorset[0]->name; + + // 변수 정리후 query 실행 + if(!$args->module_srl) $args->module_srl = getNextSequence(); + $args->skin_vars = serialize($skin_vars); + $output = executeQuery('module.insertModule', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // commit + $oDB->commit(); + + $output->add('module_srl',$args->module_srl); + return $output; + } + + /** + * @brief 모듈의 정보를 수정 + **/ + function updateModule($args) { + // begin transaction + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 이미 존재하는 모듈 이름인지 체크 + $output = executeQuery('module.isExistsModuleName', $args); + if(!$output->toBool() || $output->data->count) { + $oDB->rollback(); + return new Object(-1, 'msg_module_name_exists'); + } + + $output = executeQuery('module.updateModule', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + $output->add('module_srl',$args->module_srl); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + $oDB->commit(); + + return $output; + } + + /** + * @brief action forward 추가 + * action foward는 등록된 action이 요청된 모듈에 없을 경우 찾아서 포워딩을 하는 구조이다 + * 모듈의 설치시에 사용된다. + **/ + function insertActionForward($module, $type, $act) { + $args->module = $module; + $args->type = $type; + $args->act = $act; + + $output = executeQuery('module.insertActionFoward', $args); + return $output; + } + + /** + * @brief 모듈의 기타 정보를 변경 + **/ + function updateModuleSkinVars($module_srl, $skin_vars) { + // skin_vars 정보 세팅 + $args->module_srl = $module_srl; + $args->skin_vars = $skin_vars; + $output = executeQuery('module.updateModuleSkinVars', $args); + if(!$output->toBool()) return $output; + + return $output; + } + + /** + * @brief 모듈의 권한 정보 변경 + **/ + function updateModuleGrant($module_srl, $grants) { + $args->module_srl = $module_srl; + $args->grants = $grants; + $output = executeQuery('module.updateModuleGrant', $args); + if(!$output->toBool()) return $output; + + return $output; + } + + /** + * @brief 모듈을 삭제 + * + * 모듈 삭제시는 관련 정보들을 모두 삭제 시도한다. + **/ + function deleteModule($module_srl) { + + // begin transaction + $oDB = &DB::getInstance(); + $oDB->begin(); + + $args->module_srl = $module_srl; + + // addon 삭제 + + // widget 삭제 + + // document 삭제 + $oDocumentController = &getAdminController('document'); + $output = $oDocumentController->deleteModuleDocument($module_srl); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // category 삭제 + $output = $oDocumentController->deleteModuleCategory($module_srl); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // trackbacks 삭제 + $oTrackbackController = &getAdminController('trackback'); + $output = $oTrackbackController->deleteModuleTrackbacks($module_srl); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // comments 삭제 + $oCommentController = &getAdminController('comment'); + $output = $oCommentController->deleteModuleComments($module_srl); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // tags 삭제 + $oTagController = &getAdminController('tag'); + $output = $oTagController->deleteModuleTags($module_srl); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 첨부 파일 삭제 + $oFileController = &getAdminController('file'); + $output = $oFileController->deleteModuleFiles($module_srl); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // module 정보를 DB에서 삭제 + $output = executeQuery('module.deleteModule', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // commit + $oDB->commit(); + + return $output; + } + + /** + * @brief 모든 모듈의 is_default값을 N 으로 세팅 (기본 모듈 해제) + **/ + function clearDefaultModule() { + $output = executeQuery('module.clearDefaultModule'); + if(!$output->toBool()) return $output; + + return $output; + } + + /** + * @brief 지정된 menu_srl에 속한 mid 의 menu_srl 을 변경 + **/ + function updateModuleMenu($args) { + return executeQuery('module.updateModuleMenu', $args); + } + + /** + * @brief 지정된 menu_srl에 속한 mid 의 layout_srl을 변경 + **/ + function updateModuleLayout($layout_srl, $menu_srl_list) { + if(!count($menu_srl_list)) return; + + $args->layout_srl = $layout_srl; + $args->menu_srls = implode(',',$menu_srl_list); + return executeQuery('module.updateModuleLayout', $args); + } + } +?> diff --git a/modules/module/module.model.php b/modules/module/module.model.php new file mode 100644 index 000000000..1682ad92d --- /dev/null +++ b/modules/module/module.model.php @@ -0,0 +1,563 @@ +document_srl = $document_srl; + $output = executeQuery('module.getModuleInfoByDocument', $args); + + return $this->arrangeModuleInfo($output->data); + } + + /** + * @brief mid로 모듈의 정보를 구함 + **/ + function getModuleInfoByMid($mid='') { + // $mid값이 인자로 주어질 경우 $mid로 모듈의 정보를 구함 + if($mid) { + $args->mid = $mid; + $output = executeQuery('module.getMidInfo', $args); + } + + // 모듈의 정보가 없다면($mid가 잘못이거나 없었을 경우) 기본 모듈을 가져옴 + if(!$output->data) { + $output = executeQuery('module.getDefaultMidInfo'); + } + + $module_info = $this->arrangeModuleInfo($output->data); + + return $module_info; + } + + /** + * @brief module_srl에 해당하는 모듈의 정보를 구함 + **/ + function getModuleInfoByModuleSrl($module_srl) { + // 데이터를 가져옴 + $args->module_srl = $module_srl; + $output = executeQuery('module.getMidInfo', $args); + if(!$output->data) return; + + $module_info = $this->arrangeModuleInfo($output->data); + + return $module_info; + } + + /** + * @brief DB에서 가져온 원 모듈 정보에서 grant, extraVar등의 정리 + **/ + function arrangeModuleInfo($source_module_info) { + if(!$source_module_info || !is_object($source_module_info) ) return; + + // serialize되어 있는 변수들 추출 + $extra_vars = $source_module_info->extra_vars; + $skin_vars = $source_module_info->skin_vars; + $grants = $source_module_info->grants; + $admin_id = $source_module_info->admin_id; + + unset($source_module_info->extra_vars); + unset($source_module_info->skin_vars); + unset($source_module_info->grants); + unset($source_module_info->admin_id); + + $module_info = clone($source_module_info); + + // extra_vars의 정리 + if($extra_vars) { + $extra_vars = unserialize($extra_vars); + foreach($extra_vars as $key => $val) if(!$module_info->{$key}) $module_info->{$key} = $val; + } + + // skin_vars의 정리 + if($skin_vars) { + $skin_vars = unserialize($skin_vars); + foreach($skin_vars as $key => $val) if(!$module_info->{$key}) $module_info->{$key} = $val; + } + + // 권한의 정리 + if($grants) $module_info->grants = unserialize($grants); + + // 관리자 아이디의 정리 + if($admin_id) $module_info->admin_id = explode(',',$admin_id); + else $module_info->admin_id = array(); + + return $module_info; + } + + /** + * @brief act 값에 의한 forward 값을 구함 + **/ + function getActionForward($act) { + $args->act = $act; + $output = executeQuery('module.getActionForward',$args); + return $output->data; + } + + /** + * @brief DB에 생성된 mid목록을 구해옴 + **/ + function getMidList($args = null) { + $output = executeQuery('module.getMidList', $args); + if(!$output->toBool()) return $output; + + $list = $output->data; + if(!$list) return; + + if(!is_array($list)) $list = array($list); + + foreach($list as $val) { + $mid_list[$val->mid] = $val; + } + return $mid_list; + } + + /** + * @brief mid 목록에 대응하는 module_srl을 배열로 return + **/ + function getModuleSrlByMid($mid) { + if(is_array($mid)) $mid = "'".implode("','",$mid)."'"; + $args->mid = $mid; + $output = executeQuery('module.getModuleSrlByMid', $args); + if(!$output->toBool()) return $output; + + $list = $output->data; + if(!$list) return; + if(!is_array($list)) $list = array($list); + foreach($list as $key => $val) $module_srl_list[] = $val->module_srl; + return $module_srl_list; + } + + /** + * @brief 주어진 곳의 스킨 목록을 구함 + * 스킨과 skin.xml 파일을 분석 정리한 결과를 return + **/ + function getSkins($path) { + $skin_path = sprintf("%s/skins/", $path); + $list = FileHandler::readDir($skin_path); + if(!count($list)) return; + + foreach($list as $skin_name) { + unset($skin_info); + $skin_info = $this->loadSkinInfo($path, $skin_name); + if(!$skin_info) $skin_info->title = $skin_name; + + $skin_list[$skin_name] = $skin_info; + } + + return $skin_list; + } + + + /** + * @brief 특정 위치의 특정 스킨의 정보를 구해옴 + **/ + function loadSkinInfo($path, $skin) { + + // 모듈의 스킨의 정보 xml 파일을 읽음 + $skin_xml_file = sprintf("%sskins/%s/skin.xml", $path, $skin); + if(!file_exists($skin_xml_file)) return; + + // XmlParser 객체 생성 + $oXmlParser = new XmlParser(); + $_xml_obj = $oXmlParser->loadXmlFile($skin_xml_file); + + // 스킨 정보가 없으면 return + if(!$_xml_obj->skin) return; + $xml_obj = $_xml_obj->skin; + + // 스킨이름 + $skin_info->title = $xml_obj->title->body; + + // 작성자 정보 + $skin_info->maker->name = $xml_obj->maker->name->body; + $skin_info->maker->email_address = $xml_obj->maker->attrs->email_address; + $skin_info->maker->homepage = $xml_obj->maker->attrs->link; + $skin_info->maker->date = $xml_obj->maker->attrs->date; + $skin_info->maker->description = $xml_obj->maker->description->body; + + // colorset + $colorset = $xml_obj->colorset->color; + if($colorset) { + if(!is_array($colorset)) $colorset = array($colorset); + + foreach($colorset as $color) { + $name = $color->attrs->name; + $title = $color->title->body; + $screenshot = $color->attrs->src; + if($screenshot) { + $screenshot = sprintf("%sskins/%s/%s", $path, $skin, $screenshot); + if(!file_exists($screenshot)) $screenshot = ""; + } else $screenshot = ""; + + unset($obj); + $obj->name = $name; + $obj->title = $title; + $obj->screenshot = $screenshot; + $skin_info->colorset[] = $obj; + } + } + + // 스킨에서 사용되는 변수들 + $extra_vars = $xml_obj->extra_vars->var; + if($extra_vars) { + + if(!is_array($extra_vars)) $extra_vars = array($extra_vars); + + foreach($extra_vars as $var) { + $name = $var->attrs->name; + $type = $var->attrs->type; + $title = $var->title->body; + $description = $var->description->body; + if($var->default) { + unset($default); + if(is_array($var->default)) { + for($i=0;$idefault);$i++) $default[] = $var->default[$i]->body; + } else { + $default = $var->default->body; + } + } + + $width = $var->attrs->width; + $height = $var->attrs->height; + + unset($obj); + $obj->title = $title; + $obj->description = $description; + $obj->name = $name; + $obj->type = $type; + $obj->default = $default; + $obj->width = $width; + $obj->height = $height; + + $skin_info->extra_vars[] = $obj; + } + } + + // 메뉴 종류 (레이아웃을 위한 설정) + if($xml_obj->menus->menu) { + $menus = $xml_obj->menus->menu; + if(!is_array($menus)) $menus = array($menus); + + $menu_count = count($menus); + $skin_info->menu_count = $menu_count; + for($i=0;$i<$menu_count;$i++) { + unset($obj); + + $obj->name = $menus[$i]->attrs->name; + if($menus[$i]->attrs->default == "true") $obj->default = true; + $obj->title = $menus[$i]->title->body; + $obj->maxdepth = $menus[$i]->maxdepth->body; + + $skin_info->menu->{$obj->name} = $obj; + } + } + + return $skin_info; + } + + /** + * @brief module의 conf/module.xml 을 통해 grant(권한) 및 action 데이터를 return + * + * module.xml 파일의 경우 파싱하는데 시간이 걸리기에 캐싱을 한다... + * 캐싱을 할때 바로 include 할 수 있도록 역시 코드까지 추가하여 캐싱을 한다. + * 이게 퍼포먼스 상으로는 좋은데 어떤 부정적인 결과를 유도할지는 잘 모르겠... + **/ + function getModuleActionXml($module) { + // 요청된 모듈의 경로를 구한다. 없으면 return + $class_path = ModuleHandler::getModulePath($module); + if(!$class_path) return; + + // 해당 경로에 module.xml 파일이 있는지 체크한다. 없으면 return + $xml_file = sprintf("%sconf/module.xml", $class_path); + if(!file_exists($xml_file)) return; + + // 캐시된 파일이 있는지 확인 + $cache_file = sprintf("./files/cache/module_info/%s.%s.php", $module, Context::getLangType()); + + // 캐시 파일이 없거나 캐시 파일이 xml 파일보다 오래되었으면 내용 다시 갱신 + if(!file_exists($cache_file) || filectime($cache_file)module)) return; ///< xml 내용중에 module 태그가 없다면 오류;; + + $grants = $xml_obj->module->grants->grant; ///< 권한 정보 (없는 경우도 있음) + $actions = $xml_obj->module->actions->action; ///< action list (필수) + + $default_index = $admin_index = ''; + + // 권한 정보의 정리 + if($grants) { + if(is_array($grants)) $grant_list = $grants; + else $grant_list[] = $grants; + + foreach($grant_list as $grant) { + $name = $grant->attrs->name; + $default = $grant->attrs->default?$grant->attrs->default:'guest'; + $title = $grant->title->body; + + $info->grant->{$name}->title = $title; + $info->grant->{$name}->default = $default; + + $buff .= sprintf('$info->grant->%s->title=\'%s\';', $name, $title); + $buff .= sprintf('$info->grant->%s->default=\'%s\';', $name, $default); + } + } + + // actions 정리 + if($actions) { + if(is_array($actions)) $action_list = $actions; + else $action_list[] = $actions; + + foreach($action_list as $action) { + $name = $action->attrs->name; + + $type = $action->attrs->type; + $grant = $action->attrs->grant?$action->attrs->grant:'guest'; + $standalone = $action->attrs->standalone=='true'?'true':'false'; + + $index = $action->attrs->index; + $admin_index = $action->attrs->admin_index; + + $output->action->{$name}->type = $type; + $output->action->{$name}->grant = $grant; + $output->action->{$name}->standalone= $standalone; + + $info->action->{$name}->type = $type; + $info->action->{$name}->grant = $grant; + $info->action->{$name}->standalone = $standalone=='true'?true:false; + + $buff .= sprintf('$info->action->%s->type=\'%s\';', $name, $type); + $buff .= sprintf('$info->action->%s->grant=\'%s\';', $name, $grant); + $buff .= sprintf('$info->action->%s->standalone=%s;', $name, $standalone); + + if($index=='true') { + $default_index_act = $name; + $info->default_index_act = $name; + } + if($admin_index=='true') { + $admin_index_act = $name; + $info->admin_index_act = $name; + } + } + } + $buff = sprintf('default_index_act = \'%s\';$info->admin_index_act = \'%s\';%s?>', $default_index_act, $admin_index_act, $buff); + + FileHandler::writeFile($cache_file, $buff); + + return $info; + } + + @include($cache_file); + + return $info; + } + + /** + * @brief 특정 모듈의 설정 정보 return + * 캐시된 설정 정보가 없으면 만들 후 캐시하고 return + **/ + function getModuleConfig($module) { + if(!$GLOBALS['__ModuleConfig__'][$module]) { + $cache_file = sprintf('./files/cache/module_info/%s.config.php',$module); + + if(!file_exists($cache_file)) { + $args->module = $module; + $output = executeQuery('module.getModuleConfig', $args); + + $config = base64_encode($output->data->config); + + $buff = sprintf('', $config); + + FileHandler::writeFile($cache_file, $buff); + } + + if(!$config && file_exists($cache_file)) @include($cache_file); + + $GLOBALS['__ModuleConfig__'][$module] = unserialize(base64_decode($config)); + } + return $GLOBALS['__ModuleConfig__'][$module]; + } + + + /** + * @brief 모듈의 conf/info.xml 을 읽어서 정보를 구함 + **/ + function getModuleInfoXml($module) { + // 요청된 모듈의 경로를 구한다. 없으면 return + $module_path = ModuleHandler::getModulePath($module); + if(!$module_path) return; + + // 현재 선택된 모듈의 스킨의 정보 xml 파일을 읽음 + $xml_file = sprintf("%s/conf/info.xml", $module_path); + if(!file_exists($xml_file)) return; + + $oXmlParser = new XmlParser(); + $tmp_xml_obj = $oXmlParser->loadXmlFile($xml_file); + $xml_obj = $tmp_xml_obj->module; + + if(!$xml_obj) return; + + $info->title = $xml_obj->title->body; + + // 작성자 정보 + $module_info->title = $xml_obj->title->body; + $module_info->version = $xml_obj->attrs->version; + $module_info->author->name = $xml_obj->author->name->body; + $module_info->author->email_address = $xml_obj->author->attrs->email_address; + $module_info->author->homepage = $xml_obj->author->attrs->link; + $module_info->author->date = $xml_obj->author->attrs->date; + $module_info->author->description = $xml_obj->author->description->body; + + // history + if(!is_array($xml_obj->history->author)) $history[] = $xml_obj->history->author; + else $history = $xml_obj->history->author; + + foreach($history as $item) { + unset($obj); + $obj->name = $item->name->body; + $obj->email_address = $item->attrs->email_address; + $obj->homepage = $item->attrs->link; + $obj->date = $item->attrs->date; + $obj->description = $item->description->body; + $module_info->history[] = $obj; + } + + // action 정보를 얻어서 admin_index를 추가 + $action_info = $this->getModuleActionXml($module); + $module_info->admin_index_act = $action_info->admin_index_act; + + return $module_info; + } + + /** + * @brief 모듈 카테고리의 목록을 구함 + **/ + function getModuleCategories() { + // 데이터를 DB에서 가져옴 + $output = executeQuery('module.getModuleCategories'); + if(!$output->toBool()) return $output; + $list = $output->data; + if(!$list) return; + if(!is_array($list)) $list = array($list); + + foreach($list as $val) { + $category_list[$val->module_category_srl] = $val; + } + return $category_list; + } + + /** + * @brief 특정 모듈 카테고리의 내용을 구함 + **/ + function getModuleCategory($module_category_srl) { + // 데이터를 DB에서 가져옴 + $args->module_category_srl = $module_category_srl; + $output = executeQuery('module.getModuleCategory', $args); + if(!$output->toBool()) return $output; + return $output->data; + } + + /** + * @brief 모듈의 xml 정보만 구함 + **/ + function getModulesXmlInfo() { + // 다운받은 모듈과 설치된 모듈의 목록을 구함 + $searched_list = FileHandler::readDir('./modules'); + $searched_count = count($searched_list); + if(!$searched_count) return; + + for($i=0;$i<$searched_count;$i++) { + // 모듈의 이름 + $module_name = $searched_list[$i]; + + $path = ModuleHandler::getModulePath($module_name); + + // 해당 모듈의 정보를 구함 + $info = $this->getModuleInfoXml($module_name); + unset($obj); + + $info->module = $module_name; + $info->created_table_count = $created_table_count; + $info->table_count = $table_count; + $info->path = $path; + $info->admin_index_act = $info->admin_index_act; + $list[] = $info; + } + return $list; + } + + /** + * @brief 모듈의 종류와 정보를 구함 + **/ + function getModuleList() { + // DB 객체 생성 + $oDB = &DB::getInstance(); + + // 다운받은 모듈과 설치된 모듈의 목록을 구함 + $searched_list = FileHandler::readDir('./modules'); + $searched_count = count($searched_list); + if(!$searched_count) return; + + for($i=0;$i<$searched_count;$i++) { + // 모듈의 이름 + $module_name = $searched_list[$i]; + + $path = ModuleHandler::getModulePath($module_name); + + // schemas내의 테이블 생성 xml파일수를 구함 + $tmp_files = FileHandler::readDir($path."schemas"); + $table_count = count($tmp_files); + + // 테이블이 설치되어 있는지 체크 + $created_table_count = 0; + for($j=0;$jisTableExists($table_name)) $created_table_count ++; + } + + // 해당 모듈의 정보를 구함 + $info = $this->getModuleInfoXml($module_name); + unset($obj); + + $info->module = $module_name; + $info->created_table_count = $created_table_count; + $info->table_count = $table_count; + $info->path = $path; + $info->admin_index_act = $info->admin_index_act; + + // 설치 유무 체크 (설치는 DB의 설치만 관리) + if($table_count > $created_table_count) $info->need_install = treu; + else $info->need_install = false; + + // 각 모듈의 module.class.php로 upgrade 유무 체크 + $oDummy = null; + $oDummy = &getModule($module_name, 'class'); + if($oDummy) $info->need_update = $oDummy->checkUpdate(); + + $list[] = $info; + } + return $list; + } + + } +?> diff --git a/modules/module/module.view.php b/modules/module/module.view.php new file mode 100644 index 000000000..049eab8c2 --- /dev/null +++ b/modules/module/module.view.php @@ -0,0 +1,41 @@ +setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 스킨 정보 출력 + **/ + function dispModuleSkinInfo() { + $selected_module = Context::get('selected_module'); + $skin = Context::get('skin'); + + // 모듈/스킨 정보를 구함 + $module_path = sprintf("./modules/%s/", $selected_module); + if(!is_dir($module_path)) $this->stop("msg_invalid_request"); + + $skin_info_xml = sprintf("%sskins/%s/skin.xml", $module_path, $skin); + if(!file_exists($skin_info_xml)) $this->stop("msg_invalid_request"); + + $oModuleModel = &getModel('module'); + $skin_info = $oModuleModel->loadSkinInfo($module_path, $skin); + Context::set('skin_info',$skin_info); + + $this->setLayoutFile("popup_layout"); + $this->setTemplateFile("skin_info"); + } + + } +?> diff --git a/modules/module/queries/clearDefaultModule.xml b/modules/module/queries/clearDefaultModule.xml new file mode 100644 index 000000000..d5bf324fb --- /dev/null +++ b/modules/module/queries/clearDefaultModule.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/module/queries/deleteModule.xml b/modules/module/queries/deleteModule.xml new file mode 100644 index 000000000..ae605bb5b --- /dev/null +++ b/modules/module/queries/deleteModule.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/module/queries/deleteModuleCategory.xml b/modules/module/queries/deleteModuleCategory.xml new file mode 100644 index 000000000..c732504fa --- /dev/null +++ b/modules/module/queries/deleteModuleCategory.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/module/queries/deleteModuleConfig.xml b/modules/module/queries/deleteModuleConfig.xml new file mode 100644 index 000000000..9c16e04b5 --- /dev/null +++ b/modules/module/queries/deleteModuleConfig.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/module/queries/getActionForward.xml b/modules/module/queries/getActionForward.xml new file mode 100644 index 000000000..bd7f2e2c1 --- /dev/null +++ b/modules/module/queries/getActionForward.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/module/queries/getDefaultMidInfo.xml b/modules/module/queries/getDefaultMidInfo.xml new file mode 100644 index 000000000..b3b3f4f83 --- /dev/null +++ b/modules/module/queries/getDefaultMidInfo.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/module/queries/getMidInfo.xml b/modules/module/queries/getMidInfo.xml new file mode 100644 index 000000000..c6626486d --- /dev/null +++ b/modules/module/queries/getMidInfo.xml @@ -0,0 +1,12 @@ + + +
    + + + + + + + + + diff --git a/modules/module/queries/getMidList.xml b/modules/module/queries/getMidList.xml new file mode 100644 index 000000000..164a84080 --- /dev/null +++ b/modules/module/queries/getMidList.xml @@ -0,0 +1,16 @@ + + +
    + + + + + + + + + + + + + diff --git a/modules/module/queries/getModuleCategories.xml b/modules/module/queries/getModuleCategories.xml new file mode 100644 index 000000000..be1b506ab --- /dev/null +++ b/modules/module/queries/getModuleCategories.xml @@ -0,0 +1,6 @@ + + +
    + + + diff --git a/modules/module/queries/getModuleCategory.xml b/modules/module/queries/getModuleCategory.xml new file mode 100644 index 000000000..4f022acc7 --- /dev/null +++ b/modules/module/queries/getModuleCategory.xml @@ -0,0 +1,9 @@ + + +
    + + + + + + diff --git a/modules/module/queries/getModuleConfig.xml b/modules/module/queries/getModuleConfig.xml new file mode 100644 index 000000000..f479357e1 --- /dev/null +++ b/modules/module/queries/getModuleConfig.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/module/queries/getModuleInfoByDocument.xml b/modules/module/queries/getModuleInfoByDocument.xml new file mode 100644 index 000000000..2a5a63719 --- /dev/null +++ b/modules/module/queries/getModuleInfoByDocument.xml @@ -0,0 +1,13 @@ + + +
    +
    + + + + + + + + + diff --git a/modules/module/queries/getModuleInfoByModuleSrl.xml b/modules/module/queries/getModuleInfoByModuleSrl.xml new file mode 100644 index 000000000..f00824f94 --- /dev/null +++ b/modules/module/queries/getModuleInfoByModuleSrl.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/module/queries/getModuleSrlByMid.xml b/modules/module/queries/getModuleSrlByMid.xml new file mode 100644 index 000000000..2e3224934 --- /dev/null +++ b/modules/module/queries/getModuleSrlByMid.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/module/queries/insertActionFoward.xml b/modules/module/queries/insertActionFoward.xml new file mode 100644 index 000000000..a9a37468a --- /dev/null +++ b/modules/module/queries/insertActionFoward.xml @@ -0,0 +1,10 @@ + + +
    + + + + + + + diff --git a/modules/module/queries/insertModule.xml b/modules/module/queries/insertModule.xml new file mode 100644 index 000000000..c813b5bb4 --- /dev/null +++ b/modules/module/queries/insertModule.xml @@ -0,0 +1,25 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/module/queries/insertModuleCategory.xml b/modules/module/queries/insertModuleCategory.xml new file mode 100644 index 000000000..a44282f72 --- /dev/null +++ b/modules/module/queries/insertModuleCategory.xml @@ -0,0 +1,10 @@ + + +
    + + + + + + + diff --git a/modules/module/queries/insertModuleConfig.xml b/modules/module/queries/insertModuleConfig.xml new file mode 100644 index 000000000..ef871bdf0 --- /dev/null +++ b/modules/module/queries/insertModuleConfig.xml @@ -0,0 +1,10 @@ + + +
    + + + + + + + diff --git a/modules/module/queries/isExistsModuleName.xml b/modules/module/queries/isExistsModuleName.xml new file mode 100644 index 000000000..3b11959d0 --- /dev/null +++ b/modules/module/queries/isExistsModuleName.xml @@ -0,0 +1,12 @@ + + +
    + + + + + + + + + diff --git a/modules/module/queries/updateModule.xml b/modules/module/queries/updateModule.xml new file mode 100644 index 000000000..1d3d8e4dc --- /dev/null +++ b/modules/module/queries/updateModule.xml @@ -0,0 +1,25 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/module/queries/updateModuleCategory.xml b/modules/module/queries/updateModuleCategory.xml new file mode 100644 index 000000000..39f19ad22 --- /dev/null +++ b/modules/module/queries/updateModuleCategory.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/module/queries/updateModuleGrant.xml b/modules/module/queries/updateModuleGrant.xml new file mode 100644 index 000000000..bc6a42b1c --- /dev/null +++ b/modules/module/queries/updateModuleGrant.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/module/queries/updateModuleLayout.xml b/modules/module/queries/updateModuleLayout.xml new file mode 100644 index 000000000..152ba681f --- /dev/null +++ b/modules/module/queries/updateModuleLayout.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/module/queries/updateModuleMenu.xml b/modules/module/queries/updateModuleMenu.xml new file mode 100644 index 000000000..f70f08496 --- /dev/null +++ b/modules/module/queries/updateModuleMenu.xml @@ -0,0 +1,12 @@ + + +
    + + + + + + + + + diff --git a/modules/module/queries/updateModuleSkinVars.xml b/modules/module/queries/updateModuleSkinVars.xml new file mode 100644 index 000000000..c2f9b8127 --- /dev/null +++ b/modules/module/queries/updateModuleSkinVars.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/module/schemas/action_forward.xml b/modules/module/schemas/action_forward.xml new file mode 100644 index 000000000..a4625989c --- /dev/null +++ b/modules/module/schemas/action_forward.xml @@ -0,0 +1,5 @@ +
    + + + +
    diff --git a/modules/module/schemas/module_categories.xml b/modules/module/schemas/module_categories.xml new file mode 100644 index 000000000..a7d54a127 --- /dev/null +++ b/modules/module/schemas/module_categories.xml @@ -0,0 +1,5 @@ + + + + +
    diff --git a/modules/module/schemas/module_config.xml b/modules/module/schemas/module_config.xml new file mode 100644 index 000000000..3cd9a780f --- /dev/null +++ b/modules/module/schemas/module_config.xml @@ -0,0 +1,5 @@ + + + + +
    diff --git a/modules/module/schemas/modules.xml b/modules/module/schemas/modules.xml new file mode 100644 index 000000000..ed918546c --- /dev/null +++ b/modules/module/schemas/modules.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + +
    diff --git a/modules/module/tpl/category_list.html b/modules/module/tpl/category_list.html new file mode 100644 index 000000000..2b47e0f0b --- /dev/null +++ b/modules/module/tpl/category_list.html @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->category_title}{$lang->regdate}{$lang->cmd_modify}{$lang->cmd_delete}
    {$lang->msg_category_is_null}
    {$val->title}{zdate($val->regdate,"Y-m-d H:i:s")}{$lang->cmd_modify}{$lang->cmd_delete}
    + + +
    + + + + + + + + + + + +
    {$lang->category_title} + +
    + +
    + +
    + +
    diff --git a/modules/module/tpl/category_update_form.html b/modules/module/tpl/category_update_form.html new file mode 100644 index 000000000..6f10aeac9 --- /dev/null +++ b/modules/module/tpl/category_update_form.html @@ -0,0 +1,27 @@ + + + + + + +
    + + + + + + + + + + +
    {$lang->category_title} + +
    + +
    + +
    + +
    + diff --git a/modules/module/tpl/config.html b/modules/module/tpl/config.html new file mode 100644 index 000000000..07082f5cc --- /dev/null +++ b/modules/module/tpl/config.html @@ -0,0 +1,19 @@ + + +
    + + + + + + + + + + + +
    {$lang->test}
    {$lang->about_test}
    + + +
    +
    diff --git a/modules/module/tpl/filter/insert_category.xml b/modules/module/tpl/filter/insert_category.xml new file mode 100644 index 000000000..6b7885450 --- /dev/null +++ b/modules/module/tpl/filter/insert_category.xml @@ -0,0 +1,10 @@ + +
    + + + + + + + +
    diff --git a/modules/module/tpl/filter/insert_shortcut.xml b/modules/module/tpl/filter/insert_shortcut.xml new file mode 100644 index 000000000..9d8006f4e --- /dev/null +++ b/modules/module/tpl/filter/insert_shortcut.xml @@ -0,0 +1,9 @@ + +
    + + + + + + +
    diff --git a/modules/module/tpl/filter/update_category.xml b/modules/module/tpl/filter/update_category.xml new file mode 100644 index 000000000..5073021d0 --- /dev/null +++ b/modules/module/tpl/filter/update_category.xml @@ -0,0 +1,10 @@ + +
    + + + + + + + +
    diff --git a/modules/module/tpl/header.html b/modules/module/tpl/header.html new file mode 100644 index 000000000..b237e29e6 --- /dev/null +++ b/modules/module/tpl/header.html @@ -0,0 +1,15 @@ + + +

    {$lang->module} {$lang->cmd_management}

    + + +
    {nl2br($lang->about_module)}
    + + +
    +
     
    + +
    diff --git a/modules/module/tpl/index.html b/modules/module/tpl/index.html new file mode 100644 index 000000000..9dfebe41c --- /dev/null +++ b/modules/module/tpl/index.html @@ -0,0 +1 @@ + diff --git a/modules/module/tpl/js/module_admin.js b/modules/module/tpl/js/module_admin.js new file mode 100644 index 000000000..5581e70e0 --- /dev/null +++ b/modules/module/tpl/js/module_admin.js @@ -0,0 +1,52 @@ +/** + * @file modules/module/js/module_admin.js + * @author zero (zero@nzeo.com) + * @brief module 모듈의 관리자용 javascript + **/ + +/* 카테고리 관련 작업들 */ +function doUpdateCategory(module_category_srl, mode, message) { + if(typeof(message)!='undefined'&&!confirm(message)) return; + + var fo_obj = xGetElementById('fo_category_info'); + fo_obj.module_category_srl.value = module_category_srl; + fo_obj.mode.value = mode; + + procFilter(fo_obj, update_category); +} + +/* 카테고리 정보 수정 후 */ +function completeUpdateCategory(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + alert(message); + + location.href = current_url.setQuery('module_category_srl',''); +} + +/* 선택된 모듈을 관리자 메뉴의 바로가기에 등록 */ +function doAddShortCut(module) { + var fo_obj = xGetElementById("fo_shortcut"); + fo_obj.selected_module.value = module; + procFilter(fo_obj, insert_shortcut); +} + +/* 모듈 설치 */ +function doInstallModule(module) { + var params = new Array(); + params['module_name'] = module; + exec_xml('install','procInstallAdminInstall',params, completeInstallModule); +} + +function completeInstallModule(ret_obj) { + alert(ret_obj['message']); + location.reload(); +} + +/* 모듈 업그레이드 */ +function doUpdateModule(module) { + var params = new Array(); + params['module_name'] = module; + exec_xml('install','procInstallAdminUpdate',params, completeInstallModule); +} diff --git a/modules/module/tpl/module_info.html b/modules/module/tpl/module_info.html new file mode 100644 index 000000000..0ea94f2d3 --- /dev/null +++ b/modules/module/tpl/module_info.html @@ -0,0 +1,36 @@ +
    +

    {$lang->module_maker}

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->title}{$module_info->title} ver {$module_info->version}
    {$lang->author}{$module_info->author->name}
    {$lang->homepage}{$module_info->author->homepage}
    {$lang->regdate}{$module_info->author->date}
    {$lang->description}{nl2br($module_info->author->description)}
    + +
    + + diff --git a/modules/module/tpl/module_list.html b/modules/module/tpl/module_list.html new file mode 100644 index 000000000..9fdec7191 --- /dev/null +++ b/modules/module/tpl/module_list.html @@ -0,0 +1,61 @@ + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->module_name}{$lang->version}{$lang->author}{$lang->date}{$lang->table_count}{$lang->installed_path}{$lang->module_info}{$lang->module_action}{$lang->add_shortcut}
    + + {$val->title} ({$val->module}) + + {$val->title} ({$val->module}) + + {$val->version}{$val->author->name}{$val->author->date} + {$val->created_table_count}/{$val->table_count} + {$val->path}{$lang->cmd_view} + + {$lang->cmd_install} + + + {$lang->cmd_update} + +   + + + + {$lang->cmd_add_shortcut} + +   + +
    diff --git a/modules/module/tpl/skin_info.html b/modules/module/tpl/skin_info.html new file mode 100644 index 000000000..f0d168642 --- /dev/null +++ b/modules/module/tpl/skin_info.html @@ -0,0 +1,35 @@ + +
    +

    {$skin_info->title}

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + +
    {$skin_info->title}
    {$skin_info->maker->name}
    {$skin_info->maker->homepage}
    {$skin_info->maker->date} +
    {$lang->description}{nl2br($skin_info->maker->description)}
    +
    + + diff --git a/modules/page/conf/info.xml b/modules/page/conf/info.xml new file mode 100644 index 000000000..b73634db2 --- /dev/null +++ b/modules/page/conf/info.xml @@ -0,0 +1,17 @@ + + + 페이지 + 页面> + ページ + Page + + 제로 + zero + Zero + zero + 페이지를 제작하여 컨텐츠로 연결할 수 있는 모듈 + 制作页面并能连接到内容区的模块。 + ページを作成してコンテンツとしてリンクできるようにするためのモジュールです。 + This module is for creating pages to link with contents. + + diff --git a/modules/page/conf/module.xml b/modules/page/conf/module.xml new file mode 100644 index 000000000..dd598d3d8 --- /dev/null +++ b/modules/page/conf/module.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/modules/page/lang/en.lang.php b/modules/page/lang/en.lang.php new file mode 100644 index 000000000..06d76b23e --- /dev/null +++ b/modules/page/lang/en.lang.php @@ -0,0 +1,11 @@ +page = "Page"; + $lang->about_page = "It is a blog module which you can create a complete page.\nUsing latest or other widgets, you can create a dynamic page. Through the editor component, you can also create a great variety of pages.\nIts URL is same as other module's such as mid=module name.\n If it is selected as a default, it will be the main page of the site."; + $lang->cmd_page_modify = "Modify"; +?> diff --git a/modules/page/lang/jp.lang.php b/modules/page/lang/jp.lang.php new file mode 100644 index 000000000..bc45aa399 --- /dev/null +++ b/modules/page/lang/jp.lang.php @@ -0,0 +1,11 @@ +page = "ページ"; + $lang->about_page = "完成されたひとつのページが作成できるブログモジュールです。最近の書き込みやウィジェットを用いて動的なページが作成でき、エディターのコンポネントで様々な形でデザインできます。接続URLは、他のモジュールと同じく、「mid=モジュール名」で接続ができ、デフォルトで選択するとメインページが表示されます。"; + $lang->cmd_page_modify = "ページ修正"; +?> diff --git a/modules/page/lang/ko.lang.php b/modules/page/lang/ko.lang.php new file mode 100644 index 000000000..ace6ac1d3 --- /dev/null +++ b/modules/page/lang/ko.lang.php @@ -0,0 +1,11 @@ +page = "페이지"; + $lang->about_page = "하나의 완성된 페이지를 제작할 수 있는 페이지 모듈입니다.\n최근게시물이나 기타 위젯을 이용해서 동적인 페이지 생성이 가능하고 에디터 컴포넌트를 통해서 다양한 모습으로 꾸밀 수 있습니다.\n접속 URL은 다른 모듈처 mid=모듈이름 으로 접속이 가능하며 기본으로 선택하면 접속시 메인 페이지가 됩니다"; + $lang->cmd_page_modify = "페이지 수정"; +?> diff --git a/modules/page/lang/zh-CN.lang.php b/modules/page/lang/zh-CN.lang.php new file mode 100644 index 000000000..4586b9636 --- /dev/null +++ b/modules/page/lang/zh-CN.lang.php @@ -0,0 +1,11 @@ +page = "页面"; + $lang->about_page = "可制作完整页面的模块。\n利用最新主题列表或其他控件可以生成动态的页面,且通过网页编辑器做出形式多样的页面。\n连接页面URL同其他模块链接相同。即:mid=模块名称。选择默认选项此页面将变为首页。"; + $lang->cmd_page_modify = "页面编辑"; +?> diff --git a/modules/page/page.admin.controller.php b/modules/page/page.admin.controller.php new file mode 100644 index 000000000..036b1ff0c --- /dev/null +++ b/modules/page/page.admin.controller.php @@ -0,0 +1,153 @@ +module = 'page'; + $args->mid = $args->page_name; + if(!$args->content) $args->content = $content; + else unset($args->conetnt); + unset($args->page_name); + if($args->is_default!='Y') $args->is_default = 'N'; + + // module_srl이 넘어오면 원 모듈이 있는지 확인 + if($args->module_srl) { + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl); + } + + // module 모듈의 controller 객체 생성 + $oModuleController = &getController('module'); + + // is_default=='Y' 이면 + if($args->is_default=='Y') $oModuleController->clearDefaultModule(); + + // module_srl의 값에 따라 insert/update + if($module_info->module_srl != $args->module_srl) { + $output = $oModuleController->insertModule($args); + $msg_code = 'success_registed'; + } else { + $output = $oModuleController->updateModule($args); + $msg_code = 'success_updated'; + } + + if(!$output->toBool()) return $output; + + $this->add("module_srl", $args->module_srl); + $this->add("page", Context::get('page')); + $this->setMessage($msg_code); + } + + /** + * @brief 페이지 삭제 + **/ + function procPageAdminDelete() { + $module_srl = Context::get('module_srl'); + + // 원본을 구해온다 + $oModuleController = &getController('module'); + $output = $oModuleController->deleteModule($module_srl); + if(!$output->toBool()) return $output; + + $this->add('module','page'); + $this->add('page',Context::get('page')); + $this->setMessage('success_deleted'); + } + + /** + * @brief 페이지 기본 정보의 추가 + **/ + function procPageAdminInsertConfig() { + // 기본 정보를 받음 + $args = Context::gets('test'); + + // module Controller 객체 생성하여 입력 + $oModuleController = &getController('module'); + $output = $oModuleController->insertModuleConfig('page',$args); + return $output; + } + + /** + * @brief 첨부파일 업로드 + **/ + function procUploadFile() { + // 기본적으로 필요한 변수 설정 + $upload_target_srl = Context::get('upload_target_srl'); + $module_srl = Context::get('module_srl'); + + // file class의 controller 객체 생성 + $oFileController = &getController('file'); + $output = $oFileController->insertFile($module_srl, $upload_target_srl); + + // 첨부파일의 목록을 java script로 출력 + $oFileController->printUploadedFileList($upload_target_srl); + } + + /** + * @brief 첨부파일 삭제 + * 에디터에서 개별 파일 삭제시 사용 + **/ + function procDeleteFile() { + // 기본적으로 필요한 변수인 upload_target_srl, module_srl을 설정 + $upload_target_srl = Context::get('upload_target_srl'); + $module_srl = Context::get('module_srl'); + $file_srl = Context::get('file_srl'); + + // file class의 controller 객체 생성 + $oFileController = &getController('file'); + if($file_srl) $output = $oFileController->deleteFile($file_srl, $this->grant->manager); + + // 첨부파일의 목록을 java script로 출력 + $oFileController->printUploadedFileList($upload_target_srl); + } + + /** + * @brief 지정된 페이지의 위젯 캐시 파일 지우기 + **/ + function procPageAdminRemoveWidgetCache() { + $module_srl = Context::get('module_srl'); + + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + + $content = $module_info->content; + + // 언어 종류 가져옴 + $lang_list = Context::get('lang_supported'); + + // 위젯 캐시 sequence 를 가져옴 + preg_match_all('/widget_sequence="([0-9]+)"/i',$content, $matches); + + $cache_path = './files/cache/widget_cache/'; + + for($i=0;$isetMessage('success_updated'); + } + + } +?> diff --git a/modules/page/page.admin.view.php b/modules/page/page.admin.view.php new file mode 100644 index 000000000..69e2f161a --- /dev/null +++ b/modules/page/page.admin.view.php @@ -0,0 +1,204 @@ +getModuleCategories(); + Context::set('module_category', $module_category); + + // 템플릿 경로 구함 (page의 경우 tpl에 관리자용 템플릿 모아놓음) + $this->setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 페이지 관리 목록 보여줌 + **/ + function dispPageAdminContent() { + $args->sort_index = "module_srl"; + $args->page = Context::get('page'); + $args->list_count = 40; + $args->page_count = 10; + $args->s_module_category_srl = Context::get('module_category_srl'); + $output = executeQuery('page.getPageList', $args); + + // 템플릿에 쓰기 위해서 context::set + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('page_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + // 템플릿 파일 지정 + $this->setTemplateFile('index'); + } + + /** + * @brief 페이지에 필요한 기본 설정들 + **/ + function dispPageAdminModuleConfig() { + // 설정 정보를 받아옴 (module model 객체를 이용) + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('page'); + Context::set('config',$config); + + // 템플릿 파일 지정 + $this->setTemplateFile('page_config'); + } + + /** + * @brief 선택된 페이지의 정보 출력 + **/ + function dispPageAdminInfo() { + // GET parameter에서 module_srl을 가져옴 + $module_srl = Context::get('module_srl'); + + // module model 객체 생성 + if($module_srl) { + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + if($module_info->module_srl == $module_srl) Context::set('module_info',$module_info); + else { + unset($module_info); + unset($module_srl); + } + } + + // module_srl 값이 없다면 그냥 index 페이지를 보여줌 + if(!$module_srl) return $this->dispPageAdminContent(); + + // 레이아웃이 정해져 있다면 레이아웃 정보를 추가해줌(layout_title, layout) + if($module_info->layout_srl) { + $oLayoutModel = &getModel('layout'); + $layout_info = $oLayoutModel->getLayout($module_info->layout_srl); + $module_info->layout = $layout_info->layout; + $module_info->layout_title = $layout_info->layout_title; + } + + // 레이아웃 목록을 구해옴 + $oLayoutMode = &getModel('layout'); + $layout_list = $oLayoutMode->getLayoutList(); + Context::set('layout_list', $layout_list); + + + // 템플릿 파일 지정 + $this->setTemplateFile('page_info'); + } + + /** + * @brief 페이지 추가 폼 출력 + **/ + function dispPageAdminInsert() { + + // GET parameter에서 module_srl을 가져옴 + $module_srl = Context::get('module_srl'); + + // module_srl이 있으면 해당 모듈의 정보를 구해서 세팅 + if($module_srl) { + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + if($module_info->module_srl == $module_srl) Context::set('module_info',$module_info); + else { + unset($module_info); + unset($module_srl); + } + } + + // module_srl이 없으면 sequence값으로 미리 구해 놓음 + if(!$module_srl) $module_srl = getNextSequence(); + Context::set('module_srl',$module_srl); + + // 레이아웃 목록을 구해옴 + $oLayoutMode = &getModel('layout'); + $layout_list = $oLayoutMode->getLayoutList(); + Context::set('layout_list', $layout_list); + + + // 템플릿 파일 지정 + $this->setTemplateFile('page_insert'); + } + + /** + * @brief 페이지 내용 수정 + **/ + function dispPageAdminContentModify() { + + // GET parameter에서 module_srl을 가져옴 + $module_srl = Context::get('module_srl'); + + // module_srl이 있으면 해당 모듈의 정보를 구해서 세팅 + if($module_srl) { + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + if($module_info->module_srl == $module_srl) Context::set('module_info',$module_info); + else { + unset($module_info); + unset($module_srl); + } + } + + // module_srl이 없으면 sequence값으로 미리 구해 놓음 + if(!$module_srl) $module_srl = getNextSequence(); + Context::set('module_srl',$module_srl); + + // 위젯 목록을 세팅 + $oWidgetModel = &getModel('widget'); + $widget_list = $oWidgetModel->getDownloadedWidgetList(); + Context::set('widget_list', $widget_list); + + // 에디터 모듈의 getEditor를 호출하여 세팅 + $oEditorModel = &getModel('editor'); + $option->allow_fileupload = true; + $option->enable_autosave = false; + $option->enable_default_component = true; + $option->enable_component = true; + $option->resizable = true; + $option->height = 600; + $editor = $oEditorModel->getEditor($module_srl, $option); + Context::set('editor', $editor); + + // 레이아웃 목록을 구해옴 + $oLayoutMode = &getModel('layout'); + $layout_list = $oLayoutMode->getLayoutList(); + Context::set('layout_list', $layout_list); + + // 템플릿 파일 지정 + $this->setTemplateFile('page_content_modify'); + } + + + /** + * @brief 페이지 삭제 화면 출력 + **/ + function dispPageAdminDelete() { + $module_srl = Context::get('module_srl'); + if(!$module_srl) return $this->dispContent(); + + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + Context::set('module_info',$module_info); + + // 템플릿 파일 지정 + $this->setTemplateFile('page_delete'); + } + + } +?> diff --git a/modules/page/page.class.php b/modules/page/page.class.php new file mode 100644 index 000000000..9fb9eb081 --- /dev/null +++ b/modules/page/page.class.php @@ -0,0 +1,44 @@ +insertActionForward('page', 'view', 'dispPageIndex'); + $oModuleController->insertActionForward('page', 'view', 'dispPageAdminContent'); + $oModuleController->insertActionForward('page', 'view', 'dispPageAdminModuleConfig'); + $oModuleController->insertActionForward('page', 'view', 'dispPageAdminInfo'); + $oModuleController->insertActionForward('page', 'view', 'dispPageAdminInsert'); + $oModuleController->insertActionForward('page', 'view', 'dispPageAdminDelete'); + + // page 에서 사용할 cache디렉토리 생성 + FileHandler::makeDir('./files/cache/page'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + + } +?> diff --git a/modules/page/page.view.php b/modules/page/page.view.php new file mode 100644 index 000000000..57a3d386b --- /dev/null +++ b/modules/page/page.view.php @@ -0,0 +1,36 @@ +setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 일반 요청시 출력 + **/ + function dispPageIndex() { + // 템플릿에서 사용할 변수를 Context::set() + if($this->module_srl) Context::set('module_srl',$this->module_srl); + + Context::set('module_info', $this->module_info); + Context::set('page_content', $this->module_info->content); + + $this->setTemplateFile('content'); + } + + } +?> diff --git a/modules/page/queries/getPageList.xml b/modules/page/queries/getPageList.xml new file mode 100644 index 000000000..17e3b7b88 --- /dev/null +++ b/modules/page/queries/getPageList.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/page/tpl/content.html b/modules/page/tpl/content.html new file mode 100644 index 000000000..eb8667901 --- /dev/null +++ b/modules/page/tpl/content.html @@ -0,0 +1,10 @@ +{$page_content} + + + + + diff --git a/modules/page/tpl/css/page.css b/modules/page/tpl/css/page.css new file mode 100644 index 000000000..19dabd7ff --- /dev/null +++ b/modules/page/tpl/css/page.css @@ -0,0 +1,6 @@ +@charset "utf-8"; +h3 { margin:0 10px 0 10px; } +.widget_list { margin:10px; } +.widget_list a { margin-bottom:10px; } +.editor_box { margin:0 10px 10px 10px; } +.button_box { float:right; overflow:hidden; } diff --git a/modules/page/tpl/filter/delete_page.xml b/modules/page/tpl/filter/delete_page.xml new file mode 100644 index 000000000..b19c7c465 --- /dev/null +++ b/modules/page/tpl/filter/delete_page.xml @@ -0,0 +1,10 @@ + +
    + + + + + + + +
    diff --git a/modules/page/tpl/filter/insert_config.xml b/modules/page/tpl/filter/insert_config.xml new file mode 100644 index 000000000..3f4125880 --- /dev/null +++ b/modules/page/tpl/filter/insert_config.xml @@ -0,0 +1,7 @@ + +
    + + + + +
    diff --git a/modules/page/tpl/filter/insert_page.xml b/modules/page/tpl/filter/insert_page.xml new file mode 100644 index 000000000..f00e55ef5 --- /dev/null +++ b/modules/page/tpl/filter/insert_page.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/modules/page/tpl/filter/insert_page_content.xml b/modules/page/tpl/filter/insert_page_content.xml new file mode 100644 index 000000000..949a2e006 --- /dev/null +++ b/modules/page/tpl/filter/insert_page_content.xml @@ -0,0 +1,22 @@ + +
    + + + + + + + + + + + + + + + + + + + +
    diff --git a/modules/page/tpl/header.html b/modules/page/tpl/header.html new file mode 100644 index 000000000..e35a5d100 --- /dev/null +++ b/modules/page/tpl/header.html @@ -0,0 +1,3 @@ + + +

    {$lang->page} {$lang->cmd_management}

    diff --git a/modules/page/tpl/images/blank.gif b/modules/page/tpl/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/modules/page/tpl/images/blank.gif differ diff --git a/modules/page/tpl/images/buttonTypeACenter.gif b/modules/page/tpl/images/buttonTypeACenter.gif new file mode 100644 index 000000000..56127ea2e Binary files /dev/null and b/modules/page/tpl/images/buttonTypeACenter.gif differ diff --git a/modules/page/tpl/images/buttonTypeALeft.gif b/modules/page/tpl/images/buttonTypeALeft.gif new file mode 100644 index 000000000..12839fe05 Binary files /dev/null and b/modules/page/tpl/images/buttonTypeALeft.gif differ diff --git a/modules/page/tpl/images/buttonTypeARight.gif b/modules/page/tpl/images/buttonTypeARight.gif new file mode 100644 index 000000000..1dd5aac05 Binary files /dev/null and b/modules/page/tpl/images/buttonTypeARight.gif differ diff --git a/modules/page/tpl/images/iconWrite.gif b/modules/page/tpl/images/iconWrite.gif new file mode 100644 index 000000000..f18cb5e9e Binary files /dev/null and b/modules/page/tpl/images/iconWrite.gif differ diff --git a/modules/page/tpl/index.html b/modules/page/tpl/index.html new file mode 100644 index 000000000..2cd63799a --- /dev/null +++ b/modules/page/tpl/index.html @@ -0,0 +1,79 @@ + + + +
    {nl2br($lang->about_page)}
    + + +
    + Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)} +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->no} +
    + + + + +
    +
    {$lang->mid}{$lang->browser_title}{$lang->is_default}{$lang->regdate}{$lang->cmd_view}{$lang->cmd_delete}
    {$no} + + {$lang->not_exists} + + {$module_category[$val->module_category_srl]->title} + + {$val->mid}{$val->browser_title}{$val->is_default}{zdate($val->regdate,"Y-m-d")}{$lang->cmd_view}{$lang->cmd_delete}
    + + + + + + diff --git a/modules/page/tpl/js/page_admin.js b/modules/page/tpl/js/page_admin.js new file mode 100644 index 000000000..895e4913e --- /dev/null +++ b/modules/page/tpl/js/page_admin.js @@ -0,0 +1,85 @@ +/** + * @file modules/page/js/page_admin.js + * @author zero (zero@nzeo.com) + * @brief page모듈의 관리자용 javascript + **/ + +/* 모듈 생성 후 */ +function completeInsertPage(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + var page = ret_obj['page']; + var module_srl = ret_obj['module_srl']; + + alert(message); + + var url = ''; + if(location.href.getQuery('module')=='admin') { + url = current_url.setQuery('module_srl',module_srl).setQuery('act','dispPageAdminInfo'); + if(page) url = url.setQuery('page',page); + } else { + url = current_url.setQuery('act','').setQuery('module_srl',''); + } + + location.href = url; +} + +/* 내용 저장 후 */ +function completeInsertPageContent(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + var page = ret_obj['page']; + var module_srl = ret_obj['module_srl']; + + alert(message); + + var url = ''; + if(location.href.getQuery('module')=='admin') { + url = current_url.setQuery('module_srl',module_srl).setQuery('act','dispPageAdminInfo'); + if(page) url = url.setQuery('page',page); + } else { + url = current_url.setQuery('act','').setQuery('module_srl',''); + } + + if(opener) opener.location.reload(); + + window.close(); +} + +/* 모듈 삭제 후 */ +function completeDeletePage(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var page = ret_obj['page']; + alert(message); + + var url = current_url.setQuery('act','dispPageAdminContent'); + if(page) url = url.setQuery('page',page); + + location.href = url; +} + +/* 카테고리 이동 */ +function doChangeCategory(fo_obj) { + var module_category_srl = fo_obj.module_category_srl.options[fo_obj.module_category_srl.selectedIndex].value; + if(module_category_srl==-1) { + location.href = current_url.setQuery('act','dispModuleAdminCategory'); + return false; + } + return true; +} + +/* 위젯 재컴파일 */ +function doRemoveWidgetCache(module_srl) { + var params = new Array(); + params["module_srl"] = module_srl; + exec_xml('page', 'procPageAdminRemoveWidgetCache', params, completeRemoveWidgetCache); +} + +function completeRemoveWidgetCache(ret_obj) { + var message = ret_obj['message']; + alert(message); + location.reload(); +} diff --git a/modules/page/tpl/page_config.html b/modules/page/tpl/page_config.html new file mode 100644 index 000000000..947725e37 --- /dev/null +++ b/modules/page/tpl/page_config.html @@ -0,0 +1,18 @@ + + +
    + + + + + + + + + + + +
    {$lang->test}
    {$lang->about_test}
    + +
    +
    diff --git a/modules/page/tpl/page_content_modify.html b/modules/page/tpl/page_content_modify.html new file mode 100644 index 000000000..c47481f21 --- /dev/null +++ b/modules/page/tpl/page_content_modify.html @@ -0,0 +1,41 @@ + + + + + + +
    + + + + + + + + + + + + + +
    + + + +
    +
    + +
    {$editor}
    + +
    + + + +
    +
    + +
    diff --git a/modules/page/tpl/page_delete.html b/modules/page/tpl/page_delete.html new file mode 100644 index 000000000..a5ee98f7b --- /dev/null +++ b/modules/page/tpl/page_delete.html @@ -0,0 +1,31 @@ + + + + +
    + + + + + + + + + + + + + + + + +
    {$lang->confirm_delete}
    {$lang->module_name}{$module_info->mid}
    {$lang->module}{$module_info->module}
    + + + + +
    + diff --git a/modules/page/tpl/page_info.html b/modules/page/tpl/page_info.html new file mode 100644 index 000000000..8088e6174 --- /dev/null +++ b/modules/page/tpl/page_info.html @@ -0,0 +1,80 @@ + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->mid} + +

    {$lang->about_mid}

    +
    {$lang->is_default} + is_default=='Y')-->checked="checked" id="fld_for_default" class="checkbox" /> + +
    {$lang->module_category} + +

    {$lang->about_module_category}

    +
    {$lang->browser_title} + +

    {$lang->about_browser_title}

    +
    {$lang->layout} + +

    {$lang->about_layout}

    +
    + + {$lang->cmd_page_modify} + + {$lang->cmd_list} + + {$lang->cmd_back} + +
    {$lang->content}
    {$module_info->content}
    + +
    diff --git a/modules/page/tpl/page_insert.html b/modules/page/tpl/page_insert.html new file mode 100644 index 000000000..86cf7ee81 --- /dev/null +++ b/modules/page/tpl/page_insert.html @@ -0,0 +1,67 @@ + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->mid} + +

    {$lang->about_mid}

    +
    {$lang->is_default} + is_default=='Y')-->checked="checked" id="fld_for_default" class="checkbox" /> + +
    {$lang->module_category} + +

    {$lang->about_module_category}

    +
    {$lang->browser_title} + +

    {$lang->about_browser_title}

    +
    {$lang->layout} + +

    {$lang->about_layout}

    +
    + +
    + +
    + +
    diff --git a/modules/point/conf/info.xml b/modules/point/conf/info.xml new file mode 100644 index 000000000..f9cbb1f5a --- /dev/null +++ b/modules/point/conf/info.xml @@ -0,0 +1,31 @@ + + + 포인트 시스템 + 积分系统 + ポイントシステム + Point System + + 제로 + Zero + Zero + zero + + 글작성/삭제/댓글작성/삭제시에 포인트를 부여할 수 있습니다. + 포인트마다 레벨을 지정하여 사용자 이름 앞에 아이콘을 표시할 수도 있습니다. + 단 포인트 관련 애드온을 활성화 시키셔야 됩니다. + + + 可以在发表/删除新帖,发表/删除评论时,付与相应积分。 + 也可以以积分设置级别,并在用户名前显示级别图标。 + 必须是先激活积分系统才可以使用。 + + + 書き込み作成・削除/コメント作成・削除の活動に対するポイントを計算するシステムです。ポイントごとレベルを指定してユーザ名の前にアイコンを表示させることができます。但し、ポイントシステムアドオンを「使用」に設定しないと作動しません。 + + + You can grant point on writing/deleting/adding comments/deleting comments. + You can also display point icon in front of user name by selecting level on each point. + But to enable these functions, you need to activate point related addons. + + + diff --git a/modules/point/conf/module.xml b/modules/point/conf/module.xml new file mode 100644 index 000000000..073a7bb0e --- /dev/null +++ b/modules/point/conf/module.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + 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/en.lang.php b/modules/point/lang/en.lang.php new file mode 100644 index 000000000..4f6113166 --- /dev/null +++ b/modules/point/lang/en.lang.php @@ -0,0 +1,46 @@ + + * @brief Default language pack of point module + **/ + + $lang->point = "Point"; + $lang->level = "Level"; + + $lang->about_point_module = "You can grant points on writing/adding comments/uploading/downloading.
    But point module only configure settings, and the point will be accumulated only when point addon is activated"; + $lang->about_act_config = "Each module like board/blog has action such as writing/deleting/adding comments/deleting comments.
    You can just add act value to link module except board/blog with point system.
    Comma(,) will distinguish multiple values."; + + $lang->max_level = 'Max Level'; + $lang->about_max_level = 'You can set the max level. Level icons should be considered and 1000 is the maximum value you can set'; + + $lang->level_icon = 'Level Icon'; + $lang->about_level_icon = 'Path of level icon is ./module/point/icons/[level].gif and max level could be different with icon set. So be careful'; + + $lang->point_name = 'Point Name'; + $lang->about_point_name = 'You can give point name or unit'; + + $lang->level_point = 'Level Point'; + $lang->about_level_point = 'Level will be adjusted when point reaches to each level point or decrease under each level point'; + + $lang->disable_download = 'Prohibit Downloads'; + $lang->about_disable_download = "It will prohibit downloads when there isn't enough point. (Exclude image files)"; + + $lang->about_module_point = "You can set point for each module and modules which don't have any value will use default point.
    All point will be restored on acting reverse."; + + $lang->point_insert_document = 'On Writing'; + $lang->point_delete_document = 'On Deleting'; + $lang->point_insert_comment = 'On Adding Comments'; + $lang->point_delete_comment = 'On Deleting Comments'; + $lang->point_upload_file = 'On Uploading'; + $lang->point_delete_file = 'On Deleting Files'; + $lang->point_download_file = 'On Downloading Files (Exclude images)'; + + + $lang->cmd_point_config = 'Default Setting'; + $lang->cmd_point_module_config = 'Module Setting'; + $lang->cmd_point_act_config = 'Act Setting'; + $lang->cmd_point_member_list = 'Member Point List'; + + $lang->msg_cannot_download = "You don't have enough point to download"; +?> diff --git a/modules/point/lang/jp.lang.php b/modules/point/lang/jp.lang.php new file mode 100644 index 000000000..d8d4aedb0 --- /dev/null +++ b/modules/point/lang/jp.lang.php @@ -0,0 +1,46 @@ + 翻訳:RisaPapa + * @brief ポイント(point)モジュールの基本言語パッケージ + **/ + + $lang->point = "ポイント"; + $lang->level = "レベル"; + + $lang->about_point_module = "ポイントモジュールでは、書き込み作成/コメント作成/アップロード/ダウンロードなどのユーザの活動に対してポイントの計算を行います。但し、ポイントモジュールでは設定のみを行い、アドオンでポイントシステムを「使用」に設定しなければポイントは累積されません。"; + $lang->about_act_config = "掲示板、ブログなどのモジュールごと書き込み作成・削除/コメント作成・削除などのアクションがあります。掲示板/ブログ以外のモジュールにポイントシステムを連動させたい場合は、各機能のアクションの「act値」を追加します。連動は「,(コンマ)」で行います。"; + + $lang->max_level = '最高レベル'; + $lang->about_max_level = '最高レベルを指定することができます。最高レベルは「1000」がマクシマムなので、レベルアイコンに注意が必要です。'; + + $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 = '機能別アクション設定'; + $lang->cmd_point_member_list = '会員ポイントリスト'; + + $lang->msg_cannot_download = 'ポイントが不足しているため、ダウンロードできません。'; +?> diff --git a/modules/point/lang/ko.lang.php b/modules/point/lang/ko.lang.php new file mode 100644 index 000000000..1eb0c8bad --- /dev/null +++ b/modules/point/lang/ko.lang.php @@ -0,0 +1,46 @@ + + * @brief 포인트 (point) 모듈의 기본 언어팩 + **/ + + $lang->point = "포인트"; + $lang->level = "레벨"; + + $lang->about_point_module = "포인트 모듈은 글작성/댓글작성/업로드/다운로드등의 행동을 할때 포인트를 부여할 수 있습니다.
    단 포인트 모듈에서는 설정만 할 뿐이고 포인트 애드온을 활성화 시켜야 포인트가 누적이 됩니다"; + $lang->about_act_config = "게시판,블로그등의 모듈마다 글작성/삭제/댓글작성/삭제등의 action이 있습니다.
    게시판/블로그외의 모듈에 포인트 기능 연동을 하고 싶을때는 각 기능에 맞는 act값을 추가해주시면 됩니다.
    연결은 ,(콤마)로 해주시면 됩니다."; + + $lang->max_level = '최고 레벨'; + $lang->about_max_level = '최고레벨을 지정하실 수 있습니다. 레벨 아이콘을 염두에 두셔야 하고 최고 레벨은 1000이 한계입니다'; + + $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->cmd_point_member_list = '회원 포인트 목록'; + + $lang->msg_cannot_download = '포인트가 부족하여 다운로드를 하실 수 없습니다'; +?> diff --git a/modules/point/lang/zh-CN.lang.php b/modules/point/lang/zh-CN.lang.php new file mode 100644 index 000000000..f80d3ae1b --- /dev/null +++ b/modules/point/lang/zh-CN.lang.php @@ -0,0 +1,46 @@ + + * @brief 积分 (point) 模块简体中文语言包 + **/ + + $lang->point = "积分"; + $lang->level = "级别"; + + $lang->about_point_module = "积分系统可以在发表/删除新帖,发表/删除评论,上传/下载/删除/文件等动作时,付与其相应的积分。
    积分系统模块只能设置各项积分,不能记录积分。只有激活积分插件后才可以正常记录相关积分。"; + $lang->about_act_config = "版面,博客等模块都有发表/删除新帖,发表/删除评论等动作。
    要想与版面/博客之外的模块关联积分功能时,添加与其各模块功能相适合的act值即可。"; + + $lang->max_level = '最高级别'; + $lang->about_max_level = '可以指定最高级别。级别共设1000级,因此制作级别图标时要好好考虑一下。'; + + $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 = '可以分别对各模块进行积分设置,没有被设置的模块将使用默认值。
    所有积分在相反动作下恢复原始值。即:发表新帖后再删除得到的积分为0分。'; + + $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->cmd_point_member_list = '会员积分目录'; + + $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..d396d6270 --- /dev/null +++ b/modules/point/point.admin.controller.php @@ -0,0 +1,150 @@ +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>1000) $config->max_level = 1000; + 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'; + + unset($config->level_step); + 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 procPointAdminUpdatePoint() { + $member_srl = Context::get('member_srl'); + $point = Context::get('point'); + + $oPointController = &getController('point'); + return $oPointController->setPoint($member_srl, $point); + } + + /** + * @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..d69479a56 --- /dev/null +++ b/modules/point/point.admin.view.php @@ -0,0 +1,78 @@ +getModuleConfig('point'); + + // 설정 변수 지정 + 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'); + } + + /** + * @brief 회원 포인트순 목록 가져오기 + **/ + function dispPointAdminPointList() { + $oPointModel = &getModel('point'); + $args->list_count = 20; + $args->page = Context::get('page'); + + $output = $oPointModel->getMemberList($args); + // 템플릿에 쓰기 위해서 context::set + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('member_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + // 템플릿 지정 + $this->setTemplateFile('member_list'); + } + } +?> diff --git a/modules/point/point.class.php b/modules/point/point.class.php new file mode 100644 index 000000000..2be4cf040 --- /dev/null +++ b/modules/point/point.class.php @@ -0,0 +1,93 @@ +insertActionForward('point', 'view', 'dispPointAdminConfig'); + $oModuleController->insertActionForward('point', 'view', 'dispPointAdminModuleConfig'); + $oModuleController->insertActionForward('point', 'view', 'dispPointAdminActConfig'); + $oModuleController->insertActionForward('point', 'view', 'dispPointAdminPointList'); + + // 포인트 정보를 기록할 디렉토리 생성 + 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..704d4d108 --- /dev/null +++ b/modules/point/point.controller.php @@ -0,0 +1,87 @@ +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($member_srl<1) return $matches[0]; + + 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 = sprintf('<%s title="%s:%s%s %s, %s:%s/%s" style="cursor:pointer;background:url(%s) no-repeat left;padding-left:%dpx; height:%dpx">%s ', $matches[6], Context::getLang('point'), $point, $this->config->point_name, $per?"(".$per."%)":"", Context::getLang('level'), $level, $this->config->max_level, Context::getRequestUri().$src, $this->icon_width+2, $this->icon_height, $matches[0], $matches[6]); + $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..c7f603aff --- /dev/null +++ b/modules/point/point.model.php @@ -0,0 +1,76 @@ +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; + } + + /** + * @brief 포인트 순 회원목록 가져오기 + **/ + function getMemberList($args = null) { + if(!$args) { + $args->list_count = 20; + $args->page = 1; + } + $output = executeQuery("point.getMemberList", $args); + if($output->total_count) { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('point'); + + foreach($output->data as $key => $val) { + $point = $val->point; + $level = $this->getLevel($val->point, $config->level_step); + $output->data[$key]->level = $level; + } + } + return $output; + } + } +?> diff --git a/modules/point/queries/getMemberList.xml b/modules/point/queries/getMemberList.xml new file mode 100644 index 000000000..c6621a67f --- /dev/null +++ b/modules/point/queries/getMemberList.xml @@ -0,0 +1,16 @@ + + + +
    + + + + + + + + + + + + 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 @@ + + + + + + +
    + +
    + + + + + + +
    +
    + {$lang->poll_stop_date} : {zdate($poll->stop_date, "Y-m-d H:i")} +
    +
    + + + + +
    +
    {$val->title}
    + + {@$_idx = $poll->poll_srl.'_'.$poll_srl_index.'_'.$item_srl} + +
    + + + + + + +
    + + + +
    + {$lang->poll_checkcount} : {$val->checkcount} +
    + +
    + + + +
    + +
    + + + +
    + +
    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}%) +
    +
    + +
    bar
    + +
    bar
    + +
    + + +
    + + + +
    diff --git a/modules/point/skins/default/skin.xml b/modules/point/skins/default/skin.xml new file mode 100644 index 000000000..65f3fccd7 --- /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 @@ + + + +
    + +
    {$lang->about_act_config}
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$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}
    + + +
    + +
    + +
    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 @@ + + + +
    + +
    {$lang->about_point_module}
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->max_level} + +

    {$lang->about_max_level}

    +
    {$lang->point_name} + +

    {$lang->about_point_name}

    +
    {$lang->level_icon} + +

    {$lang->about_level_icon}

    +
    {$lang->disable_download} + disable_download=='Y')-->checked="checked" /> + {$lang->about_disable_download} +
    {$lang->level_point}1 {$config->point_name}
    {$i} {$config->point_name}
    + + +
    + +
    + +
    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/filter/update_point.xml b/modules/point/tpl/filter/update_point.xml new file mode 100644 index 000000000..7af42c83c --- /dev/null +++ b/modules/point/tpl/filter/update_point.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..175410b7b --- /dev/null +++ b/modules/point/tpl/header.html @@ -0,0 +1,13 @@ + +

    {$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/member_list.html b/modules/point/tpl/member_list.html new file mode 100644 index 000000000..92e0ff36d --- /dev/null +++ b/modules/point/tpl/member_list.html @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->no}{$lang->user_id}{$lang->user_name}{$lang->nick_name}{$lang->point}{$lang->level}
    {$no}{htmlspecialchars($val->user_id)}{htmlspecialchars($val->user_name)}
    {htmlspecialchars($val->nick_name)}
    + + + + + + {$val->level}
    + + + + 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 @@ + + + +
    + +
    {$lang->about_module_point}
    + + + + + + + + + + + + + + + + + + + + + + + + +
     {$lang->point_insert_document}{$lang->point_insert_comment}{$lang->point_upload_file}{$lang->point_download_file}
    {$lang->is_default} {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name}
    {$val->browser_title} ({$val->mid}) {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name}
    + + +
    + +
    + +
    diff --git a/modules/poll/conf/info.xml b/modules/poll/conf/info.xml new file mode 100644 index 000000000..fa015f3e3 --- /dev/null +++ b/modules/poll/conf/info.xml @@ -0,0 +1,17 @@ + + + 설문조사 + 投票调查 + アンケート + Poll + + 제로 + zero + Zero + zero + 설문조사 관리 모듈 + 管理投票调查的模块。 + アンケート管理モジュール + This module is for managering polls. + + diff --git a/modules/poll/conf/module.xml b/modules/poll/conf/module.xml new file mode 100644 index 000000000..38ffc0de3 --- /dev/null +++ b/modules/poll/conf/module.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/modules/poll/lang/en.lang.php b/modules/poll/lang/en.lang.php new file mode 100644 index 000000000..4ed199b3c --- /dev/null +++ b/modules/poll/lang/en.lang.php @@ -0,0 +1,37 @@ + + * @brief poll module / basic language pack + **/ + + $lang->poll = "Poll"; + $lang->poll_stop_date = "Expiration Date"; + $lang->poll_join_count = "Participants"; + $lang->poll_checkcount = "Number of required items"; + + $lang->cmd_poll_list = 'View poll list'; + $lang->cmd_delete_checked_poll = 'Delete selected poll'; + $lang->cmd_apply_poll = 'Apply poll'; + $lang->cmd_delete_checked_poll = 'Delete selected poll'; + + $lang->success_poll = 'Thank you for joining the poll.'; + + $lang->msg_already_poll = 'You already polled!'; + $lang->msg_cart_is_null = 'Please select an article to delete.'; + $lang->msg_checked_poll_is_deleted = '%d poll(s) are deleted.'; + $lang->msg_check_poll_item = 'Please select a poll item to poll.\n(Required poll item(s) may be different in each poll.)'; + $lang->msg_cart_is_null = 'Please select a poll to delete.'; + $lang->msg_checked_poll_is_deleted = '%d poll(s) are deleted.'; + $lang->msg_poll_not_exists = 'Selected poll does not exist.'; + + $lang->cmd_null_item = "No item value exist to post a poll. Please re-try."; + + $lang->confirm_poll_submit = "Confirm to submit the poll?"; + + $lang->search_target_list = array( + 'title' => 'Title', + 'regdate' => 'Posting date', + 'ipaddress' => 'IP Address', + ); +?> diff --git a/modules/poll/lang/jp.lang.php b/modules/poll/lang/jp.lang.php new file mode 100644 index 000000000..a4c4aa0d9 --- /dev/null +++ b/modules/poll/lang/jp.lang.php @@ -0,0 +1,37 @@ + 翻訳:RisaPapa + * @brief アンケート(poll)モジュールの基本言語パッケージ + **/ + + $lang->poll = "アンケート調査"; + $lang->poll_stop_date = "アンケート調査の終了日"; + $lang->poll_join_count = "参加者"; + $lang->poll_checkcount = "必須選択項目数"; + + $lang->cmd_poll_list = 'アンケートのリスト表示'; + $lang->cmd_delete_checked_poll = '選択項目削除'; + $lang->cmd_apply_poll = 'アンケート調査へ参加する'; + $lang->cmd_delete_checked_poll = '選択アンケート削除'; + + $lang->success_poll = 'アンケート調査へのご応募ありがとうございます。'; + + $lang->msg_already_poll = '既にアンケート調査に応募しました。'; + $lang->msg_cart_is_null = '削除する書き込みを選択してください。'; + $lang->msg_checked_poll_is_deleted = '%d個のアンケートが削除されました。'; + $lang->msg_check_poll_item = 'アンケート調査の項目を選択してください(アンケート調査ごと必須の選択項目が異なる場合があります)。'; + $lang->msg_cart_is_null = '削除するアンケートを選択してください。'; + $lang->msg_checked_poll_is_deleted = '%d個のアンケートが削除されました。'; + $lang->msg_poll_not_exists = '選択したアンケートは存在しません。'; + + $lang->cmd_null_item = "アンケート調査に登録する項目がありません。\nもう一度設定してください。"; + + $lang->confirm_poll_submit = "アンケート調査にご応募しますか?"; + + $lang->search_target_list = array( + 'title' => 'タイトル', + 'regdate' => '登録日', + 'ipaddress' => 'IPアドレス', + ); +?> diff --git a/modules/poll/lang/ko.lang.php b/modules/poll/lang/ko.lang.php new file mode 100644 index 000000000..f39c3f6c4 --- /dev/null +++ b/modules/poll/lang/ko.lang.php @@ -0,0 +1,37 @@ + + * @brief 설문조사 (poll) 모듈의 기본 언어팩 + **/ + + $lang->poll = "설문조사"; + $lang->poll_stop_date = "설문조사 종료일"; + $lang->poll_join_count = "참가자"; + $lang->poll_checkcount = "필수 선택 항목수"; + + $lang->cmd_poll_list = '설문조사 목록 보기'; + $lang->cmd_delete_checked_poll = '선택항목 삭제'; + $lang->cmd_apply_poll = '설문 참여'; + $lang->cmd_delete_checked_poll = '선택 설문 삭제'; + + $lang->success_poll = '설문에 응하여 주셔서 감사합니다'; + + $lang->msg_already_poll = '이미 설문조사를 하셨습니다'; + $lang->msg_cart_is_null = '삭제할 글을 선택해주세요'; + $lang->msg_checked_poll_is_deleted = '%d개의 설문조사가 삭제되었습니다'; + $lang->msg_check_poll_item = '설문에 응할 항목을 선택하여 주세요. (설문조사 마다 필수 선택항목이 다를 수 있습니다)'; + $lang->msg_cart_is_null = '삭제할 설문을 선택해주세요'; + $lang->msg_checked_poll_is_deleted = '%d개의 설문이 삭제되었습니다'; + $lang->msg_poll_not_exists = '선택하신 설문이 존재하지 않습니다'; + + $lang->cmd_null_item = "설문조사로 등록할 값이 없습니다.\n다시 설정해주세요"; + + $lang->confirm_poll_submit = "설문조사에 응하시겠습니까?"; + + $lang->search_target_list = array( + 'title' => '제목', + 'regdate' => '등록일', + 'ipaddress' => 'IP 주소', + ); +?> diff --git a/modules/poll/lang/zh-CN.lang.php b/modules/poll/lang/zh-CN.lang.php new file mode 100644 index 000000000..fef9ae324 --- /dev/null +++ b/modules/poll/lang/zh-CN.lang.php @@ -0,0 +1,37 @@ + + * @brief 投票调查 (poll) 模块的基本语言包 + **/ + + $lang->poll = "投票调查"; + $lang->poll_stop_date = "投票调查结束日期"; + $lang->poll_join_count = "投票者"; + $lang->poll_checkcount = "必选项目数"; + + $lang->cmd_poll_list = '查看投票调查目录'; + $lang->cmd_delete_checked_poll = '删除所选项目'; + $lang->cmd_apply_poll = '参与投票'; + $lang->cmd_delete_checked_poll = '删除所选问卷'; + + $lang->success_poll = '感谢您参与投票。'; + + $lang->msg_already_poll = '不能重复投票!'; + $lang->msg_cart_is_null = '请选择要删除的文章。'; + $lang->msg_checked_poll_is_deleted = '已删除%d个投票调查。'; + $lang->msg_check_poll_item = '请选择问卷回应的项目。 (每个问卷调查有不同的必选项目)'; + $lang->msg_cart_is_null = '请选择要删除的问卷。'; + $lang->msg_checked_poll_is_deleted = '已删除%d个问卷。'; + $lang->msg_poll_not_exists = '您选择的问卷不存在!'; + + $lang->cmd_null_item = "没有要登录为投票调查的值。\n请重新设置。"; + + $lang->confirm_poll_submit = "您要参与投票吗?"; + + $lang->search_target_list = array( + 'title' => '标题', + 'regdate' => '登录日期', + 'ipaddress' => 'IP 地址', + ); +?> diff --git a/modules/poll/poll.admin.controller.php b/modules/poll/poll.admin.controller.php new file mode 100644 index 000000000..4ca90c451 --- /dev/null +++ b/modules/poll/poll.admin.controller.php @@ -0,0 +1,111 @@ +skin = Context::get('skin'); + $config->colorset = Context::get('colorset'); + + $oModuleController = &getController('module'); + $oModuleController->insertModuleConfig('poll', $config); + + $this->setMessage('success_updated'); + } + + /** + * @brief 관리자 페이지에서 선택된 설문조사들을 삭제 + **/ + function procPollAdminDeleteChecked() { + // 선택된 글이 없으면 오류 표시 + $cart = Context::get('cart'); + if(!$cart) return $this->stop('msg_cart_is_null'); + + $poll_srl_list= explode('|@|', $cart); + $poll_count = count($poll_srl_list); + if(!$poll_count) return $this->stop('msg_cart_is_null'); + + // 글삭제 + for($i=0;$i<$poll_count;$i++) { + $poll_index_srl = trim($poll_srl_list[$i]); + if(!$poll_index_srl) continue; + + $output = $this->deletePollTitle($poll_index_srl, true); + if(!$output->toBool()) return $output; + } + + $this->setMessage( sprintf(Context::getLang('msg_checked_poll_is_deleted'), $poll_count) ); + } + + /** + * @brief 설문조사 삭제 (한번에 여러개의 설문 등록시 그 중 하나의 설문만 삭제) + **/ + function deletePollTitle($poll_index_srl) { + $args->poll_index_srl = $poll_index_srl; + + $oDB = &DB::getInstance(); + $oDB->begin(); + + $output = $oDB->executeQuery('poll.deletePollTitle', $args); + if(!$output) { + $oDB->rollback(); + return $output; + } + + $output = $oDB->executeQuery('poll.deletePollItem', $args); + if(!$output) { + $oDB->rollback(); + return $output; + } + + $oDB->commit(); + + return new Object(); + } + + /** + * @brief 설문조사 삭제 (하나의 묶인 설문조사를 통째로 삭제) + **/ + function deletePoll($poll_srl) { + $args->poll_srl = $poll_srl; + + $oDB = &DB::getInstance(); + $oDB->begin(); + + $output = $oDB->executeQuery('poll.deletePoll', $args); + if(!$output) { + $oDB->rollback(); + return $output; + } + + $output = $oDB->executeQuery('poll.deletePollTitle', $args); + if(!$output) { + $oDB->rollback(); + return $output; + } + + $output = $oDB->executeQuery('poll.deletePollItem', $args); + if(!$output) { + $oDB->rollback(); + return $output; + } + + $oDB->commit(); + + return new Object(); + } + } +?> diff --git a/modules/poll/poll.admin.model.php b/modules/poll/poll.admin.model.php new file mode 100644 index 000000000..30dad4a0a --- /dev/null +++ b/modules/poll/poll.admin.model.php @@ -0,0 +1,28 @@ +toBool()) return $output; + + if($output->data && !is_array($output->data)) $output->data = array($output->data); + return $output; + } + + } +?> diff --git a/modules/poll/poll.admin.view.php b/modules/poll/poll.admin.view.php new file mode 100644 index 000000000..8341dd320 --- /dev/null +++ b/modules/poll/poll.admin.view.php @@ -0,0 +1,127 @@ +s_title= $search_keyword; + break; + case 'regdate' : + $args->s_regdate = $search_keyword; + break; + case 'ipaddress' : + $args->s_ipaddress= $search_keyword; + break; + } + } + // 목록을 구하기 위한 옵션 + $args->page = Context::get('page'); ///< 페이지 + $args->list_count = 50; ///< 한페이지에 보여줄 글 수 + $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 + + $args->sort_index = 'list_order'; ///< 소팅 값 + + // 목록 구함 + $oPollAdminModel = &getAdminModel('poll'); + $output = $oPollAdminModel->getPollList($args); + + // 템플릿 변수 설정 + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('poll_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + Context::set('module_list', $module_list); + + // 템플릿 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('poll_list'); + } + + /** + * @brief 설문조사 스킨, 컬러셋 설정 + **/ + function dispPollAdminConfig() { + $oModuleModel = &getModel('module'); + + // 설정 정보 가져오기 + $config = $oModuleModel->getModuleConfig('poll'); + Context::set('config', $config); + + // 스킨 정보 가져오기 + $skin_list = $oModuleModel->getSkins($this->module_path); + Context::set('skin_list', $skin_list); + + if(!$skin_list[$config->skin]) $config->skin = "default"; + + // 설정된 스킨의 컬러셋 설정 + Context::set('colorset_list', $skin_list[$config->skin]->colorset); + + // 템플릿 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('config'); + } + + /** + * @brief 설문조사 결과 + **/ + function dispPollAdminResult() { + // 팝업 레이아웃 + $this->setLayoutFile("popup_layout"); + + // 결과 뽑기 + $args->poll_srl = Context::get('poll_srl'); + $args->poll_index_srl = Context::get('poll_index_srl'); + + $output = executeQuery('poll.getPoll', $args); + if(!$output->data) return $this->stop('msg_poll_not_exists'); + $poll->stop_date = $output->data->stop_date; + $poll->poll_count = $output->data->poll_count; + + $output = executeQuery('poll.getPollTitle', $args); + if(!$output->data) return $this->stop('msg_poll_not_exists'); + + $poll->poll[$args->poll_index_srl]->title = $output->data->title; + $poll->poll[$args->poll_index_srl]->checkcount = $output->data->checkcount; + $poll->poll[$args->poll_index_srl]->poll_count = $output->data->poll_count; + + $output = executeQuery('poll.getPollItem', $args); + foreach($output->data as $key => $val) { + $poll->poll[$val->poll_index_srl]->item[] = $val; + } + + $poll->poll_srl = $poll_srl; + + Context::set('poll',$poll); + + // 기본 설정의 스킨, 컬러셋 설정 + $oModuleModel = &getModel('module'); + $poll_config = $oModuleModel->getModuleConfig('poll'); + Context::set('poll_config', $poll_config); + + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('result'); + } + } +?> diff --git a/modules/poll/poll.class.php b/modules/poll/poll.class.php new file mode 100644 index 000000000..a3fa8b801 --- /dev/null +++ b/modules/poll/poll.class.php @@ -0,0 +1,43 @@ +insertActionForward('poll', 'view', 'dispPollAdminList'); + $oModuleController->insertActionForward('poll', 'view', 'dispPollAdminConfig'); + + // 기본 스킨 설정 + $oModuleController = &getController('module'); + $config->skin = 'default'; + $config->colorset = 'normal'; + $oModuleController->insertModuleConfig('poll', $config); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + + } +?> diff --git a/modules/poll/poll.controller.php b/modules/poll/poll.controller.php new file mode 100644 index 000000000..b58f02ec5 --- /dev/null +++ b/modules/poll/poll.controller.php @@ -0,0 +1,185 @@ + $val) { + if(strpos($key,'tidx')) continue; + if(!eregi("^(title|checkcount|item)_", $key)) continue; + if(!trim($val)) continue; + + $tmp_arr = explode('_',$key); + + $poll_index = $tmp_arr[1]; + + if($tmp_arr[0]=='title') $tmp_args[$poll_index]->title = $val; + else if($tmp_arr[0]=='checkcount') $tmp_args[$poll_index]->checkcount = $val; + else if($tmp_arr[0]=='item') $tmp_args[$poll_index]->item[] = $val; + } + + foreach($tmp_args as $key => $val) { + if(!$val->checkcount) $val->checkcount = 1; + if($val->title && count($val->item)) $args->poll[] = $val; + } + + if(!count($args->poll)) return new Object(-1, 'cmd_null_item'); + + $args->stop_date = $stop_date; + + // 변수 설정 + $poll_srl = getNextSequence(); + + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl?$logged_info->member_srl:0; + + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 설문의 등록 + unset($poll_args); + $poll_args->poll_srl = $poll_srl; + $poll_args->member_srl = $member_srl; + $poll_args->list_order = $poll_srl*-1; + $poll_args->stop_date = $args->stop_date; + $poll_args->poll_count = 0; + $poll_args->upload_target_srl = $upload_target_srl; + $output = executeQuery('poll.insertPoll', $poll_args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 개별 설문 등록 + foreach($args->poll as $key => $val) { + unset($title_args); + $title_args->poll_srl = $poll_srl; + $title_args->poll_index_srl = getNextSequence(); + $title_args->title = $val->title; + $title_args->checkcount = $val->checkcount; + $title_args->poll_count = 0; + $title_args->list_order = $title_args->poll_index_srl * -1; + $title_args->member_srl = $member_srl; + $title_args->upload_target_srl = $upload_target_srl; + $output = executeQuery('poll.insertPollTitle', $title_args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 개별 설문의 항목 추가 + foreach($val->item as $k => $v) { + unset($item_args); + $item_args->poll_srl = $poll_srl; + $item_args->poll_index_srl = $title_args->poll_index_srl; + $item_args->title = $v; + $item_args->poll_count = 0; + $item_args->upload_target_srl = $upload_target_srl; + $output = executeQuery('poll.insertPollItem', $item_args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + } + } + + // 작성자의 정보를 로그로 남김 + $log_args->poll_srl = $poll_srl; + $log_args->member_srl = $member_srl; + $output = executeQuery('poll.insertPollLog', $log_args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + $oDB->commit(); + + $this->add('poll_srl', $poll_srl); + $this->setMessage('success_registed'); + } + + /** + * @brief 설문 조사에 응함 + **/ + function procPoll() { + $poll_srl = Context::get('poll_srl'); + $poll_srl_indexes = Context::get('poll_srl_indexes'); + $tmp_item_srls = explode(',',$poll_srl_indexes); + for($i=0;$iisPolled($poll_srl)) return new Object(-1, 'msg_already_poll'); + + $oDB = &DB::getInstance(); + $oDB->begin(); + + $args->poll_srl = $poll_srl; + + // 해당 글의 모든 설문조사의 응답수 올림 + $output = executeQuery('poll.updatePoll', $args); + $output = executeQuery('poll.updatePollTitle', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 각 설문조사의 선택된 항목을 기록 + $args->poll_item_srl = implode(',',$item_srls); + $output = executeQuery('poll.updatePollItems', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 응답자 정보를 로그로 남김 + $log_args->poll_srl = $poll_srl; + $log_args->member_srl = $member_srl; + $log_args->ipaddress = $_SERVER['REMOTE_ADDR']; + $output = executeQuery('poll.insertPollLog', $log_args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + $oDB->commit(); + + // tpl 가져오기 + $tpl = $oPollModel->getPollHtml($poll_srl); + + $this->add('poll_srl', $poll_srl); + $this->add('tpl',$tpl); + $this->setMessage('success_poll'); + } + } +?> diff --git a/modules/poll/poll.model.php b/modules/poll/poll.model.php new file mode 100644 index 000000000..582f9f465 --- /dev/null +++ b/modules/poll/poll.model.php @@ -0,0 +1,105 @@ +poll_srl = $poll_srl; + + if(Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + $args->member_srl = $logged_info->member_srl; + } else { + $args->ipaddress = $_SERVER['REMOTE_ADDR']; + } + $output = executeQuery('poll.getPollLog', $args); + if($output->data->count) return true; + return false; + } + + /** + * @brief 설문조사의 html데이터를 return + * 설문조사에 응하였는지에 대한 체크를 한 후 결과를 return + **/ + function getPollHtml($poll_srl, $style = '') { + + $args->poll_srl = $poll_srl; + + // 해당 설문조사에 대한 내용을 조사 + $output = executeQuery('poll.getPoll', $args); + if(!$output->data) return ''; + + $poll->style = $style; + $poll->poll_count = (int)$output->data->poll_count; + $poll->stop_date = $output->data->stop_date; + + $output = executeQuery('poll.getPollTitle', $args); + if(!$output->data) return; + if(!is_array($output->data)) $output->data = array($output->data); + foreach($output->data as $key => $val) { + $poll->poll[$val->poll_index_srl]->title = $val->title; + $poll->poll[$val->poll_index_srl]->checkcount = $val->checkcount; + $poll->poll[$val->poll_index_srl]->poll_count = $val->poll_count; + } + + $output = executeQuery('poll.getPollItem', $args); + foreach($output->data as $key => $val) { + $poll->poll[$val->poll_index_srl]->item[] = $val; + } + + $poll->poll_srl = $poll_srl; + + // 종료일이 지났으면 무조건 결과만 + if($poll->stop_date > date("YmdHis")) { + if($this->isPolled($poll_srl)) $tpl_file = "result"; + else $tpl_file = "form"; + } else { + $tpl_file = "result"; + } + + Context::set('poll',$poll); + + // 기본 설정의 스킨, 컬러셋 설정 + $oModuleModel = &getModel('module'); + $poll_config = $oModuleModel->getModuleConfig('poll'); + if(!$poll_config->skin) $poll_config->skin = 'default'; + Context::set('poll_config', $poll_config); + $tpl_path = sprintf("%sskins/%s/", $this->module_path, $poll_config->skin); + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + /** + * @brief 선택된 설문조사 - 스킨의 컬러셋을 return + **/ + function getPollGetColorsetList() { + $skin = Context::get('skin'); + + $oModuleModel = &getModel('module'); + $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin); + + for($i=0;$icolorset);$i++) { + $colorset = sprintf('%s|@|%s', $skin_info->colorset[$i]->name, $skin_info->colorset[$i]->title); + $colorset_list[] = $colorset; + } + + if(count($colorset_list)) $colorsets = implode("\n", $colorset_list); + $this->add('colorset_list', $colorsets); + } + } +?> diff --git a/modules/poll/queries/deletePoll.xml b/modules/poll/queries/deletePoll.xml new file mode 100644 index 000000000..0fc33fed1 --- /dev/null +++ b/modules/poll/queries/deletePoll.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/poll/queries/deletePollItem.xml b/modules/poll/queries/deletePollItem.xml new file mode 100644 index 000000000..4e052fe79 --- /dev/null +++ b/modules/poll/queries/deletePollItem.xml @@ -0,0 +1,9 @@ + + +
    + + + + + + diff --git a/modules/poll/queries/deletePollTitle.xml b/modules/poll/queries/deletePollTitle.xml new file mode 100644 index 000000000..86bae302a --- /dev/null +++ b/modules/poll/queries/deletePollTitle.xml @@ -0,0 +1,9 @@ + + +
    + + + + + + diff --git a/modules/poll/queries/getPoll.xml b/modules/poll/queries/getPoll.xml new file mode 100644 index 000000000..d3cadae80 --- /dev/null +++ b/modules/poll/queries/getPoll.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/poll/queries/getPollItem.xml b/modules/poll/queries/getPollItem.xml new file mode 100644 index 000000000..fb7883511 --- /dev/null +++ b/modules/poll/queries/getPollItem.xml @@ -0,0 +1,12 @@ + + +
    + + + + + + + + + diff --git a/modules/poll/queries/getPollList.xml b/modules/poll/queries/getPollList.xml new file mode 100644 index 000000000..1e7bba724 --- /dev/null +++ b/modules/poll/queries/getPollList.xml @@ -0,0 +1,19 @@ + + +
    + + + + + + + + + + + + + + + + diff --git a/modules/poll/queries/getPollLog.xml b/modules/poll/queries/getPollLog.xml new file mode 100644 index 000000000..91587dc3b --- /dev/null +++ b/modules/poll/queries/getPollLog.xml @@ -0,0 +1,13 @@ + + +
    + + + + + + + + + + diff --git a/modules/poll/queries/getPollTitle.xml b/modules/poll/queries/getPollTitle.xml new file mode 100644 index 000000000..5ce892d44 --- /dev/null +++ b/modules/poll/queries/getPollTitle.xml @@ -0,0 +1,12 @@ + + +
    + + + + + + + + + diff --git a/modules/poll/queries/insertPoll.xml b/modules/poll/queries/insertPoll.xml new file mode 100644 index 000000000..c75bfc37a --- /dev/null +++ b/modules/poll/queries/insertPoll.xml @@ -0,0 +1,15 @@ + + +
    + + + + + + + + + + + + diff --git a/modules/poll/queries/insertPollItem.xml b/modules/poll/queries/insertPollItem.xml new file mode 100644 index 000000000..d2fc3c24f --- /dev/null +++ b/modules/poll/queries/insertPollItem.xml @@ -0,0 +1,13 @@ + + +
    + + + + + + + + + + diff --git a/modules/poll/queries/insertPollLog.xml b/modules/poll/queries/insertPollLog.xml new file mode 100644 index 000000000..00a008d8b --- /dev/null +++ b/modules/poll/queries/insertPollLog.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/poll/queries/insertPollTitle.xml b/modules/poll/queries/insertPollTitle.xml new file mode 100644 index 000000000..5a2bf83e2 --- /dev/null +++ b/modules/poll/queries/insertPollTitle.xml @@ -0,0 +1,17 @@ + + +
    + + + + + + + + + + + + + + diff --git a/modules/poll/queries/updatePoll.xml b/modules/poll/queries/updatePoll.xml new file mode 100644 index 000000000..1ed33b923 --- /dev/null +++ b/modules/poll/queries/updatePoll.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/poll/queries/updatePollItems.xml b/modules/poll/queries/updatePollItems.xml new file mode 100644 index 000000000..61f1aa361 --- /dev/null +++ b/modules/poll/queries/updatePollItems.xml @@ -0,0 +1,12 @@ + + +
    + + + + + + + + + diff --git a/modules/poll/queries/updatePollTitle.xml b/modules/poll/queries/updatePollTitle.xml new file mode 100644 index 000000000..f8034ed3a --- /dev/null +++ b/modules/poll/queries/updatePollTitle.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/poll/schemas/poll.xml b/modules/poll/schemas/poll.xml new file mode 100644 index 000000000..fd673fd2e --- /dev/null +++ b/modules/poll/schemas/poll.xml @@ -0,0 +1,10 @@ +
    + + + + + + + + +
    diff --git a/modules/poll/schemas/poll_item.xml b/modules/poll/schemas/poll_item.xml new file mode 100644 index 000000000..7961db71b --- /dev/null +++ b/modules/poll/schemas/poll_item.xml @@ -0,0 +1,8 @@ + + + + + + + +
    diff --git a/modules/poll/schemas/poll_log.xml b/modules/poll/schemas/poll_log.xml new file mode 100644 index 000000000..1cea74d8f --- /dev/null +++ b/modules/poll/schemas/poll_log.xml @@ -0,0 +1,6 @@ + + + + + +
    diff --git a/modules/poll/schemas/poll_title.xml b/modules/poll/schemas/poll_title.xml new file mode 100644 index 000000000..77c72a450 --- /dev/null +++ b/modules/poll/schemas/poll_title.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + +
    diff --git a/modules/poll/skins/default/css/poll.css b/modules/poll/skins/default/css/poll.css new file mode 100644 index 000000000..cfe61146b --- /dev/null +++ b/modules/poll/skins/default/css/poll.css @@ -0,0 +1,34 @@ +.poll_table { table-layout:fixed; width:100%; } + +.poll_table td.h { background:url(../images/top_bg.png) repeat-x left top; } +.poll_table td.title { height:28px; background:url(../images/top_title_bg.png) repeat-x left top; padding:0 20px 0 20px;color:#C3C3C4;} +.poll_table td.title strong { color:#FFFFFF; font-weight:bold; } + +.poll_table td.l { border-left:1px solid #E5E5E5; } +.poll_table td.r { border-right:1px solid #E5E5E5; } +.poll_table td.content { padding:18px 13px 18px 13px; } + +.poll_table td.poll_button { border:1px solid #E5E5E5; border-bottom:none; background-color:#F6F6F5; } +.poll_table td.poll_button div { padding:5px 0 2px 0; text-align:center;} +.poll_table td.b { background-color:#F6F6F5; height:7px; } +.poll_table td.b img { width:100%; height:6px; border-bottom:1px solid #E5E5E5; } +.poll_table td.bb { height:7px; } +.poll_table td.bb img { width:100%; height:6px; border-bottom:1px solid #E5E5E5; } + +.poll_table td.content div.title { color:#000000; background-color:#F5F5F5; border-top:2px solid #C1C0BD; border-bottom:2px solid #C1C0BD; font-weight:bold; padding:7px 0 7px 10px; margin-bottom:10px; } + +.poll_table td.content div.item_text { color:#636363; padding:0 10px 0 10px; margin-top:10px; } +.poll_table td.content div.item_text strong { font-weight:bold; color:#000000; font-family:돋움; font-size:12px; } + +.poll_table td.content table.item_bar_table { width:100%; table-layout:fixed; border-bottom:1px solid #EDEDED; margin-top:10px;} +.poll_table td.content table.noborder { border-bottom:none; margin-bottom:10px;} +.poll_table td.content table.item_bar_table td.bar { padding:0 0 5px 0; background:url(../images/back_bar.png) repeat-x left 4px;} +.poll_table td.content table.item_bar_table td.bar img { width:100%; height:6px; } +.poll_table td.content table.item_bar_table td.status { font-size:.9em; padding-bottom:5px; color:#636363; padding-left:15px; } +.poll_table td.content table.item_bar_table td.status strong { font-weight:bold; color:#58C011; } + +.poll_table td.content div.item { color:#636363; border-bottom:1px solid #EDEDED; padding:5px 0 8px 10px; margin-bottom:3px; } +.poll_table td.content div.noborder { border-bottom:none; margin-bottom:10px;} +.poll_table td.content div.checkcount { border-bottom:1px dashed #EDEDED; padding:0 0 8px 10px; margin-bottom:3px; text-align:right; color:#636363; } + + diff --git a/modules/poll/skins/default/filter/poll.xml b/modules/poll/skins/default/filter/poll.xml new file mode 100644 index 000000000..2639e3195 --- /dev/null +++ b/modules/poll/skins/default/filter/poll.xml @@ -0,0 +1,10 @@ + +
    + + + + + + + + diff --git a/modules/poll/skins/default/form.html b/modules/poll/skins/default/form.html new file mode 100644 index 000000000..4cdc7e7bf --- /dev/null +++ b/modules/poll/skins/default/form.html @@ -0,0 +1,78 @@ + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    lhblankrh
    + {$lang->poll_stop_date} : {zdate($poll->stop_date, "Y-m-d")} {zdate($poll->stop_date, "H:i")} +
    blank + + + + +
    A : {$val->title}
    + + +
    + {$lang->poll_checkcount} : {$val->checkcount} +
    + + + + {@ $_key = 0} + + {@$_idx = $poll->poll_srl.'_'.$poll_srl_index.'_'.$item_srl} + +
    + + + + + + +
    + {@ $_key++} + + + + + +
    blank
    lbblankrb
    + + + +
    diff --git a/modules/poll/skins/default/images/back_bar.png b/modules/poll/skins/default/images/back_bar.png new file mode 100755 index 000000000..8ef71686d Binary files /dev/null and b/modules/poll/skins/default/images/back_bar.png differ diff --git a/modules/poll/skins/default/images/blank.gif b/modules/poll/skins/default/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/modules/poll/skins/default/images/blank.gif differ diff --git a/modules/poll/skins/default/images/color_bar.png b/modules/poll/skins/default/images/color_bar.png new file mode 100755 index 000000000..2afe557c0 Binary files /dev/null and b/modules/poll/skins/default/images/color_bar.png differ diff --git a/modules/poll/skins/default/images/lb.png b/modules/poll/skins/default/images/lb.png new file mode 100755 index 000000000..0cc989c98 Binary files /dev/null and b/modules/poll/skins/default/images/lb.png differ diff --git a/modules/poll/skins/default/images/lh.png b/modules/poll/skins/default/images/lh.png new file mode 100755 index 000000000..a12dca5dc Binary files /dev/null and b/modules/poll/skins/default/images/lh.png differ diff --git a/modules/poll/skins/default/images/pipe.png b/modules/poll/skins/default/images/pipe.png new file mode 100755 index 000000000..d560aa240 Binary files /dev/null and b/modules/poll/skins/default/images/pipe.png differ diff --git a/modules/poll/skins/default/images/rb.png b/modules/poll/skins/default/images/rb.png new file mode 100755 index 000000000..d74208c12 Binary files /dev/null and b/modules/poll/skins/default/images/rb.png differ diff --git a/modules/poll/skins/default/images/rh.png b/modules/poll/skins/default/images/rh.png new file mode 100755 index 000000000..4e4924628 Binary files /dev/null and b/modules/poll/skins/default/images/rh.png differ diff --git a/modules/poll/skins/default/images/rlb.png b/modules/poll/skins/default/images/rlb.png new file mode 100755 index 000000000..95144eb49 Binary files /dev/null and b/modules/poll/skins/default/images/rlb.png differ diff --git a/modules/poll/skins/default/images/rrb.png b/modules/poll/skins/default/images/rrb.png new file mode 100755 index 000000000..791f763e5 Binary files /dev/null and b/modules/poll/skins/default/images/rrb.png differ diff --git a/modules/poll/skins/default/images/top_bg.png b/modules/poll/skins/default/images/top_bg.png new file mode 100755 index 000000000..00bfe3d56 Binary files /dev/null and b/modules/poll/skins/default/images/top_bg.png differ diff --git a/modules/poll/skins/default/images/top_title_bg.png b/modules/poll/skins/default/images/top_title_bg.png new file mode 100755 index 000000000..900ebbb22 Binary files /dev/null and b/modules/poll/skins/default/images/top_title_bg.png differ diff --git a/modules/poll/skins/default/js/poll.js b/modules/poll/skins/default/js/poll.js new file mode 100644 index 000000000..e497eee65 --- /dev/null +++ b/modules/poll/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/poll/skins/default/result.html b/modules/poll/skins/default/result.html new file mode 100644 index 000000000..1916cbd50 --- /dev/null +++ b/modules/poll/skins/default/result.html @@ -0,0 +1,60 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    lhblankrh
    +
    + {$lang->poll_stop_date} : {zdate($poll->stop_date, "Y-m-d")} {zdate($poll->stop_date, "H:i")} +
    +
    + {$lang->poll_join_count} : {number_format($poll->poll_count)} +
    +
    blank + + +
    {$val->title} ({$val->poll_count})
    + + {@$per = (int)(( $item->poll_count / $val->poll_count)*100) } + +
    + {$item_srl+1} {$item->title} +
    + + + + + + + + + + +
     bar{$item->poll_count} ({$per}%)
    + + + +
    blank
    lbblankrb
    + +
    diff --git a/modules/poll/skins/default/skin.xml b/modules/poll/skins/default/skin.xml new file mode 100644 index 000000000..b5102845d --- /dev/null +++ b/modules/poll/skins/default/skin.xml @@ -0,0 +1,25 @@ + + + 설문조사 기본 스킨 + 投票调查默认皮肤 + アンケート調査デフォルトスキン + Default Skin of Poll + + 제로 + zero + Zero + zero + 설문조사 기본 스킨 + 投票调查默认皮肤。 + アンケート調査デフォルトスキン + Default Skin of Poll + + + + 기본 + 默认 + デフォルト + Default + + + diff --git a/modules/poll/tpl/config.html b/modules/poll/tpl/config.html new file mode 100644 index 000000000..c9dea0067 --- /dev/null +++ b/modules/poll/tpl/config.html @@ -0,0 +1,37 @@ + + + + +
    + + + + + + + + + + + + +
    {$lang->skin} + +
    {$lang->colorset} + +
    + + +
    + +
    + +
    diff --git a/modules/poll/tpl/css/poll.css b/modules/poll/tpl/css/poll.css new file mode 100644 index 000000000..8146e0982 --- /dev/null +++ b/modules/poll/tpl/css/poll.css @@ -0,0 +1,82 @@ +.poll_box { + border:3px solid #555555; + background-color:#EEEEEE; + margin:5px; + padding:8px 5px 8px 5px; + width:500px; +} + +.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/poll/tpl/filter/delete_checked.xml b/modules/poll/tpl/filter/delete_checked.xml new file mode 100644 index 000000000..a0d39d59a --- /dev/null +++ b/modules/poll/tpl/filter/delete_checked.xml @@ -0,0 +1,12 @@ + +
    + + + + + + + + + +
    diff --git a/modules/poll/tpl/filter/insert_config.xml b/modules/poll/tpl/filter/insert_config.xml new file mode 100644 index 000000000..b0ae22b35 --- /dev/null +++ b/modules/poll/tpl/filter/insert_config.xml @@ -0,0 +1,11 @@ + +
    + + + + + + + + +
    diff --git a/modules/poll/tpl/header.html b/modules/poll/tpl/header.html new file mode 100644 index 000000000..1eff94013 --- /dev/null +++ b/modules/poll/tpl/header.html @@ -0,0 +1,10 @@ +

    {$lang->poll} {$lang->cmd_management}

    + + +
    + +
    + diff --git a/modules/poll/tpl/images/blank.gif b/modules/poll/tpl/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/modules/poll/tpl/images/blank.gif differ diff --git a/modules/poll/tpl/js/poll_admin.js b/modules/poll/tpl/js/poll_admin.js new file mode 100644 index 000000000..32003968c --- /dev/null +++ b/modules/poll/tpl/js/poll_admin.js @@ -0,0 +1,38 @@ +/** + * @file modules/poll/js/poll_admin.js + * @author zero (zero@nzeo.com) + * @brief poll 모듈의 관리자용 javascript + **/ + +/* 위젯 코드 생성시 스킨을 고르면 컬러셋의 정보를 표시 */ +function doDisplaySkinColorset(sel, colorset) { + var skin = sel.options[sel.selectedIndex].value; + + var params = new Array(); + params["skin"] = skin; + params["colorset"] = colorset; + + var response_tags = new Array("error","message","colorset_list"); + + exec_xml("poll", "getPollGetColorsetList", params, completeGetSkinColorset, response_tags, params); +} + +/* 서버에서 받아온 컬러셋을 표시 */ +function completeGetSkinColorset(ret_obj, response_tags, params, fo_obj) { + var sel = xGetElementById("fo_poll").poll_colorset; + var length = sel.options.length; + var selected_colorset = params["colorset"]; + for(var i=0;i + + + + +
    + Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)} +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->no}{$lang->title}{$lang->poll_checkcount}{$lang->poll_join_count}{$lang->regdate}{$lang->cmd_view}
    {$no}{htmlspecialchars($val->title)}{$val->checkcount}{$val->poll_count}{zdate($val->regdate,"Y-m-d H:i")}{$lang->cmd_view}
    + +
    + + +
    + +
    + + + + + +
    + + +
    + + + + {$lang->cmd_cancel} +
    +
    diff --git a/modules/poll/tpl/result.html b/modules/poll/tpl/result.html new file mode 100644 index 000000000..6009c45d2 --- /dev/null +++ b/modules/poll/tpl/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}%) +
    +
    + +
    bar
    + +
    bar
    + +
    + + +
    + + + +
    diff --git a/modules/rss/conf/info.xml b/modules/rss/conf/info.xml new file mode 100644 index 000000000..18ea5072f --- /dev/null +++ b/modules/rss/conf/info.xml @@ -0,0 +1,17 @@ + + + RSS + RSS + RSS + RSS + + 제로 + zero + Zero + zero + RSS 출력을 담당하는 모듈 + 负责输出RSS的模块。 + RSS出力を担うモジュールです。 + This modules is for printing RSS. + + diff --git a/modules/rss/conf/module.xml b/modules/rss/conf/module.xml new file mode 100644 index 000000000..0d07688f9 --- /dev/null +++ b/modules/rss/conf/module.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/modules/rss/lang/en.lang.php b/modules/rss/lang/en.lang.php new file mode 100644 index 000000000..9e7530a98 --- /dev/null +++ b/modules/rss/lang/en.lang.php @@ -0,0 +1,18 @@ + + * @brief English language pack (basic) + **/ + + // general words + $lang->rss_disable = "Disable RSS"; + $lang->rss_type = "RSS feed type"; + + // for description + $lang->about_rss_disable = "If checked, RSS will be disabled."; + $lang->about_rss_type = "You can assign RSS feed type."; + + // for error message + $lang->msg_rss_is_disabled = "RSS function is disabled."; +?> diff --git a/modules/rss/lang/jp.lang.php b/modules/rss/lang/jp.lang.php new file mode 100644 index 000000000..ef06e15aa --- /dev/null +++ b/modules/rss/lang/jp.lang.php @@ -0,0 +1,18 @@ + 翻訳:RisaPapa + * @brief 日本語言語パッケージ(基本的な内容のみ) + **/ + + // 一般用語 + $lang->rss_disable = "RSS機能ロック"; + $lang->rss_type = "出力するRSSタイプ"; + + // 説明文 + $lang->about_rss_disable = "チェックするとRSSの出力を行いません。"; + $lang->about_rss_type = "出力するRSSタイプを指定することができます。"; + + // エラーメッセージ + $lang->msg_rss_is_disabled = "RSS機能がロックされています。"; +?> diff --git a/modules/rss/lang/ko.lang.php b/modules/rss/lang/ko.lang.php new file mode 100644 index 000000000..a1b9529a1 --- /dev/null +++ b/modules/rss/lang/ko.lang.php @@ -0,0 +1,18 @@ + + * @brief 한국어 언어팩 (기본적인 내용만 수록) + **/ + + // 일반 단어들 + $lang->rss_disable = "RSS 끄기"; + $lang->rss_type = "출력할 RSS 형식"; + + // 설명문 + $lang->about_rss_disable = "체크하시면 RSS 출력을 하지 않습니다"; + $lang->about_rss_type = "출력하실 RSS 형식을 지정하실 수 있습니다"; + + // 에러 메세지들 + $lang->msg_rss_is_disabled = "RSS 기능이 잠겨 있습니다"; +?> diff --git a/modules/rss/lang/zh-CN.lang.php b/modules/rss/lang/zh-CN.lang.php new file mode 100644 index 000000000..9a678270f --- /dev/null +++ b/modules/rss/lang/zh-CN.lang.php @@ -0,0 +1,18 @@ + + * @brief 简体中文语言包 (只收录基本内容) + **/ + + // 一般单词 + $lang->rss_disable = "关闭RSS"; + $lang->rss_type = "将显示的RSS形式"; + + // 说明文 + $lang->about_rss_disable = "选此项不显示RSS。"; + $lang->about_rss_type = "可以指定要显示的RSS形式。"; + + // 错误提示 + $lang->msg_rss_is_disabled = "RSS功能处于锁定状态。"; +?> diff --git a/modules/rss/rss.class.php b/modules/rss/rss.class.php new file mode 100644 index 000000000..165bea8ef --- /dev/null +++ b/modules/rss/rss.class.php @@ -0,0 +1,36 @@ +insertActionForward('rss', 'view', 'rss'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + + } +?> diff --git a/modules/rss/rss.view.php b/modules/rss/rss.view.php new file mode 100644 index 000000000..66d0b480b --- /dev/null +++ b/modules/rss/rss.view.php @@ -0,0 +1,142 @@ +100) $list_count = 20; + + $start_date = Context::get('start_date'); ///< 시작 일자, 없으면 무시 + if(strlen($start_date)!=14 || !ereg("^([0-9]){14}$", $start_date) ) unset($start_date); + + $end_date = Context::get('end_date'); ///< 종료 일자, 없으면 무시 + if(strlen($end_date)!=14 || !ereg("^([0-9]){14}$", $end_date) ) unset($end_date); + + /** + * 요청된 모듈 혹은 전체 모듈의 정보를 구하고 open_rss의 값을 체크 + **/ + $oModuleModel = &getModel('module'); + $mid_list = array(); + + // mid값이 없으면 전체 mid중 open_rss == 'Y|H'인 걸 고름 + if(!$mid) { + $args->open_rss = "'Y','H'"; + $module_list = $oModuleModel->getMidList($args); + if(!$module_list) return $this->dispError(); + + // 대상 모듈을 정리함 + $module_srl_list = array(); + foreach($module_list as $mid => $val) { + $module_srl_list[] = $val->module_srl; + $mid_list[$val->module_srl] = $val; + } + if(!count($module_srl_list)) return $this->dispError(); + unset($output); + unset($args); + + $module_srl = implode(',',$module_srl_list); + + // 있으면 해당 모듈의 정보를 구함 + } else { + // 모듈의 설정 정보를 받아옴 (module model 객체를 이용) + $module_info = $oModuleModel->getModuleInfoByMid($mid); + if($module_info->mid != $mid) return $this->dispError(); + + // RSS 비활성화 되었는지 체크하여 비활성화시 에러 출력 + if($module_info->open_rss == 'N') return $this->dispError(); + + $module_srl = $module_info->module_srl; + $mid_list[$module_info->module_srl] = $module_info; + + unset($args); + } + + /** + * 출력할 컨텐츠 추출을 위한 인자 정리 + **/ + $args->module_srl = $module_srl; + $args->page = $page; + $args->list_count = $list_count; + $args->page_count = 10; + if($start_date) $args->start_date = $start_date; + if($end_date) $args->end_date = $end_date; + + $args->sort_index = 'last_update'; + $args->order_type = 'desc'; + + // 대상 문서들을 가져옴 + $oDocumentModel = &getModel('document'); + $output = $oDocumentModel->getDocumentList($args); + $document_list = $output->data; + + // rss 제목 및 정보등을 추출 + if($this->mid) { + $info->title = Context::getBrowserTitle(); + $info->description = $this->module_info->description; + $info->link = getUrl('','mid',Context::get('mid')); + } else { + $info->title = $info->link = Context::getRequestUri(); + } + $info->total_count = $output->total_count; + $info->total_page = $output->total_page; + $info->date = gmdate("D, d M Y H:i:s"); + $info->language = Context::getLangType(); + + // RSS 출력물에서 사용될 변수 세팅 + Context::set('info', $info); + Context::set('mid_list', $mid_list); + Context::set('document_list', $document_list); + + // 결과 출력을 XMLRPC로 강제 지정 + Context::setResponseMethod("XMLRPC"); + + // 템플릿 파일 지정 + $this->setTemplatePath($this->module_path.'tpl/'); + + if($args->start_date || $args->end_date) $this->setTemplateFile('xe_rss'); + else $this->setTemplateFile('rss20'); + } + + /** + * @brief 에러 출력 + **/ + function dispError() { + + // 결과 출력을 XMLRPC로 강제 지정 + Context::setResponseMethod("XMLRPC"); + + // 출력 메세지 작성 + Context::set('error', -1); + Context::set('message', Context::getLang('msg_rss_is_disabled') ); + + // 템플릿 파일 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile("error"); + } + } +?> diff --git a/modules/rss/tpl/error.html b/modules/rss/tpl/error.html new file mode 100644 index 000000000..9cd7c2cbc --- /dev/null +++ b/modules/rss/tpl/error.html @@ -0,0 +1,5 @@ +{''} + + {$error} + + diff --git a/modules/rss/tpl/filter/insert_config.xml b/modules/rss/tpl/filter/insert_config.xml new file mode 100644 index 000000000..f2b42f8c7 --- /dev/null +++ b/modules/rss/tpl/filter/insert_config.xml @@ -0,0 +1,7 @@ + +
    + + + + + diff --git a/modules/rss/tpl/index.html b/modules/rss/tpl/index.html new file mode 100644 index 000000000..19a485014 --- /dev/null +++ b/modules/rss/tpl/index.html @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + +
    {$lang->rss_disable}rss_disable=="Y")-->checked="checked" /> +
    {$lang->about_rss_disable}
    {$lang->rss_type} + +
    {$lang->about_rss_type}
    + + +
    +
    diff --git a/modules/rss/tpl/rss10.html b/modules/rss/tpl/rss10.html new file mode 100644 index 000000000..e4c0ee4fa --- /dev/null +++ b/modules/rss/tpl/rss10.html @@ -0,0 +1,27 @@ +{''} + + + + <![CDATA[{$info->title}]]> + link}]]> + description}]]> + + + + + + + + {$info->date} + {$info->language} + {$info->total_count} + + + + <![CDATA[{$item->title}]]> + link}]]> + description}]]> + {$item->date} + + + diff --git a/modules/rss/tpl/rss20.html b/modules/rss/tpl/rss20.html new file mode 100644 index 000000000..c9a00a067 --- /dev/null +++ b/modules/rss/tpl/rss20.html @@ -0,0 +1,25 @@ +{''} + + + + <![CDATA[{$info->title}]]> + link}]]> + description}]]> + {$info->language} + {$info->date} + {$info->total_count} + + + <![CDATA[{$oDocument->getTitleText()}]]> + getNickName()}]]> + getPermanentUrl()}]]> + + getContent(false)}]]> + + getContentText(100)}]]> + + {$oDocument->getRegdateGM()} + + + + diff --git a/modules/rss/tpl/xe_rss.html b/modules/rss/tpl/xe_rss.html new file mode 100644 index 000000000..2d12dbc94 --- /dev/null +++ b/modules/rss/tpl/xe_rss.html @@ -0,0 +1,30 @@ +{''} + + + + <![CDATA[{$info->title}]]> + link}]]> + description}]]> + {$info->language} + {$info->date} + {$info->total_count} + {$info->total_page} + + + <![CDATA[{$oDocument->getTitleText()}]]> + getNickName()}]]> + getPermanentUrl()}]]> + + getContent(false)}]]> + + getContentText(100)}]]> + + get('tags')}]]> + {$oDocument->getCommentCount()} + {$oDocument->getTrackbackCount()} + {$oDocument->getRegdateGM()} + {$oDocument->getUpdateGM()} + + + + diff --git a/modules/spamfilter/conf/info.xml b/modules/spamfilter/conf/info.xml new file mode 100644 index 000000000..fc1122c27 --- /dev/null +++ b/modules/spamfilter/conf/info.xml @@ -0,0 +1,17 @@ + + + 스팸필터 + 垃圾过滤 + Spam Filter + スパムフィルター + + 제로 + zero + zero + Zero + 제로보드 XE의 기본 스팸필터입니다. + Zeroboard XE的基本垃圾过滤模块。 + A default spam filter of Zeroboard XE. + ゼロボードXEのスパムフィルターです。 + + diff --git a/modules/spamfilter/conf/module.xml b/modules/spamfilter/conf/module.xml new file mode 100644 index 000000000..e16baa44e --- /dev/null +++ b/modules/spamfilter/conf/module.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/modules/spamfilter/lang/en.lang.php b/modules/spamfilter/lang/en.lang.php new file mode 100644 index 000000000..8aac16027 --- /dev/null +++ b/modules/spamfilter/lang/en.lang.php @@ -0,0 +1,32 @@ + + * @brief English Language Pack (basic) + **/ + + // action related + $lang->cmd_denied_ip = "Black listed IPs"; + $lang->cmd_denied_word = "Black listed words"; + + // general word + $lang->spamfilter = "Spam filter"; + $lang->denied_ip = "IP blacklist"; + $lang->interval = "Interval for spam process"; + $lang->limit_count = "No. of limit"; + $lang->check_trackback = "Check trackback"; + $lang->word = "word"; + + // for description word + $lang->about_interval = "It is a time setting to block posting an article within the time."; + $lang->about_limit_count = "If you try to post an article more times over the limit within the setted time,\n it will be recognized as a spam, and your IP will be blocked."; + $lang->about_denied_ip = "Using *, You can block all IP addresses of 127.0.0.* patterned address."; + $lang->about_denied_word = "When you add a word to Black Listed Words,\n you can block an article contained the word not to be posted."; + $lang->about_check_trackback = "Only the trackback by one IP per an article could be allowed."; + + // to post a message + $lang->msg_alert_limited_by_config = 'Posting an article within %s second is not allowed.\n If you try it again and again, your IP may be listed as a IP blacklist.'; + $lang->msg_alert_denied_word = 'The word "%s" is not allowed to be used.'; + $lang->msg_alert_registered_denied_ip = 'Your IP was listed as a IP blacklist,\n so you may have limitations on normal use of this site.\n If you have any questions on that matter, please contact to the site administrator.'; + $lang->msg_alert_trackback_denied = 'Only one trackback per an article is allowed.'; +?> diff --git a/modules/spamfilter/lang/jp.lang.php b/modules/spamfilter/lang/jp.lang.php new file mode 100644 index 000000000..af2be1356 --- /dev/null +++ b/modules/spamfilter/lang/jp.lang.php @@ -0,0 +1,32 @@ + 翻訳:RisaPapa + * @brief 日本語言語パッケージ(基本的な内容のみ) + **/ + + // action関連 + $lang->cmd_denied_ip = "禁止IPリスト"; + $lang->cmd_denied_word = "禁止ワードリスト"; + + // 一般用語 + $lang->spamfilter = "スパムフィルター"; + $lang->denied_ip = "禁止IP"; + $lang->interval = "スパム処理間隔"; + $lang->limit_count = "制限数"; + $lang->check_trackback = "トラックバック検査"; + $lang->word = "ワード"; + + // 説明文 + $lang->about_interval = "指定された時間内の書き込みが行えないようにします。"; + $lang->about_limit_count = "指定された時間内に制限数を超える書き込みが行われるとスパムとして認識し、該当するIPを禁止します。"; + $lang->about_denied_ip = "「127.0.0.* 」のように「*」で、「127.0.0」以下ののIP帯域をすべて禁止することができます。"; + $lang->about_denied_word = "禁止ワードとして登録されると該当するワードが存在する書き込みを禁することができます。"; + $lang->about_check_trackback = "一つのIPからのみトラックバックを受信するようにします。"; + + // メッセージ出力用 + $lang->msg_alert_limited_by_config = '%s秒以内の書き込みは禁止されます。続けて行うとスパムとして認識され、禁止IPに登録されます。'; + $lang->msg_alert_denied_word = '"%s"は使用が禁止されたワードです。'; + $lang->msg_alert_registered_denied_ip = '禁止IPに登録され、サイト内で正常な活動が制限されています。管理者にお問い合わせください。'; + $lang->msg_alert_trackback_denied = '一つの書き込みには、1つのトラックバックしか受け取れません。'; +?> diff --git a/modules/spamfilter/lang/ko.lang.php b/modules/spamfilter/lang/ko.lang.php new file mode 100644 index 000000000..8b3260037 --- /dev/null +++ b/modules/spamfilter/lang/ko.lang.php @@ -0,0 +1,32 @@ + + * @brief 한국어 언어팩 (기본적인 내용만 수록) + **/ + + // action 관련 + $lang->cmd_denied_ip = "금지IP 목록"; + $lang->cmd_denied_word = "금지단어 목록"; + + // 일반 단어 + $lang->spamfilter = "스팸필터"; + $lang->denied_ip = "금지 IP"; + $lang->interval = "스팸 처리 간격"; + $lang->limit_count = "제한수"; + $lang->check_trackback = "트랙백 검사"; + $lang->word = "단어"; + + // 설명문 + $lang->about_interval = "지정된 시간내에 글을 등록하지 못하게 합니다"; + $lang->about_limit_count = "지정된 시간내에 제한수를 넘겨서 글 작성을 시도하면 스팸으로 인식, IP를 금지 시킵니다"; + $lang->about_denied_ip = "127.0.0.* 와 같이 * 로 정해진 패턴의 IP 대역을 모두 금지 시킬 수 있습니다"; + $lang->about_denied_word = "금지 단어로 등록되면 해당 단어가 있는 글은 등록을 금지 시킬 수 있습니다"; + $lang->about_check_trackback = "한 글에 한 IP에만 트랙백을 허용할 수 있습니다"; + + // 메세지 출력용 + $lang->msg_alert_limited_by_config = '%s 초 이내에 글 작성은 금지 됩니다. 계속 시도하시면 금지 IP에 등록되실 수 있습니다'; + $lang->msg_alert_denied_word = '"%s"는 사용 금지된 단어입니다'; + $lang->msg_alert_registered_denied_ip = '금지 IP에 등록되셔서 정상적인 활동에 제한을 받게 되셨습니다. 문의는 사이트 관리자에게 해주시기 바랍니다'; + $lang->msg_alert_trackback_denied = '한 글에는 하나의 트랙백만 허용이 됩니다'; +?> diff --git a/modules/spamfilter/lang/zh-CN.lang.php b/modules/spamfilter/lang/zh-CN.lang.php new file mode 100644 index 000000000..167cd2ee7 --- /dev/null +++ b/modules/spamfilter/lang/zh-CN.lang.php @@ -0,0 +1,32 @@ + + * @brief 简体中文语言包(只收录基本内容) + **/ + + // action 相关 + $lang->cmd_denied_ip = "禁止IP 目录"; + $lang->cmd_denied_word = "敏感词语目录"; + + // 一般用语 + $lang->spamfilter = "垃圾过滤"; + $lang->denied_ip = "禁止 IP"; + $lang->interval = "处理垃圾间隔"; + $lang->limit_count = "限制数"; + $lang->check_trackback = "引用检查"; + $lang->word = "词语"; + + // 说明文 + $lang->about_interval = "指定的时间内禁止发表新主题。"; + $lang->about_limit_count = "在指定的时间内发表的新主题超过限制数时,系统默认为是垃圾主题,将自动禁止对方的IP。"; + $lang->about_denied_ip = "禁止 IP可以使用通配符。(如:如 \"127.0.*.*\")"; + $lang->about_denied_word = "登录为敏感词,可以对要发表的主题进行检测并禁止让包含敏感词的主题发表。"; + $lang->about_check_trackback = "在一个主题中只对一个IP允许引用。"; + + // 提示信息 + $lang->msg_alert_limited_by_config = '%s秒之内不能连续发表新主题。如您继续再试系统会自动禁止您的IP。'; + $lang->msg_alert_denied_word = '"%s"是敏感语!'; + $lang->msg_alert_registered_denied_ip = '您的IP已被禁止,详情请联系网站管理员。'; + $lang->msg_alert_trackback_denied = '一个主题只允许一个引用。'; +?> diff --git a/modules/spamfilter/queries/deleteDeniedIP.xml b/modules/spamfilter/queries/deleteDeniedIP.xml new file mode 100644 index 000000000..55171ca25 --- /dev/null +++ b/modules/spamfilter/queries/deleteDeniedIP.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/spamfilter/queries/deleteDeniedWord.xml b/modules/spamfilter/queries/deleteDeniedWord.xml new file mode 100644 index 000000000..b20002cf1 --- /dev/null +++ b/modules/spamfilter/queries/deleteDeniedWord.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/spamfilter/queries/getDeniedIPList.xml b/modules/spamfilter/queries/getDeniedIPList.xml new file mode 100644 index 000000000..30d9a3575 --- /dev/null +++ b/modules/spamfilter/queries/getDeniedIPList.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/spamfilter/queries/getDeniedWordList.xml b/modules/spamfilter/queries/getDeniedWordList.xml new file mode 100644 index 000000000..b9afe4fb6 --- /dev/null +++ b/modules/spamfilter/queries/getDeniedWordList.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/spamfilter/queries/getLogCount.xml b/modules/spamfilter/queries/getLogCount.xml new file mode 100644 index 000000000..ec1b4bfad --- /dev/null +++ b/modules/spamfilter/queries/getLogCount.xml @@ -0,0 +1,12 @@ + + +
    + + + + + + + + + diff --git a/modules/spamfilter/queries/insertDeniedIP.xml b/modules/spamfilter/queries/insertDeniedIP.xml new file mode 100644 index 000000000..6fcdf5a7a --- /dev/null +++ b/modules/spamfilter/queries/insertDeniedIP.xml @@ -0,0 +1,9 @@ + + +
    + + + + + + diff --git a/modules/spamfilter/queries/insertDeniedWord.xml b/modules/spamfilter/queries/insertDeniedWord.xml new file mode 100644 index 000000000..0638bbff6 --- /dev/null +++ b/modules/spamfilter/queries/insertDeniedWord.xml @@ -0,0 +1,9 @@ + + +
    + + + + + + diff --git a/modules/spamfilter/queries/insertLog.xml b/modules/spamfilter/queries/insertLog.xml new file mode 100644 index 000000000..e6a684fe1 --- /dev/null +++ b/modules/spamfilter/queries/insertLog.xml @@ -0,0 +1,10 @@ + + +
    + + + + + + + diff --git a/modules/spamfilter/queries/isDeniedIP.xml b/modules/spamfilter/queries/isDeniedIP.xml new file mode 100644 index 000000000..272537e10 --- /dev/null +++ b/modules/spamfilter/queries/isDeniedIP.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/spamfilter/schemas/spamfilter_denied_ip.xml b/modules/spamfilter/schemas/spamfilter_denied_ip.xml new file mode 100644 index 000000000..f19b3e87e --- /dev/null +++ b/modules/spamfilter/schemas/spamfilter_denied_ip.xml @@ -0,0 +1,4 @@ +
    + + +
    diff --git a/modules/spamfilter/schemas/spamfilter_denied_word.xml b/modules/spamfilter/schemas/spamfilter_denied_word.xml new file mode 100644 index 000000000..da9b8d9a3 --- /dev/null +++ b/modules/spamfilter/schemas/spamfilter_denied_word.xml @@ -0,0 +1,4 @@ + + + +
    diff --git a/modules/spamfilter/schemas/spamfilter_log.xml b/modules/spamfilter/schemas/spamfilter_log.xml new file mode 100644 index 000000000..4c4e7f18a --- /dev/null +++ b/modules/spamfilter/schemas/spamfilter_log.xml @@ -0,0 +1,5 @@ + + + + +
    diff --git a/modules/spamfilter/spamfilter.admin.controller.php b/modules/spamfilter/spamfilter.admin.controller.php new file mode 100644 index 000000000..40a21f2a4 --- /dev/null +++ b/modules/spamfilter/spamfilter.admin.controller.php @@ -0,0 +1,98 @@ +check_trackback!='Y') $args->check_trackback = 'N'; + + // module Controller 객체 생성하여 입력 + $oModuleController = &getController('module'); + $output = $oModuleController->insertModuleConfig('spamfilter',$args); + return $output; + } + + /** + * @brief 금지 IP등록 + **/ + function procSpamfilterAdminInsertDeniedIP() { + $ipaddress = Context::get('ipaddress'); + + $oSpamfilterController = &getController('spamfilter'); + return $oSpamfilterController->insertIP($ipaddress); + } + + /** + * @brief 금지 IP삭제 + **/ + function procSpamfilterAdminDeleteDeniedIP() { + $ipaddress = Context::get('ipaddress'); + return $this->deleteIP($ipaddress); + } + + /** + * @brief 금지 Word등록 + **/ + function procSpamfilterAdminInsertDeniedWord() { + $word = Context::get('word'); + return $this->insertWord($word); + } + + /** + * @brief 금지 Word삭제 + **/ + function procSpamfilterAdminDeleteDeniedWord() { + $word = Context::get('word'); + return $this->deleteWord($word); + } + + /** + * @brief IP 제거 + * 스패머로 등록된 IP를 제거 + **/ + function deleteIP($ipaddress) { + if(!$ipaddress) return; + + $args->ipaddress = $ipaddress; + return executeQuery('spamfilter.deleteDeniedIP', $args); + } + + /** + * @brief 스팸단어 등록 + * 등록된 단어가 포함된 글은 스팸글로 간주 + **/ + function insertWord($word) { + if(!$word) return; + + $args->word = $word; + return executeQuery('spamfilter.insertDeniedWord', $args); + } + + /** + * @brief 스팸단어 제거 + * 스팸 단어로 등록된 단어 제거 + **/ + function deleteWord($word) { + if(!$word) return; + + $args->word = $word; + return executeQuery('spamfilter.deleteDeniedWord', $args); + } + + } +?> diff --git a/modules/spamfilter/spamfilter.admin.view.php b/modules/spamfilter/spamfilter.admin.view.php new file mode 100644 index 000000000..c59a1b3ea --- /dev/null +++ b/modules/spamfilter/spamfilter.admin.view.php @@ -0,0 +1,59 @@ +setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 스팸필터의 설정 화면 + **/ + function dispSpamfilterAdminConfig() { + // 설정 정보를 받아옴 (module model 객체를 이용) + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('spamfilter'); + Context::set('config',$config); + + // 템플릿 파일 지정 + $this->setTemplateFile('index'); + } + + /** + * @brief 금지 목록 출력 + **/ + function dispSpamfilterAdminDeniedIPList() { + // 등록된 금지 IP 목록을 가져옴 + $oSpamFilterModel = &getModel('spamfilter'); + $ip_list = $oSpamFilterModel->getDeniedIPList(); + + Context::set('ip_list', $ip_list); + + // 템플릿 파일 지정 + $this->setTemplateFile('denied_ip_list'); + } + + /** + * @brief 금지 목록 출력 + **/ + function dispSpamfilterAdminDeniedWordList() { + // 등록된 금지 Word 목록을 가져옴 + $oSpamFilterModel = &getModel('spamfilter'); + $word_list = $oSpamFilterModel->getDeniedWordList(); + + Context::set('word_list', $word_list); + + // 템플릿 파일 지정 + $this->setTemplateFile('denied_word_list'); + } + } +?> diff --git a/modules/spamfilter/spamfilter.class.php b/modules/spamfilter/spamfilter.class.php new file mode 100644 index 000000000..e3d68f5d0 --- /dev/null +++ b/modules/spamfilter/spamfilter.class.php @@ -0,0 +1,38 @@ +insertActionForward('spamfilter', 'view', 'dispSpamfilterAdminConfig'); + $oModuleController->insertActionForward('spamfilter', 'view', 'dispSpamfilterAdminDeniedIPList'); + $oModuleController->insertActionForward('spamfilter', 'view', 'dispSpamfilterAdminDeniedWordList'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + + } +?> diff --git a/modules/spamfilter/spamfilter.controller.php b/modules/spamfilter/spamfilter.controller.php new file mode 100644 index 000000000..0028d25e0 --- /dev/null +++ b/modules/spamfilter/spamfilter.controller.php @@ -0,0 +1,35 @@ +ipaddress = $ipaddress; + return executeQuery('spamfilter.insertDeniedIP', $args); + } + + /** + * @brief 로그 등록 + * 현 접속 IP를 로그에 등록, 로그의 간격이 특정 시간 이내일 경우 도배로 간주하여 + * 스패머로 등록할 수 있음 + **/ + function insertLog() { + $output = executeQuery('spamfilter.insertLog'); + return $output; + } + } +?> diff --git a/modules/spamfilter/spamfilter.model.php b/modules/spamfilter/spamfilter.model.php new file mode 100644 index 000000000..97dd2a65f --- /dev/null +++ b/modules/spamfilter/spamfilter.model.php @@ -0,0 +1,73 @@ +getModuleConfig('spamfilter'); + } + + /** + * @brief 등록된 금지 IP의 목록을 return + **/ + function getDeniedIPList() { + $args->sort_index = "regdate"; + $args->page = Context::get('page')?Context::get('page'):1; + $output = executeQuery('spamfilter.getDeniedIPList', $args); + if(!$output->data) return; + if(!is_array($output->data)) return array($output->data); + return $output->data; + } + + /** + * @brief 인자로 넘겨진 ipaddress가 금지 ip인지 체크하여 return + **/ + function isDeniedIP($ipaddress) { + $args->ipaddress = $ipaddress; + $output = executeQuery('spamfilter.isDeniedIP', $args); + if($output->data->count>0) return true; + return false; + } + + /** + * @brief 등록된 금지 Word 의 목록을 return + **/ + function getDeniedWordList() { + $args->sort_index = "regdate"; + $output = executeQuery('spamfilter.getDeniedWordList', $args); + if(!$output->data) return; + if(!is_array($output->data)) return array($output->data); + return $output->data; + } + + /** + * @brief 지정된 IPaddress의 특정 시간대 내의 로그 수를 return + **/ + function getLogCount($time = 60, $ipaddress='') { + if(!$ipaddress) $ipaddress = $_SERVER['REMOTE_ADDR']; + + $args->ipaddress = $ipaddress; + $args->regdate = date("YmdHis", time()-$time); + $output = executeQuery('spamfilter.getLogCount', $args); + $count = $output->data->count; + return $count; + } + + + } +?> diff --git a/modules/spamfilter/tpl/denied_ip_list.html b/modules/spamfilter/tpl/denied_ip_list.html new file mode 100644 index 000000000..27cb7da42 --- /dev/null +++ b/modules/spamfilter/tpl/denied_ip_list.html @@ -0,0 +1,55 @@ + + + + + + +
    + Total {number_format($ip_list)} +
    + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +
    {$lang->no}{$lang->ipaddress}{$lang->regdate}{$lang->cmd_delete}
    {count($ip_list)-$no}{$val->ipaddress}{zdate($val->regdate,"Y-m-d")}{$lang->cmd_delete}
    + + +
    + + + + + + + +
    {$lang->denied_ip} + +

    {$lang->about_denied_ip}

    +
    + +
    + +
    +
    diff --git a/modules/spamfilter/tpl/denied_word_list.html b/modules/spamfilter/tpl/denied_word_list.html new file mode 100644 index 000000000..a7993c72b --- /dev/null +++ b/modules/spamfilter/tpl/denied_word_list.html @@ -0,0 +1,55 @@ + + + + + + +
    + Total {number_format($word_list)} +
    + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +
    {$lang->no}{$lang->word}{$lang->regdate}{$lang->cmd_delete}
    {count($word_list)-$no}{$val->word}{zdate($val->regdate,"Y-m-d")}{$lang->cmd_delete}
    + + +
    + + + + + + + +
    {$lang->word} + +

    {$lang->about_denied_word}

    +
    + +
    + +
    +
    diff --git a/modules/spamfilter/tpl/filter/delete_denied_ip.xml b/modules/spamfilter/tpl/filter/delete_denied_ip.xml new file mode 100644 index 000000000..199e2ae87 --- /dev/null +++ b/modules/spamfilter/tpl/filter/delete_denied_ip.xml @@ -0,0 +1,7 @@ + +
    + + + + + diff --git a/modules/spamfilter/tpl/filter/delete_denied_word.xml b/modules/spamfilter/tpl/filter/delete_denied_word.xml new file mode 100644 index 000000000..6502e5fa8 --- /dev/null +++ b/modules/spamfilter/tpl/filter/delete_denied_word.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/modules/spamfilter/tpl/filter/insert_config.xml b/modules/spamfilter/tpl/filter/insert_config.xml new file mode 100644 index 000000000..628f08995 --- /dev/null +++ b/modules/spamfilter/tpl/filter/insert_config.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/modules/spamfilter/tpl/filter/insert_denied_ip.xml b/modules/spamfilter/tpl/filter/insert_denied_ip.xml new file mode 100644 index 000000000..96470c0d4 --- /dev/null +++ b/modules/spamfilter/tpl/filter/insert_denied_ip.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + +
    diff --git a/modules/spamfilter/tpl/filter/insert_denied_word.xml b/modules/spamfilter/tpl/filter/insert_denied_word.xml new file mode 100644 index 000000000..059318a8c --- /dev/null +++ b/modules/spamfilter/tpl/filter/insert_denied_word.xml @@ -0,0 +1,12 @@ + +
    + + + + + + + + + +
    diff --git a/modules/spamfilter/tpl/header.html b/modules/spamfilter/tpl/header.html new file mode 100644 index 000000000..f69694b7c --- /dev/null +++ b/modules/spamfilter/tpl/header.html @@ -0,0 +1,11 @@ + + +

    {$lang->spamfilter} {$lang->cmd_management}

    + +
    + +
    diff --git a/modules/spamfilter/tpl/index.html b/modules/spamfilter/tpl/index.html new file mode 100644 index 000000000..9a76bf256 --- /dev/null +++ b/modules/spamfilter/tpl/index.html @@ -0,0 +1,36 @@ + + + + +
    + + + + + + + + + + + + + + +
    {$lang->interval} + {$lang->unit_sec} +

    {$lang->about_interval}

    +
    {$lang->limit_count} + +

    {$lang->about_limit_count}

    +
    {$lang->check_trackback} + check_trackback=='Y')-->checked="checked" /> + {$lang->about_check_trackback} +
    + + +
    + +
    + +
    diff --git a/modules/spamfilter/tpl/js/spamfilter_admin.js b/modules/spamfilter/tpl/js/spamfilter_admin.js new file mode 100644 index 000000000..46d48d8b5 --- /dev/null +++ b/modules/spamfilter/tpl/js/spamfilter_admin.js @@ -0,0 +1,17 @@ +/** + * @brief 금지 IP 삭제 + **/ +function doDeleteDeniedIP(ipaddress) { + var fo_obj = xGetElementById('fo_denied_ip'); + fo_obj.ipaddress.value = ipaddress; + procFilter(fo_obj, delete_denied_ip); +} + +/** + * @brief 금지 단어 삭제 + **/ +function doDeleteDeniedWord(word) { + var fo_obj = xGetElementById('fo_denied_word'); + fo_obj.word.value = word; + procFilter(fo_obj, delete_denied_word); +} diff --git a/modules/tag/conf/info.xml b/modules/tag/conf/info.xml new file mode 100644 index 000000000..16c3334ff --- /dev/null +++ b/modules/tag/conf/info.xml @@ -0,0 +1,17 @@ + + + 꼬리표 + 标签 + タグ + Tag + + 제로 + zero + Zero + Zero + 꼬리표 관리 모듈 + 标签管理模块。 + タグ管理用のモジュールです。 + Module for managing tags + + diff --git a/modules/tag/queries/deleteModuleTags.xml b/modules/tag/queries/deleteModuleTags.xml new file mode 100644 index 000000000..8d3a9753f --- /dev/null +++ b/modules/tag/queries/deleteModuleTags.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/tag/queries/deleteTag.xml b/modules/tag/queries/deleteTag.xml new file mode 100644 index 000000000..eb6d6341d --- /dev/null +++ b/modules/tag/queries/deleteTag.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/tag/queries/getTagList.xml b/modules/tag/queries/getTagList.xml new file mode 100644 index 000000000..1910fc3c8 --- /dev/null +++ b/modules/tag/queries/getTagList.xml @@ -0,0 +1,18 @@ + + +
    + + + + + + + + + + + + + + + diff --git a/modules/tag/queries/insertTag.xml b/modules/tag/queries/insertTag.xml new file mode 100644 index 000000000..ff96aee39 --- /dev/null +++ b/modules/tag/queries/insertTag.xml @@ -0,0 +1,12 @@ + + +
    + + + + + + + + + diff --git a/modules/tag/queries/updateTagModule.xml b/modules/tag/queries/updateTagModule.xml new file mode 100644 index 000000000..58c136020 --- /dev/null +++ b/modules/tag/queries/updateTagModule.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/tag/schemas/tags.xml b/modules/tag/schemas/tags.xml new file mode 100644 index 000000000..98253cb17 --- /dev/null +++ b/modules/tag/schemas/tags.xml @@ -0,0 +1,7 @@ +
    + + + + + +
    diff --git a/modules/tag/tag.admin.controller.php b/modules/tag/tag.admin.controller.php new file mode 100644 index 000000000..2e79178cf --- /dev/null +++ b/modules/tag/tag.admin.controller.php @@ -0,0 +1,17 @@ +module_srl = $module_srl; + return executeQuery('tag.deleteModuleTags', $args); + } + } +?> diff --git a/modules/tag/tag.class.php b/modules/tag/tag.class.php new file mode 100644 index 000000000..b8076b416 --- /dev/null +++ b/modules/tag/tag.class.php @@ -0,0 +1,32 @@ + diff --git a/modules/tag/tag.controller.php b/modules/tag/tag.controller.php new file mode 100644 index 000000000..444d7a005 --- /dev/null +++ b/modules/tag/tag.controller.php @@ -0,0 +1,57 @@ +deleteTag($document_srl); + if(!$tags) return; + + // tags변수 정리 + $tmp_tag_list = explode(',', $tags); + $tag_count = count($tmp_tag_list); + for($i=0;$i<$tag_count;$i++) { + $tag = trim($tmp_tag_list[$i]); + if(!$tag) continue; + $tag_list[] = $tag; + } + if(!count($tag_list)) return; + + // 다시 태그를 입력 + $args->module_srl = $module_srl; + $args->document_srl = $document_srl; + $tag_count = count($tag_list); + for($i=0;$i<$tag_count;$i++) { + $args->tag = $tag_list[$i]; + executeQuery('tag.insertTag', $args); + } + + return implode(',',$tag_list); + } + + /** + * @brief 특정 문서의 태그 삭제 + **/ + function deleteTag($document_srl) { + $args->document_srl = $document_srl; + return executeQuery('tag.deleteTag', $args); + } + + } +?> diff --git a/modules/tag/tag.model.php b/modules/tag/tag.model.php new file mode 100644 index 000000000..581f209b5 --- /dev/null +++ b/modules/tag/tag.model.php @@ -0,0 +1,38 @@ +mid) { + $oModuleModel = &getModel('module'); + $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); + unset($obj->mid); + } + + // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 + 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; + + $output = executeQuery('tag.getTagList', $args); + if(!$output->toBool()) return $output; + + return $output; + } + } +?> diff --git a/modules/trackback/conf/info.xml b/modules/trackback/conf/info.xml new file mode 100644 index 000000000..6a41534ee --- /dev/null +++ b/modules/trackback/conf/info.xml @@ -0,0 +1,17 @@ + + + 엮인글 + 引用 + トラックバック + Trackback + + 제로 + zero + Zero + Zero + 엮인글 관리 모듈 + 管理引用模块。 + トラックバック管理モジュール + Module for managing trackbacks + + diff --git a/modules/trackback/conf/module.xml b/modules/trackback/conf/module.xml new file mode 100644 index 000000000..404db7440 --- /dev/null +++ b/modules/trackback/conf/module.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/modules/trackback/lang/en.lang.php b/modules/trackback/lang/en.lang.php new file mode 100644 index 000000000..e4b629975 --- /dev/null +++ b/modules/trackback/lang/en.lang.php @@ -0,0 +1,24 @@ + + * @brief trackback module / basic language pack + **/ + + $lang->cmd_delete_checked_trackback = 'Delete selected trackback(s)'; + + $lang->msg_cart_is_null = 'Please select a trackback to be deleted.'; + $lang->msg_checked_trackback_is_deleted = '%d trackback(s) deleted.'; + + $lang->search_target_list = array( + 'url' => 'Target URL', + 'blog_name' => 'Target Site Name', + 'title' => 'Title', + 'excerpt' => 'Excerpt', + 'regdate' => 'Posting Date', + 'ipaddress' => 'IP Address', + ); + + $lang->enable_trackback = "엮인글 사용"; + $lang->about_enable_trackback = "체크를 해제하시면 사이트내에 모든 글의 엮인글 접수를 중지합니다"; +?> diff --git a/modules/trackback/lang/jp.lang.php b/modules/trackback/lang/jp.lang.php new file mode 100644 index 000000000..dd0870717 --- /dev/null +++ b/modules/trackback/lang/jp.lang.php @@ -0,0 +1,24 @@ + 翻訳:RisaPapa + * @brief トラックバック(trackback)モジュール基本言語パッケージ + **/ + + $lang->cmd_delete_checked_trackback = '選択トラックバック削除'; + + $lang->msg_cart_is_null = '削除する書き込みを選択してください。'; + $lang->msg_checked_trackback_is_deleted = '%d個のトラックバックが削除されました。'; + + $lang->search_target_list = array( + 'url' => 'URL', + 'blog_name' => 'サイト名', + 'title' => 'ブログ名', + 'excerpt' => '要約内容', + 'regdate' => '登録日', + 'ipaddress' => 'IPアドレス', + ); + + $lang->enable_trackback = "トラックバック使用"; + $lang->about_enable_trackback = "チェックを外すと、すべてのコンテンツに対してトラックバックの受信を中止します。"; +?> diff --git a/modules/trackback/lang/ko.lang.php b/modules/trackback/lang/ko.lang.php new file mode 100644 index 000000000..b735c55aa --- /dev/null +++ b/modules/trackback/lang/ko.lang.php @@ -0,0 +1,24 @@ + + * @brief 엮인글(trackback) 모듈의 기본 언어팩 + **/ + + $lang->cmd_delete_checked_trackback = '선택항목 삭제'; + + $lang->msg_cart_is_null = '삭제할 글을 선택해주세요'; + $lang->msg_checked_trackback_is_deleted = '%d개의 엮인글이 삭제되었습니다'; + + $lang->search_target_list = array( + 'url' => '대상 URL', + 'blog_name' => '대상 사이트 이름', + 'title' => '제목', + 'excerpt' => '내용', + 'regdate' => '등록일', + 'ipaddress' => 'IP 주소', + ); + + $lang->enable_trackback = "엮인글 사용"; + $lang->about_enable_trackback = "체크를 해제하시면 사이트내에 모든 글의 엮인글 접수를 중지합니다"; +?> diff --git a/modules/trackback/lang/zh-CN.lang.php b/modules/trackback/lang/zh-CN.lang.php new file mode 100644 index 000000000..5ac9638bc --- /dev/null +++ b/modules/trackback/lang/zh-CN.lang.php @@ -0,0 +1,24 @@ + + * @brief 引用(trackback) 模块的基本语言包 + **/ + + $lang->cmd_delete_checked_trackback = '删除所选项目'; + + $lang->msg_cart_is_null = '请选择要删除的文章'; + $lang->msg_checked_trackback_is_deleted = '已删除%d个引用'; + + $lang->search_target_list = array( + 'url' => '对象URL', + 'blog_name' => '对象网站名称', + 'title' => '标题', + 'excerpt' => '内容', + 'regdate' => '登录日期', + 'ipaddress' => 'IP地址', + ); + + $lang->enable_trackback = "使用引用"; + $lang->about_enable_trackback = "取消此项勾选将对网站内的所有主题中止接收引用。"; +?> diff --git a/modules/trackback/queries/deleteModuleTrackbacks.xml b/modules/trackback/queries/deleteModuleTrackbacks.xml new file mode 100644 index 000000000..dc80d00fe --- /dev/null +++ b/modules/trackback/queries/deleteModuleTrackbacks.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/trackback/queries/deleteTrackback.xml b/modules/trackback/queries/deleteTrackback.xml new file mode 100644 index 000000000..e5a5e60f8 --- /dev/null +++ b/modules/trackback/queries/deleteTrackback.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/trackback/queries/deleteTrackbacks.xml b/modules/trackback/queries/deleteTrackbacks.xml new file mode 100644 index 000000000..7b81949a0 --- /dev/null +++ b/modules/trackback/queries/deleteTrackbacks.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/trackback/queries/getNewestTrackbackList.xml b/modules/trackback/queries/getNewestTrackbackList.xml new file mode 100644 index 000000000..d5c058a11 --- /dev/null +++ b/modules/trackback/queries/getNewestTrackbackList.xml @@ -0,0 +1,15 @@ + + +
    + + + + + + + + + + + + diff --git a/modules/trackback/queries/getTotalTrackbackList.xml b/modules/trackback/queries/getTotalTrackbackList.xml new file mode 100644 index 000000000..6fb61e06f --- /dev/null +++ b/modules/trackback/queries/getTotalTrackbackList.xml @@ -0,0 +1,25 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/trackback/queries/getTrackback.xml b/modules/trackback/queries/getTrackback.xml new file mode 100644 index 000000000..82eb419f1 --- /dev/null +++ b/modules/trackback/queries/getTrackback.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/trackback/queries/getTrackbackCount.xml b/modules/trackback/queries/getTrackbackCount.xml new file mode 100644 index 000000000..9204bf91e --- /dev/null +++ b/modules/trackback/queries/getTrackbackCount.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/trackback/queries/getTrackbackCountByIPAddress.xml b/modules/trackback/queries/getTrackbackCountByIPAddress.xml new file mode 100644 index 000000000..23871ee91 --- /dev/null +++ b/modules/trackback/queries/getTrackbackCountByIPAddress.xml @@ -0,0 +1,12 @@ + + +
    + + + + + + + + + diff --git a/modules/trackback/queries/getTrackbackList.xml b/modules/trackback/queries/getTrackbackList.xml new file mode 100644 index 000000000..b9861d764 --- /dev/null +++ b/modules/trackback/queries/getTrackbackList.xml @@ -0,0 +1,14 @@ + + +
    + + + + + + + + + + + diff --git a/modules/trackback/queries/insertTrackback.xml b/modules/trackback/queries/insertTrackback.xml new file mode 100644 index 000000000..d31308330 --- /dev/null +++ b/modules/trackback/queries/insertTrackback.xml @@ -0,0 +1,17 @@ + + +
    + + + + + + + + + + + + + + diff --git a/modules/trackback/queries/updateTrackbackModule.xml b/modules/trackback/queries/updateTrackbackModule.xml new file mode 100644 index 000000000..21885ef86 --- /dev/null +++ b/modules/trackback/queries/updateTrackbackModule.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/trackback/schemas/trackbacks.xml b/modules/trackback/schemas/trackbacks.xml new file mode 100644 index 000000000..acf2ffcf6 --- /dev/null +++ b/modules/trackback/schemas/trackbacks.xml @@ -0,0 +1,12 @@ +
    + + + + + + + + + + +
    diff --git a/modules/trackback/tpl/filter/delete_checked.xml b/modules/trackback/tpl/filter/delete_checked.xml new file mode 100644 index 000000000..a410c54e6 --- /dev/null +++ b/modules/trackback/tpl/filter/delete_checked.xml @@ -0,0 +1,12 @@ + +
    + + + + + + + + + +
    diff --git a/modules/trackback/tpl/filter/insert_config.xml b/modules/trackback/tpl/filter/insert_config.xml new file mode 100644 index 000000000..5f3aba563 --- /dev/null +++ b/modules/trackback/tpl/filter/insert_config.xml @@ -0,0 +1,5 @@ + +
    + + + diff --git a/modules/trackback/tpl/trackback_list.html b/modules/trackback/tpl/trackback_list.html new file mode 100644 index 000000000..34078b7da --- /dev/null +++ b/modules/trackback/tpl/trackback_list.html @@ -0,0 +1,116 @@ + + + +

    {$lang->trackback} {$lang->cmd_management}

    + + + + + + + + + +
    {$lang->enable_trackback} + enable_trackback!='N')-->checked="checked"/> {$lang->cmd_use} +

    {$lang->about_enable_trackback}

    +
    + + +
    + +
    + + + +
    + Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)} +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->no} +
    + GO +
    +
    {$lang->blog_name}{$lang->title}{$lang->date}{$lang->ipaddress}{$lang->cmd_move}
    + {$no} + {$module_list[$val->module_srl]->browser_title}{htmlspecialchars($val->blog_name)}{htmlspecialchars($val->title)}{zdate($val->regdate,"Y-m-d")}{$val->ipaddress}{$lang->cmd_move}
    + + {$val->excerpt} +
    + + +
    + +
    + +
    + + + + + + +
    + + + + +
    + + + + {$lang->cmd_cancel} +
    +
    diff --git a/modules/trackback/trackback.admin.controller.php b/modules/trackback/trackback.admin.controller.php new file mode 100644 index 000000000..a4a129955 --- /dev/null +++ b/modules/trackback/trackback.admin.controller.php @@ -0,0 +1,65 @@ +stop('msg_cart_is_null'); + $trackback_srl_list= explode('|@|', $cart); + $trackback_count = count($trackback_srl_list); + if(!$trackback_count) return $this->stop('msg_cart_is_null'); + + $oTrackbackController = &getController('trackback'); + + // 글삭제 + for($i=0;$i<$trackback_count;$i++) { + $trackback_srl = trim($trackback_srl_list[$i]); + if(!$trackback_srl) continue; + + $oTrackbackController->deleteTrackback($trackback_srl, true); + } + + $this->setMessage( sprintf(Context::getLang('msg_checked_trackback_is_deleted'), $trackback_count) ); + } + + /** + * @brief 모듈에 속한 모든 트랙백 삭제 + **/ + function deleteModuleTrackbacks($module_srl) { + // 삭제 + $args->module_srl = $module_srl; + $output = executeQuery('trackback.deleteModuleTrackbacks', $args); + + return $output; + } + + /** + * @brief 설정 저장 + **/ + function procTrackbackAdminInsertConfig() { + $config->enable_trackback = Context::get('enable_trackback'); + if($config->enable_trackback != 'Y') $config->enable_trackback = 'N'; + + // module Controller 객체 생성하여 입력 + $oModuleController = &getController('module'); + $output = $oModuleController->insertModuleConfig('trackback',$config); + return $output; + } + + } +?> diff --git a/modules/trackback/trackback.admin.model.php b/modules/trackback/trackback.admin.model.php new file mode 100644 index 000000000..9724e042f --- /dev/null +++ b/modules/trackback/trackback.admin.model.php @@ -0,0 +1,67 @@ +s_url = $search_keyword; + break; + case 'title' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_title= $search_keyword; + break; + case 'blog_name' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_blog_name= $search_keyword; + break; + case 'excerpt' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_excerpt = $search_keyword; + break; + case 'regdate' : + $args->s_regdate = $search_keyword; + break; + case 'ipaddress' : + $args->s_ipaddress= $search_keyword; + break; + } + } + + // 변수 설정 + $args->sort_index = $obj->sort_index; + $args->page = $obj->page?$obj->page:1; + $args->list_count = $obj->list_count?$obj->list_count:20; + $args->page_count = $obj->page_count?$obj->page_count:10; + $args->s_module_srl = $obj->module_srl; + + // trackback.getTotalTrackbackList 쿼리 실행 + $output = executeQuery('trackback.getTotalTrackbackList', $args); + + // 결과가 없거나 오류 발생시 그냥 return + if(!$output->toBool()||!count($output->data)) return $output; + + return $output; + } + } +?> diff --git a/modules/trackback/trackback.admin.view.php b/modules/trackback/trackback.admin.view.php new file mode 100644 index 000000000..4e186e285 --- /dev/null +++ b/modules/trackback/trackback.admin.view.php @@ -0,0 +1,75 @@ +getModuleConfig('trackback'); + Context::set('config',$config); + + // 목록을 구하기 위한 옵션 + $args->page = Context::get('page'); ///< 페이지 + $args->list_count = 50; ///< 한페이지에 보여줄 글 수 + $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 + + $args->sort_index = 'list_order'; ///< 소팅 값 + $args->module_srl = Context::get('module_srl'); + + // mid목록을 구함 + $oModuleModel = &getModel('module'); + $mid_list = $oModuleModel->getMidList(); + Context::set('mid_list', $mid_list); + + // 목록 구함 + $oTrackbackAdminModel = &getAdminModel('trackback'); + $output = $oTrackbackAdminModel->getTotalTrackbackList($args); + + // 목록의 loop를 돌면서 mid를 구하기 위한 module_srl값을 구함 + $trackback_count = count($output->data); + if($trackback_count) { + $module_srl_list = array(); + foreach($output->data as $key => $val) { + $module_srl = $val->module_srl; + if(!in_array($module_srl, $module_srl_list)) $module_srl_list[] = $module_srl; + } + if(count($module_srl_list)) { + $args->module_srls = implode(',',$module_srl_list); + $mid_output = executeQuery('module.getModuleInfoByModuleSrl', $args); + if($mid_output->data && !is_array($mid_output->data)) $mid_output->data = array($mid_output->data); + for($i=0;$idata);$i++) { + $mid_info = $mid_output->data[$i]; + $module_list[$mid_info->module_srl] = $mid_info; + } + } + } + + // 템플릿에 쓰기 위해서 변수 설정 + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('trackback_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + Context::set('module_list', $module_list); + + // 템플릿 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('trackback_list'); + } + + } +?> diff --git a/modules/trackback/trackback.class.php b/modules/trackback/trackback.class.php new file mode 100644 index 000000000..a7baf71aa --- /dev/null +++ b/modules/trackback/trackback.class.php @@ -0,0 +1,37 @@ +insertActionForward('trackback', 'controller', 'trackback'); + $oModuleController->insertActionForward('trackback', 'view', 'dispTrackbackAdminList'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + + } +?> diff --git a/modules/trackback/trackback.controller.php b/modules/trackback/trackback.controller.php new file mode 100644 index 000000000..4f3270674 --- /dev/null +++ b/modules/trackback/trackback.controller.php @@ -0,0 +1,200 @@ +getModuleConfig('trackback'); + if($config->enable_trackback == 'N') return $this->stop('fail'); + + Context::setRequestMethod("XMLRPC"); + $obj = Context::gets('document_srl','blog_name','url','title','excerpt'); + if(!$obj->document_srl || !$obj->url || !$obj->title || !$obj->excerpt) return $this->stop('fail'); + return $this->insertTrackback($obj); + } + + function insertTrackback($obj, $manual_inserted = false) { + // GET으로 넘어온 document_srl을 참조, 없으면 오류~ + $document_srl = $obj->document_srl; + + if(!$manual_inserted) { + // document model 객체 생성후 원본글을 가져옴 + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + + // 원본글이 없거나 트랙백 허용을 하지 않으면 오류 표시 + if(!$oDocument->isExists()) return $this->stop('fail'); + if(!$oDocument->allowTrackback()) return new Object(-1,'fail'); + + $obj->module_srl = $oDocument->get('module_srl'); + } + + // 엮인글 정리 + $obj = Context::convertEncoding($obj); + if(!$obj->blog_name) $obj->blog_name = $obj->title; + $obj->excerpt = strip_tags($obj->excerpt); + + // 엮인글를 입력 + $obj->trackback_srl = getNextSequence(); + $obj->list_order = $obj->trackback_srl*-1; + $output = executeQuery('trackback.insertTrackback', $obj); + if(!$output->toBool()) return $output; + + // 입력에 이상이 없으면 해당 글의 엮인글 수를 올림 + if(!$manual_inserted) { + // trackback model 객체 생성 + $oTrackbackModel = &getModel('trackback'); + + // 해당 글의 전체 엮인글 수를 구해옴 + $trackback_count = $oTrackbackModel->getTrackbackCount($document_srl); + + // document controller 객체 생성 + $oDocumentController = &getController('document'); + + // 해당글의 엮인글 수를 업데이트 + $output = $oDocumentController->updateTrackbackCount($document_srl, $trackback_count); + + // 결과 return + if(!$output->toBool()) return $output; + } + + // 원본글에 알림(notify_message)가 설정되어 있으면 메세지 보냄 + if(!$manual_inserted) $oDocument->notify(Context::getLang('trackback'), $obj->excerpt); + + + return new Object(); + } + + /** + * @brief 단일 엮인글 삭제 + **/ + function deleteTrackback($trackback_srl, $is_admin = false) { + // trackback model 객체 생성 + $oTrackbackModel = &getModel('trackback'); + + // 삭제하려는 엮인글이 있는지 확인 + $trackback = $oTrackbackModel->getTrackback($trackback_srl); + if($trackback->data->trackback_srl != $trackback_srl) return new Object(-1, 'msg_invalid_request'); + $document_srl = $trackback->data->document_srl; + + // document model 객체 생성 + $oDocumentModel = &getModel('document'); + + // 권한이 있는지 확인 + if(!$is_admin && !$oDocumentModel->isGranted($document_srl)) return new Object(-1, 'msg_not_permitted'); + + $args->trackback_srl = $trackback_srl; + $output = executeQuery('trackback.deleteTrackback', $args); + if(!$output->toBool()) return new Object(-1, 'msg_error_occured'); + + // 엮인글 수를 구해서 업데이트 + $trackback_count = $oTrackbackModel->getTrackbackCount($document_srl); + + // document controller 객체 생성 + $oDocumentController = &getController('document','controller'); + + // 해당글의 엮인글 수를 업데이트 + $output = $oDocumentController->updateTrackbackCount($document_srl, $trackback_count); + $output->add('document_srl', $document_srl); + + return $output; + } + + /** + * @brief 글에 속한 모든 트랙백 삭제 + **/ + function deleteTrackbacks($document_srl) { + // 삭제 + $args->document_srl = $document_srl; + $output = executeQuery('trackback.deleteTrackbacks', $args); + + return $output; + } + + /** + * @brief 엮인글을 발송 + * + * 발송 후 결과처리는 하지 않는 구조임 + **/ + function sendTrackback($document, $trackback_url, $charset) { + // 발송할 정보를 정리 + $http = parse_url($trackback_url); + $obj->blog_name = Context::getBrowserTitle(); + $obj->title = $document->title; + $obj->excerpt = cut_str(strip_tags($document->content), 240); + $obj->url = sprintf("%s?document_srl=%d", Context::getRequestUri(), $document->document_srl); + + // blog_name, title, excerpt, url의 문자열을 요청된 charset으로 변경 + if($charset && function_exists('iconv')) { + foreach($obj as $key=>$val) { + $obj->{$key} = iconv('UTF-8',$charset,$val); + } + } + + // socket으로 발송할 내용 작성 + if($http['query']) $http['query'].="&"; + if(!$http['port']) $http['port'] = 80; + + $content = + sprintf( + "title=%s&". + "url=%s&". + "blog_name=%s&". + "excerpt=%s", + urlencode($obj->title), + urlencode($obj->url), + urlencode($obj->blog_name), + urlencode($obj->excerpt) + ); + if($http['query']) $content .= '&'.$http['query']; + $content_length = strlen($content); + + // header 정리 + $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; + + // 발송하려는 대상 서버의 socket을 연다 + $fp = @fsockopen($http['host'], $http['port'], $errno, $errstr, 5); + if(!$fp) return; + + // 작성한 헤더 정보를 발송 + fputs($fp, $header); + + // 결과를 기다림 (특정 서버의 경우 EOF가 떨어지지 않을 수가 있음 + while(!feof($fp)) { + $line = trim(fgets($fp, 4096)); + if(eregi("^",$line)) break; + } + + // socket 닫음 + fclose($fp); + } + } +?> diff --git a/modules/trackback/trackback.model.php b/modules/trackback/trackback.model.php new file mode 100644 index 000000000..9bd8f1a0b --- /dev/null +++ b/modules/trackback/trackback.model.php @@ -0,0 +1,85 @@ +trackback_srl = $trackback_srl; + return executeQuery('trackback.getTrackback', $args); + } + + /** + * @brief document_srl 에 해당하는 엮인글의 전체 갯수를 가져옴 + **/ + function getTrackbackCount($document_srl) { + $args->document_srl = $document_srl; + $output = executeQuery('trackback.getTrackbackCount', $args); + $total_count = $output->data->count; + + return (int)$total_count; + } + + /** + * @brief 특정 document에 특정 ip로 기록된 트랙백의 갯수 + * spamfilter 에서 사용할 method임 + **/ + function getTrackbackCountByIPAddress($document_srl, $ipaddress) { + $args->document_srl = $document_srl; + $args->ipaddress = $ipaddress; + $output = executeQuery('trackback.getTrackbackCountByIPAddress', $args); + $total_count = $output->data->count; + + return (int)$total_count; + } + + /** + * @brief 특정 문서에 속한 엮인글의 목록을 가져옴 + **/ + function getTrackbackList($document_srl) { + $args->document_srl = $document_srl; + $args->list_order = 'list_order'; + $output = executeQuery('trackback.getTrackbackList', $args); + + if(!$output->toBool()) return $output; + + $trackback_list = $output->data; + + if(!is_array($trackback_list)) $trackback_list = array($trackback_list); + + return $trackback_list; + } + + /** + * @brief mid 에 해당하는 엮인글을 가져옴 + **/ + function getNewestTrackbackList($obj) { + if($obj->mid) { + $oModuleModel = &getModel('module'); + $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); + unset($obj->mid); + } + + // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 + 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; + + $output = executeQuery('trackback.getNewestTrackbackList', $args); + + return $output; + } + } +?> diff --git a/modules/ttimporter/conf/info.xml b/modules/ttimporter/conf/info.xml new file mode 100644 index 000000000..4ce566322 --- /dev/null +++ b/modules/ttimporter/conf/info.xml @@ -0,0 +1,31 @@ + + + TatterTools 데이터 이전 + TatterTools 数据导入 + TTデータ移転 + Transfer data from TatterTools + + 제로 + zero + Zero + Zero + + 태터툴즈의 백업파일을 제로보드XE에 입력을 하는 모듈입니다. + 첨부파일 포함하지 않은 백업파일이 필요합니다. + 첨부파일은 원주소에서 직접 다운로드를 하게 됩니다. + + + 导入TatterTools的备份文件到Zeroboard XE的模块。 + 需要不包含附件的备份文件。 + 附件将在原地址直接下载。 + + + TatterToolsのバックアップファイルをゼロボードXE用にデータの変換を行うモジュールです。添付ファイルを含まないバックアップファイルが必要です。添付ファイルは、元のアドレスからダウンロードします。 + + + Module for inputting TattertTools' backup file to ZeroboardXE. + Backup file without attachment is required. + Attachments will be downloaded from the original address. + + + diff --git a/modules/ttimporter/conf/module.xml b/modules/ttimporter/conf/module.xml new file mode 100644 index 000000000..a0047cc78 --- /dev/null +++ b/modules/ttimporter/conf/module.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/modules/ttimporter/lang/en.lang.php b/modules/ttimporter/lang/en.lang.php new file mode 100644 index 000000000..b31110e03 --- /dev/null +++ b/modules/ttimporter/lang/en.lang.php @@ -0,0 +1,21 @@ +ttimporter = "Import Tetter Tools data"; + $lang->about_tt_importer = "You can input the Tetter Tools data into the module you want.\n The attached file will be directly downloaded via web, so please be sure to enable the original Tetter Tools blog."; + + $lang->target_module = "Target module"; + $lang->target_file = "Target xml file"; + $lang->target_url = "Blog URL"; + + $lang->cmd_continue = 'Continue'; + + $lang->msg_no_xml_file = 'Could not find the XML file! Please check the URL.'; + $lang->msg_invalid_xml_file = 'Invalid XML file type!'; + $lang->msg_importing = 'No. of importing: %d (if stopped long time, please click the "Continue" button.)'; + $lang->msg_import_finished = 'No. of imported: %d (according to condition, some data may not be imported properly.)'; +?> diff --git a/modules/ttimporter/lang/jp.lang.php b/modules/ttimporter/lang/jp.lang.php new file mode 100644 index 000000000..96c389050 --- /dev/null +++ b/modules/ttimporter/lang/jp.lang.php @@ -0,0 +1,21 @@ +ttimporter = "TTデータの移転"; + $lang->about_tt_importer = "TatterTools データを希望するモジュールへデータを変換し、入力を行います。添付ファイルは、元のURLから直接ダウンロードするため、元のTatterTools が作動するようにしておいてください。"; + + $lang->target_module = "対象モジュール"; + $lang->target_file = "対象XMLファイル"; + $lang->target_url = "ブログURL"; + + $lang->cmd_continue = '続ける'; + + $lang->msg_no_xml_file = 'XMLファイルが見つかりません。パスを確認してください。'; + $lang->msg_invalid_xml_file = '正しくないフォーマットのXMLファイルです。'; + $lang->msg_importing = '%d個を変換・入力中です。止まっている場合は「続ける」ボタンをクリックしてください。'; + $lang->msg_import_finished = '%d個のデータを変換し、入力が完了しました。正しく変換入力されていないデータがある場合もあります。'; +?> diff --git a/modules/ttimporter/lang/ko.lang.php b/modules/ttimporter/lang/ko.lang.php new file mode 100644 index 000000000..92eb2b85b --- /dev/null +++ b/modules/ttimporter/lang/ko.lang.php @@ -0,0 +1,21 @@ +ttimporter = "태터툴즈 데이터 이전"; + $lang->about_tt_importer = "태터툴즈 데이터를 원하는 모듈에 입력을 할 수 있습니다.\n첨부파일은 웹으로 직접 다운로드를 받으니 꼭 원래 태터툴즈 블로그를 활성화 시켜 주셔야 합니다."; + + $lang->target_module = "대상 모듈"; + $lang->target_file = "대상 xml파일"; + $lang->target_url = "블로그URL"; + + $lang->cmd_continue = '계속진행'; + + $lang->msg_no_xml_file = 'XML파일을 찾을 수 없습니다. 경로를 다시 확인해주세요'; + $lang->msg_invalid_xml_file = '잘못된 형식의 XML파일입니다'; + $lang->msg_importing = '%d개를 입력중입니다. (계속 멈추어 있으면 "계속진행" 버튼을 클릭해주세요)'; + $lang->msg_import_finished = '%d개의 데이터 입력이 완료되었습니다. 상황에 따라 입력되지 못한 데이터가 있을 수 있습니다.'; +?> diff --git a/modules/ttimporter/lang/zh-CN.lang.php b/modules/ttimporter/lang/zh-CN.lang.php new file mode 100644 index 000000000..a6361511f --- /dev/null +++ b/modules/ttimporter/lang/zh-CN.lang.php @@ -0,0 +1,21 @@ +ttimporter = "TatterTools 数据导入"; + $lang->about_tt_importer = "可以把TatterTools 的数据导入到指定的模块当中。\n因附件要在网站直接下载,所以导入前必须先激活原TatterTools 博客。"; + + $lang->target_module = "对象模块"; + $lang->target_file = "对象xml文件"; + $lang->target_url = "博客URL"; + + $lang->cmd_continue = '继续进行'; + + $lang->msg_no_xml_file = '找不到XML文件。请重新确认路径'; + $lang->msg_invalid_xml_file = '错误的XML文件格式。'; + $lang->msg_importing = '正在输入%d个。(长时间停止响应时请按“继续进行”按钮)'; + $lang->msg_import_finished = '已完成%d个数据导入。根据情况可能会有没有被导入的数据。'; +?> diff --git a/modules/ttimporter/tpl/filter/import_tt.xml b/modules/ttimporter/tpl/filter/import_tt.xml new file mode 100644 index 000000000..cf5182a1c --- /dev/null +++ b/modules/ttimporter/tpl/filter/import_tt.xml @@ -0,0 +1,14 @@ + +
    + + + + + + + + + + + +
    diff --git a/modules/ttimporter/tpl/index.html b/modules/ttimporter/tpl/index.html new file mode 100644 index 000000000..bd8b1cc96 --- /dev/null +++ b/modules/ttimporter/tpl/index.html @@ -0,0 +1,46 @@ + + + +

    {$lang->ttimporter} {$lang->cmd_management}

    + + +
    {nl2br($lang->about_tt_importer)}
    + +
    + + + + + + + + + + + + + + + + + +
    {$lang->target_module} + +
    {$lang->target_file}
    {$lang->target_url}
    + +
    + +
    + + + +
    diff --git a/modules/ttimporter/tpl/js/importer_admin.js b/modules/ttimporter/tpl/js/importer_admin.js new file mode 100644 index 000000000..cef481fb6 --- /dev/null +++ b/modules/ttimporter/tpl/js/importer_admin.js @@ -0,0 +1,29 @@ +/** + * @file modules/ttimporter/js/importer_admin.js + * @author zero (zero@nzeo.com) + * @brief importer에서 사용하는 javascript + **/ + +/* Step Complete Import */ +function completeImport(ret_obj) { + var message = ret_obj['message']; + var is_finished = ret_obj['is_finished']; + var position = ret_obj['position']; + + xGetElementById("import_status").style.display = "block"; + + if(is_finished=='Y') { + alert(ret_obj["message"]); + location.href = location.href; + } else { + var fo_obj = xGetElementById('fo_import'); + fo_obj.position.value = position; + xInnerHtml('import_status', message); + procFilter(fo_obj, import_tt); + } +} + +function doManualProcess() { + var fo_obj = xGetElementById('fo_import'); + procFilter(fo_obj, import_tt); +} diff --git a/modules/ttimporter/ttimporter.admin.controller.php b/modules/ttimporter/ttimporter.admin.controller.php new file mode 100644 index 000000000..f5040ce9b --- /dev/null +++ b/modules/ttimporter/ttimporter.admin.controller.php @@ -0,0 +1,264 @@ +module_srl = Context::get('module_srl'); + $xml_file = Context::get('xml_file'); + $this->url = Context::get('url'); + $this->position = (int)Context::get('position'); + if(substr($this->url,-1)!='/') $this->url .= '/'; + + // 파일을 찾을 수 없으면 에러 표시 + if(!file_exists($xml_file)) return new Object(-1,'msg_no_xml_file'); + + $this->oXml = new XmlParser(); + + $oDocumentModel = &getModel('document'); + $tmp_category_list = $oDocumentModel->getCategoryList($this->module_srl); + if(count($tmp_category_list)) { + foreach($tmp_category_list as $key => $val) $this->category_list[$val->title] = $key; + } else { + $this->category_list = array(); + } + + // module_srl이 있으면 module데이터로 판단하여 처리, 아니면 회원정보로.. + $is_finished = $this->importDocument($xml_file); + + if($is_finished) { + $this->add('is_finished', 'Y'); + $this->setMessage( sprintf(Context::getLang('msg_import_finished'), $this->imported_count) ); + } else { + $this->add('position', $this->imported_count); + $this->add('is_finished', 'N'); + $this->setMessage( sprintf(Context::getLang('msg_importing'), $this->imported_count) ); + } + } + + /** + * @brief 게시물정보 import + **/ + function importDocument($xml_file) { + $filesize = filesize($xml_file); + + if($filesize<1) return; + + $this->oDocumentController = &getController('document'); + $this->oFileController = &getController('file'); + $this->oCommentController = &getController('comment'); + $this->oTrackbackController = &getController('trackback'); + + $is_finished = true; + + $fp = @fopen($xml_file, "r"); + if($fp) { + $buff = ''; + while(!feof($fp)) { + $str = fread($fp,1024); + $buff .= $str; + + $buff = preg_replace_callback("!(.*?)<\/category>!is", array($this, '_parseCategoryInfo'), trim($buff)); + $buff = preg_replace_callback("!!is", array($this, '_importDocument'), trim($buff)); + + if($this->position+$this->limit_count <= $this->imported_count) { + $is_finished = false; + break; + } + } + fclose($fp); + } + + return $is_finished; + } + + function _insertAttachment($matches) { + $xml_doc = $this->oXml->parse($matches[0]); + + $filename = $xml_doc->attachment->name->body; + $url = sprintf("%sattach/1/%s", $this->url, $filename); + + $tmp_filename = './files/cache/tmp_uploaded_file'; + if(FileHandler::getRemoteFile($url, $tmp_filename)) { + $file_info['tmp_name'] = $tmp_filename; + $file_info['name'] = $filename; + $this->oFileController->insertFile($file_info, $this->module_srl, $this->document_srl, 0, true); + $this->uploaded_count++; + } + @unlink($tmp_filename); + } + + function _importDocument($matches) { + if($this->position > $this->imported_count) { + $this->imported_count++; + return; + } + + $this->uploaded_count = 0; + + $xml_doc = $this->oXml->parse($matches[0]); + + // 문서 번호와 내용 미리 구해 놓기 + $this->document_srl = $args->document_srl = getNextSequence(); + $args->content = $xml_doc->post->content->body; + + // 첨부파일 미리 등록 + preg_replace_callback("!!is", array($this, '_insertAttachment'), $matches[0]); + + // 컨텐츠의 내용 수정 (이미지 첨부파일 관련) + $args->content = preg_replace("!(\[##\_1)([a-zA-Z]){1}\|([^\|]*)\|([^\|]*)\|([^\]]*)\]!is", sprintf('', $this->module_srl, $args->document_srl), $args->content); + + if($xml_doc->post->comment && !is_array($xml_doc->post->comment)) $xml_doc->post->comment = array($xml_doc->post->comment); + + $logged_info = Context::get('logged_info'); + + // 문서 입력 + $args->module_srl = $this->module_srl; + $args->category_srl = $this->category_list[$xml_doc->post->category->body]; + $args->is_notice = 'N'; + $args->is_secret = 'N'; + $args->title = $xml_doc->post->title->body; + $args->readed_count = 0; + $args->voted_count = 0; + $args->comment_count = count($xml_doc->post->comment); + $args->trackback_count = 0; + $args->uploaded_count = $this->uploaded_count; + $args->password = ''; + $args->nick_name = $logged_info->nick_name; + $args->member_srl = $logged_info->member_srl; + $args->user_id = $logged_info->user_id; + $args->user_name = $logged_info->user_name; + $args->email_address = $logged_info->email_address; + $args->homepage = $logged_info->homepage; + + $tag_list = array(); + $tags = $xml_doc->post->tag; + if($tags && !is_array($tags)) $tags = array($tags); + for($i=0;$ibody; + } + $args->tags = implode(',',$tag_list); + $args->regdate = date("YmdHis", $xml_doc->post->created->body); + $args->ipaddress = ''; + $args->allow_comment = $xml_doc->post->acceptcomment->body?'Y':'N'; + $args->lock_comment = 'N'; + $args->allow_trackback = $xml_doc->post->accepttrackback->body?'Y':'N'; + + $output = $this->oDocumentController->insertDocument($args, true); + + if($output->toBool()) { + + // 코멘트 입력 + $comments = $xml_doc->post->comment; + if(count($comments)) { + foreach($comments as $key => $val) { + unset($comment_args); + $comment_args->document_srl = $args->document_srl; + $comment_args->comment_srl = getNextSequence(); + $comment_args->module_srl = $this->module_srl; + $comment_args->parent_srl = 0; + $comment_args->content = $val->content->body; + $comment_args->password = ''; + $comment_args->nick_name = $val->commenter->name->body; + $comment_args->user_id = ''; + $comment_args->user_name = ''; + $comment_args->member_srl = 0; + $comment_args->email_address = ''; + $comment_args->regdate = date("YmdHis",$val->written->body); + $comment_args->ipaddress = $val->commenter->ip->body; + $this->oCommentController->insertComment($comment_args, true); + + if($val->comment) { + $val = $val->comment; + unset($child_comment_args); + $child_comment_args->document_srl = $args->document_srl; + $child_comment_args->comment_srl = getNextSequence(); + $child_comment_args->module_srl = $this->module_srl; + $child_comment_args->parent_srl = $comment_args->comment_srl; + $child_comment_args->content = $val->content->body; + $child_comment_args->password = ''; + $child_comment_args->nick_name = $val->commenter->name->body; + $child_comment_args->user_id = ''; + $child_comment_args->user_name = ''; + $child_comment_args->member_srl = 0; + $child_comment_args->email_address = ''; + $child_comment_args->regdate = date("YmdHis",$val->written->body); + $child_comment_args->ipaddress = $val->commenter->ip->body; + $this->oCommentController->insertComment($child_comment_args, true); + } + + } + } + + /* + // 트랙백 입력 + $trackbacks = $xml_doc->document->trackbacks->trackback; + if($trackbacks && !is_array($trackbacks)) $trackbacks = array($trackbacks); + if(count($trackbacks)) { + foreach($trackbacks as $key => $val) { + $trackback_args->document_srl = $args->document_srl; + $trackback_args->module_srl = $this->module_srl; + $trackback_args->url = $val->url->body; + $trackback_args->title = $val->title->body; + $trackback_args->blog_name = $val->blog_name->body; + $trackback_args->excerpt = $val->excerpt->body; + $trackback_args->regdate = $val->regdate->body; + $trackback_args->ipaddress = $val->ipaddress->body; + $this->oTrackbackController->insertTrackback($trackback_args, true); + } + } + */ + } + + $this->imported_count ++; + return ''; + } + + /** + * @brief 정보를 읽어서 정보를 구함 + **/ + function _parseCategoryInfo($matches) { + $xml_doc = $this->oXml->parse($matches[0]); + if(!$xml_doc->category->priority) return $matches[0]; + + $title = trim($xml_doc->category->name->body); + if(!$title || $this->category_list[$title]) return; + + $oDocumentController = &getAdminController('document'); + $output = $oDocumentController->insertCategory($this->module_srl, $title); + $this->category_list[$title] = $output->get('category_srl'); + } + } +?> diff --git a/modules/ttimporter/ttimporter.admin.view.php b/modules/ttimporter/ttimporter.admin.view.php new file mode 100644 index 000000000..921196a25 --- /dev/null +++ b/modules/ttimporter/ttimporter.admin.view.php @@ -0,0 +1,32 @@ +getMidList(); + Context::set('module_list', $module_list); + + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('index'); + } + + } +?> diff --git a/modules/ttimporter/ttimporter.class.php b/modules/ttimporter/ttimporter.class.php new file mode 100644 index 000000000..1d099d7dc --- /dev/null +++ b/modules/ttimporter/ttimporter.class.php @@ -0,0 +1,36 @@ +insertActionForward('ttimporter', 'view', 'dispTtimporterAdminContent'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + + } +?> diff --git a/modules/widget/conf/info.xml b/modules/widget/conf/info.xml new file mode 100644 index 000000000..df8199db9 --- /dev/null +++ b/modules/widget/conf/info.xml @@ -0,0 +1,17 @@ + + + 위젯 + 控件 + ウィジェット + Widget + + 제로 + zero + Zero + Zero + 위젯 관리 모듈 + 控件管理模块。 + ウィジェット管理モジュール + Module for managing widgets + + diff --git a/modules/widget/conf/module.xml b/modules/widget/conf/module.xml new file mode 100644 index 000000000..d404a6792 --- /dev/null +++ b/modules/widget/conf/module.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/modules/widget/lang/en.lang.php b/modules/widget/lang/en.lang.php new file mode 100644 index 000000000..301daceab --- /dev/null +++ b/modules/widget/lang/en.lang.php @@ -0,0 +1,43 @@ + + * @brief widget module- basic language pack + **/ + + $lang->cmd_generate_code = 'Generate Code'; + + $lang->widget_name = 'Widget Name'; + $lang->widget_maker = 'Widget Developer'; + $lang->widget_history = 'Update History'; + $lang->widget_info = 'Widget Info'; + $lang->widget_code = 'Code'; + $lang->widget_cache = 'Cache'; + + $lang->widget_fix_width = 'Fix Width'; + $lang->widget_width = 'Width'; + $lang->widget_position = 'Position'; + $lang->widget_position_none = 'Next Line'; + $lang->widget_position_left = 'Left'; + $lang->widget_position_right = 'Right'; + $lang->widget_margin = 'Margin'; + $lang->widget_margin_top = 'Top Margin'; + $lang->widget_margin_right = 'Right Margin'; + $lang->widget_margin_bottom = 'Bottom Margin'; + $lang->widget_margin_left= 'Left Margin'; + $lang->about_widget_fix_width = 'Please check to fix the width.'; + $lang->about_widget_width = 'Please set the width of widget.'; + $lang->about_widget_position = 'Please select the position if you want to display many widgets in one line.'; + $lang->about_widget_margin = "You may set the margin of widgets' top, bottom, right and left."; + $lang->about_widget_cache = 'Cached data can be used during the time you have set.'; + + $lang->generated_code = 'Generated Code'; + + $lang->msg_widget_is_not_exists = '%s widget does not exist.'; + $lang->msg_widget_object_is_null = 'Object of %s widget cannot be created.'; + $lang->msg_widget_proc_is_null = 'proc() of %s widget cannot be executed.'; + + $lang->about_widget_code = 'Please input required value first, and click [Generate Code] button to generate code to add to the template file.'; + $lang->about_widget_code_in_page = 'After entering the required values, click the [Add] button to insert the widget code into the page.'; + $lang->about_addon = "A widget is a small free-standing application used in a layout or page module.\n It can be linked with internal module or external open api. Through its configuration setting, wide application is possible. \n You can directly add a widget by using the [Generate Code] function without using the Zeroboard XE page module or layout module."; +?> diff --git a/modules/widget/lang/jp.lang.php b/modules/widget/lang/jp.lang.php new file mode 100644 index 000000000..f08cc962e --- /dev/null +++ b/modules/widget/lang/jp.lang.php @@ -0,0 +1,43 @@ + 翻訳:RisaPapa + * @brief ウィジェット(widget)モジュール基本言語パッケージ + **/ + + $lang->cmd_generate_code = 'コード生成'; + + $lang->widget_name = 'ウィジェット名'; + $lang->widget_maker = 'ウィジェット作者'; + $lang->widget_history = '変更内容'; + $lang->widget_info = 'ウィジェット情報'; + $lang->widget_code = 'コード'; + $lang->widget_cache = 'キャッシュ'; + + $lang->widget_fix_width = '横幅固定'; + $lang->widget_width = '縦幅サイズ'; + $lang->widget_position = 'ポジッション'; + $lang->widget_position_none = '改行'; + $lang->widget_position_left = '左へ'; + $lang->widget_position_right = '右へ'; + $lang->widget_margin = '余白'; + $lang->widget_margin_top = '上'; + $lang->widget_margin_right = '右'; + $lang->widget_margin_bottom = '下 '; + $lang->widget_margin_left= '左'; + $lang->about_widget_fix_width = 'チェックすると横幅が固定されます。'; + $lang->about_widget_width = '縦幅サイズを選択してください。'; + $lang->about_widget_position = '一つのラインに多数のウィジェットを羅列したい場合は、ポジッションを選択してください。'; + $lang->about_widget_margin = '一つのラインに多数のウィジェットを羅列したい場合は、ポジッションを選択してください。'; + $lang->about_widget_cache = '指定された時間内にキャッシュされたデータが利用できます。'; + + $lang->generated_code = '生成コード'; + + $lang->msg_widget_is_not_exists = '%s ウィジェットが見つかりません。'; + $lang->msg_widget_object_is_null = '%s ウィジェットのオブジェクトが生成できません。'; + $lang->msg_widget_proc_is_null = '%s ウィセットの proc() が実行できません。'; + + $lang->about_widget_code = '選択されたウィゼットで求められる下の項目の値を入力し、「コード生成」ボタンをクリックすると、
    一番下にテンプレートファイルに適用できるコードが出力されます。'; + $lang->about_widget_code_in_page = '下に必要な値を入力した後、追加ボタンをクリックするとページ内にウィジェットが挿入されます。'; + $lang->about_addon = "ウィジェットまたはページモジュールに用いられる小単位の構成要素です。内部モジュールまたは外部の OPEN API と連動でき、設定によって様々な応用が利きます。ゼロボードXEのページモジュールまたはレイアウトモジュールを使用しなくても、「コード生成」機能で直接ウィジェットも追加できます。"; +?> diff --git a/modules/widget/lang/ko.lang.php b/modules/widget/lang/ko.lang.php new file mode 100644 index 000000000..bd9a150c7 --- /dev/null +++ b/modules/widget/lang/ko.lang.php @@ -0,0 +1,43 @@ + + * @brief 위젯(widget) 모듈의 기본 언어팩 + **/ + + $lang->cmd_generate_code = '코드생성'; + + $lang->widget_name = '위젯 이름'; + $lang->widget_maker = '위젯 제작자'; + $lang->widget_history = '변경사항'; + $lang->widget_info = '위젯 정보'; + $lang->widget_code = '코드'; + $lang->widget_cache = '캐시'; + + $lang->widget_fix_width = '크기 고정'; + $lang->widget_width = '가로크기'; + $lang->widget_position = '위치'; + $lang->widget_position_none = '줄바꿈'; + $lang->widget_position_left = '왼쪽'; + $lang->widget_position_right = '오른쪽'; + $lang->widget_margin = '여백'; + $lang->widget_margin_top = '위'; + $lang->widget_margin_right = '오른쪽'; + $lang->widget_margin_bottom = '아래 '; + $lang->widget_margin_left= '왼쪽'; + $lang->about_widget_fix_width = '선택하시면 가로크기가 고정됩니다.'; + $lang->about_widget_width = '가로 크기를 입력해주세요.'; + $lang->about_widget_position = '한 줄에 여러개의 위젯을 나열하고 싶을때에는 위치를 선택해주세요.'; + $lang->about_widget_margin = '지정된 위젯의 상하좌우 여백을 지정할 수 있습니다'; + $lang->about_widget_cache = '지정된 시간동안 캐시된 데이터를 이용할 수 있습니다.'; + + $lang->generated_code = '생성된 코드'; + + $lang->msg_widget_is_not_exists = '%s 위젯을 찾을 수 없습니다'; + $lang->msg_widget_object_is_null = '%s 위젯의 객체 생성을 할 수가 없습니다'; + $lang->msg_widget_proc_is_null = '%s 위젯의 proc() 를 실행할 수가 없습니다'; + + $lang->about_widget_code = '선택하신 위젯에서 요구하는 아래 항목들의 값을 넣고 [코드생성]버튼을 누르시면 제일 아래 칸에 템플릿 파일에 적용할 수 있는 코드가 출력 됩니다'; + $lang->about_widget_code_in_page = '아래 필요한 값들을 입력하신 후 추가 버튼을 누르시면 페이지 내에 위젯이 삽입이 됩니다'; + $lang->about_addon = "위젯은 레이아웃이나 페이지 모듈에서 사용되는 작은 구성요소입니다.\n내부 모듈 또는 외부 open api와 연동될 수도 있고 설정을 통해서 다양한 응용이 가능합니다.\n제로보드XE의 페이지 모듈이나 레이아웃 모듈을 사용하지 않더라도 [코드생성] 기능을 통해 직접 위젯 추가도 할 수 있습니다"; +?> diff --git a/modules/widget/lang/zh-CN.lang.php b/modules/widget/lang/zh-CN.lang.php new file mode 100644 index 000000000..7b6cfe98b --- /dev/null +++ b/modules/widget/lang/zh-CN.lang.php @@ -0,0 +1,43 @@ + + * @brief 控件(widget) 模块语言包 + **/ + + $lang->cmd_generate_code = '生成代码'; + + $lang->widget_name = '控件名称'; + $lang->widget_maker = '控件作者'; + $lang->widget_history = '更新事项'; + $lang->widget_info = '控件信息'; + $lang->widget_code = '代码'; + $lang->widget_cache = '缓冲'; + + $lang->widget_fix_width = '固定大小'; + $lang->widget_width = '宽度'; + $lang->widget_position = '位置'; + $lang->widget_position_none = '换行'; + $lang->widget_position_left = '左对齐'; + $lang->widget_position_right = '右对齐'; + $lang->widget_margin = '边距'; + $lang->widget_margin_top = '上'; + $lang->widget_margin_right = '右'; + $lang->widget_margin_bottom = '下'; + $lang->widget_margin_left= '左'; + $lang->about_widget_fix_width = '选择此项将固定控件显示宽度。'; + $lang->about_widget_width = '请输入宽度大小。'; + $lang->about_widget_position = '想要横向显示多个控件时,请选择位置。'; + $lang->about_widget_margin = '想要横向显示多个控件时,请设置边距。'; + $lang->about_widget_cache = '指定的时间内可以利用已缓冲的数据。'; + + $lang->generated_code = '已生成的代码'; + + $lang->msg_widget_is_not_exists = '找不到%s控件!'; + $lang->msg_widget_object_is_null = '无法生成%s控件对象!'; + $lang->msg_widget_proc_is_null = '不能执行%s控件的 proc()!'; + + $lang->about_widget_code = '输入被选控件所需要的下列各项后,按『代码生成』按钮,即可在页面下方获得可以用在布局模版代码片断。'; + $lang->about_widget_code_in_page = '输入下列各项必要值后,按“添加”按钮,即可把控件插入到页面当中。'; + $lang->about_addon = "控件是在布局或页面模块中使用的一个小部件。\n不仅可以关联内部模块或外部open api,而且通过设置可以用在多种用途。\n即使不使用Zeroboard XE的页面模块或布局模块,也可以通过『代码生成』功能直接可以添加相应控件。"; +?> diff --git a/modules/widget/tpl/css/widget.css b/modules/widget/tpl/css/widget.css new file mode 100644 index 000000000..d7ee34147 --- /dev/null +++ b/modules/widget/tpl/css/widget.css @@ -0,0 +1,8 @@ +@charset "utf-8"; + +.widget_mid_list { margin-bottom:.3em; } + +#colorset_area { margin-top:.5em; } + +#colorset_area .header { float:left; margin-right:.5em; padding-top:.2em;} +#colorset_area .footer { float:left; } diff --git a/modules/widget/tpl/downloaded_widget_list.html b/modules/widget/tpl/downloaded_widget_list.html new file mode 100644 index 000000000..1ea51c417 --- /dev/null +++ b/modules/widget/tpl/downloaded_widget_list.html @@ -0,0 +1,38 @@ +

    {$lang->widget} {$lang->cmd_management}

    + + +
    {nl2br($lang->about_addon)}
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->widget_name}{$lang->version}{$lang->author}{$lang->date}{$lang->path}{$lang->cmd_generate_code}
    + {$val->title}
    + ({$val->widget}) +
    {$val->version}{$val->author->name}{$val->author->date}{$val->path}{$lang->cmd_generate_code}
    + {nl2br($val->author->description)} +
    diff --git a/modules/widget/tpl/filter/generate_code.xml b/modules/widget/tpl/filter/generate_code.xml new file mode 100644 index 000000000..8863d39e3 --- /dev/null +++ b/modules/widget/tpl/filter/generate_code.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/modules/widget/tpl/filter/generate_code_in_page.xml b/modules/widget/tpl/filter/generate_code_in_page.xml new file mode 100644 index 000000000..b0cd9e119 --- /dev/null +++ b/modules/widget/tpl/filter/generate_code_in_page.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/modules/widget/tpl/js/widget_admin.js b/modules/widget/tpl/js/widget_admin.js new file mode 100644 index 000000000..f0a99f223 --- /dev/null +++ b/modules/widget/tpl/js/widget_admin.js @@ -0,0 +1,165 @@ +/** + * @file modules/widget/js/widget_admin.js + * @author zero (zero@nzeo.com) + * @brief widget 모듈의 관리자용 javascript + **/ + +/* 생성된 코드를 textarea에 출력 */ +function completeGenerateCode(ret_obj) { + var widget_code = ret_obj["widget_code"]; + + var zone = xGetElementById("widget_code"); + zone.value = widget_code; +} + +/* 생성된 코드를 에디터에 출력 */ +function completeGenerateCodeInPage(ret_obj,response_tags,params,fo_obj) { + var widget_code = ret_obj["widget_code"]; + var module_srl = fo_obj.module_srl.value; + if(!opener || !widget_code || !module_srl) { + window.close(); + return; + } + + // 부모창에 에디터가 있으면 에디터에 추가 + if(opener.editorGetIFrame) { + var iframe_obj = opener.editorGetIFrame(module_srl); + if(iframe_obj) { + opener.editorFocus(module_srl); + opener.editorReplaceHTML(iframe_obj, widget_code); + opener.editorFocus(module_srl); + } + } + window.close(); +} + +/* 위젯 코드 생성시 스킨을 고르면 컬러셋의 정보를 표시 */ +function doDisplaySkinColorset(sel, colorset) { + var skin = sel.options[sel.selectedIndex].value; + if(!skin) { + xGetElementById("colorset_area").style.display = "none"; + setFixedPopupSize(); + return; + } + + var params = new Array(); + params["selected_widget"] = xGetElementById("fo_widget").selected_widget.value; + params["skin"] = skin; + params["colorset"] = colorset; + + var response_tags = new Array("error","message","colorset_list"); + + exec_xml("widget", "procWidgetGetColorsetList", params, completeGetSkinColorset, response_tags, params); +} + +/* 서버에서 받아온 컬러셋을 표시 */ +function completeGetSkinColorset(ret_obj, response_tags, params, fo_obj) { + var sel = xGetElementById("fo_widget").widget_colorset; + var length = sel.options.length; + var selected_colorset = params["colorset"]; + for(var i=0;i0) type = node[0].type; + else length = 0; + + switch(type) { + case "text" : + case "textarea" : + var val = selected_node.getAttribute(name); + node.value = val; + break; + case "checkbox" : + var val = selected_node.getAttribute(name).split(','); + if(fo_obj[name].length) { + for(var i=0;i100) fo_obj.widget_width.value = 100; + } +} diff --git a/modules/widget/tpl/widget_detail_info.html b/modules/widget/tpl/widget_detail_info.html new file mode 100644 index 000000000..9229cdb67 --- /dev/null +++ b/modules/widget/tpl/widget_detail_info.html @@ -0,0 +1,37 @@ + + + +
    +

    {$lang->widget_maker}

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->title}{$widget_info->title} ver {$widget_info->version}
    {$lang->author}{$widget_info->author->name}
    {$lang->homepage}{$widget_info->author->homepage}
    {$lang->regdate}{$widget_info->author->date}
    {$lang->description}{nl2br($widget_info->author->description)}
    +
    + + diff --git a/modules/widget/tpl/widget_generate_code.html b/modules/widget/tpl/widget_generate_code.html new file mode 100644 index 000000000..f8dae44ce --- /dev/null +++ b/modules/widget/tpl/widget_generate_code.html @@ -0,0 +1,137 @@ + + + + + +
    + + +
    +

    {$lang->cmd_generate_code}

    +
    + +
    + +
    {nl2br($lang->about_widget_code)}
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->widget}{$widget_info->title} ver {$widget_info->version}
    {$lang->skin} + + + +
    {$lang->widget_cache} + {$lang->unit_min} +

    {$lang->about_widget_cache}

    +
    {$var->name} + + + + + + + + + + + +
    + + +
    + + +

    {$var->description}

    +
    {$lang->widget_margin} + + + + + + + + + + + +
    {$lang->widget_margin_top} px
    {$lang->widget_margin_left} px{$lang->widget_margin_right} px
    {$lang->widget_margin_bottom} px
    +

    {$lang->about_widget_margin}

    +
    {$lang->widget_fix_width} + {$lang->about_widget_fix_width} +
    {$lang->widget_width} + + +

    {$lang->about_widget_width}

    +
    {$lang->widget_position} + +

    {$lang->about_widget_position}

    +
    {$lang->widget_code}
    +
    + + + +
    diff --git a/modules/widget/tpl/widget_generate_code_in_page.html b/modules/widget/tpl/widget_generate_code_in_page.html new file mode 100644 index 000000000..0ec4ef3a1 --- /dev/null +++ b/modules/widget/tpl/widget_generate_code_in_page.html @@ -0,0 +1,142 @@ + + + + + +
    + + + + +
    +

    {$lang->cmd_generate_code}

    +
    + +
    + +
    {nl2br($lang->about_widget_code_in_page)}
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->widget}{$widget_info->title} ver {$widget_info->version}
    {$lang->skin} + + + +
    {$lang->widget_cache} + {$lang->unit_min} +

    {$lang->about_widget_cache}

    +
    {$var->name} + + + + + + + + + + + +
    + + +
    + + +

    {$var->description}

    +
    {$lang->widget_margin} + + + + + + + + + + + +
    {$lang->widget_margin_top} px
    {$lang->widget_margin_left} px{$lang->widget_margin_right} px
    {$lang->widget_margin_bottom} px
    +

    {$lang->about_widget_margin}

    +
    + + + + + + + + + + + + + + + + +
    {$lang->widget_fix_width} + {$lang->about_widget_fix_width} +
    {$lang->widget_width} + + +

    {$lang->about_widget_width}

    +
    {$lang->widget_position} + +

    {$lang->about_widget_position}

    +
    +
    + +
    + + diff --git a/modules/widget/widget.admin.view.php b/modules/widget/widget.admin.view.php new file mode 100644 index 000000000..82172b0a4 --- /dev/null +++ b/modules/widget/widget.admin.view.php @@ -0,0 +1,29 @@ +setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 위젯 목록을 보여줌 + **/ + function dispWidgetAdminDownloadedList() { + // 위젯 목록을 세팅 + $oWidgetModel = &getModel('widget'); + $widget_list = $oWidgetModel->getDownloadedWidgetList(); + Context::set('widget_list', $widget_list); + + $this->setTemplateFile('downloaded_widget_list'); + } + } +?> diff --git a/modules/widget/widget.class.php b/modules/widget/widget.class.php new file mode 100644 index 000000000..fcee1f982 --- /dev/null +++ b/modules/widget/widget.class.php @@ -0,0 +1,41 @@ +insertActionForward('widget', 'view', 'dispWidgetInfo'); + $oModuleController->insertActionForward('widget', 'view', 'dispWidgetGenerateCode'); + $oModuleController->insertActionForward('widget', 'view', 'dispWidgetGenerateCodePage'); + $oModuleController->insertActionForward('widget', 'view', 'dispWidgetAdminDownloadedList'); + + // widget 에서 사용할 cache디렉토리 생성 + FileHandler::makeDir('./files/cache/widget'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(); + } + } +?> diff --git a/modules/widget/widget.controller.php b/modules/widget/widget.controller.php new file mode 100644 index 000000000..51e71ee20 --- /dev/null +++ b/modules/widget/widget.controller.php @@ -0,0 +1,90 @@ +selected_widget; + + $blank_img_path = Context::getRequestUri()."common/tpl/images/widget_bg.jpg"; + + unset($vars->module); + unset($vars->act); + unset($vars->selected_widget); + + if($vars->widget_sequence) { + $cache_path = './files/cache/widget_cache/'; + $cache_file = sprintf('%s%d.%s.cache', $cache_path, $vars->widget_sequence, Context::getLangType()); + @unlink($cache_file); + } + + $vars->widget_sequence = getNextSequence(); + if(!$vars->widget_cache) $vars->widget_cache = 0; + + $attribute = array(); + if($vars) { + foreach($vars as $key => $val) { + if(strpos($val,'|@|')>0) $val = str_replace('|@|',',',$val); + $attribute[] = sprintf('%s="%s"', $key, str_replace('"','\"',$val)); + } + } + + if($vars->widget_fix_width == 'Y') { + $widget_width_type = strtolower($vars->widget_width_type); + if(!$widget_width_type||!in_array($widget_width_type,array("px","%"))) $widget_width_type = "px"; + + $style .= sprintf("%s:%s%s;", "width", trim($vars->widget_width), $widget_width_type); + + if($vars->widget_position) $style .= sprintf("%s:%s;", "float", trim($vars->widget_position)); + else $style .= "float:left;"; + $widget_code = sprintf('', $blank_img_path, $widget, implode(' ',$attribute), $style); + } else { + $style = "clear:both;"; + $widget_code = sprintf('', "100%", $blank_img_path, $style, $widget, implode(' ',$attribute)); + } + + $cache_path = './files/cache/widget_cache/'; + $cache_file = sprintf('%s%d.%s.cache', $cache_path, $vars->widget_sequence, Context::getLangType()); + @unlink($cache_file); + + // 코드 출력 + $this->add('widget_code', $widget_code); + } + + /** + * @brief 선택된 위젯 - 스킨의 컬러셋을 return + **/ + function procWidgetGetColorsetList() { + $widget = Context::get('selected_widget'); + $skin = Context::get('skin'); + + $path = sprintf('./widgets/%s/', $widget); + $oModuleModel = &getModel('module'); + $skin_info = $oModuleModel->loadSkinInfo($path, $skin); + + for($i=0;$icolorset);$i++) { + $colorset = sprintf('%s|@|%s', $skin_info->colorset[$i]->name, $skin_info->colorset[$i]->title); + $colorset_list[] = $colorset; + } + + if(count($colorset_list)) $colorsets = implode("\n", $colorset_list); + $this->add('colorset_list', $colorsets); + } + + } +?> diff --git a/modules/widget/widget.model.php b/modules/widget/widget.model.php new file mode 100644 index 000000000..c8ff39cd4 --- /dev/null +++ b/modules/widget/widget.model.php @@ -0,0 +1,131 @@ +getWidgetInfo($widget); + + $list[] = $widget_info; + } + return $list; + } + + /** + * @brief 모듈의 conf/info.xml 을 읽어서 정보를 구함 + * 이것 역시 캐싱을 통해서 xml parsing 시간을 줄인다.. + **/ + function getWidgetInfo($widget) { + // 요청된 모듈의 경로를 구한다. 없으면 return + $widget_path = $this->getWidgetPath($widget); + if(!$widget_path) return; + + // 현재 선택된 모듈의 스킨의 정보 xml 파일을 읽음 + $xml_file = sprintf("%sconf/info.xml", $widget_path); + if(!file_exists($xml_file)) return; + + // cache 파일을 비교하여 문제 없으면 include하고 $widget_info 변수를 return + $cache_file = sprintf('./files/cache/widget/%s.%s.cache.php', $widget, Context::getLangType()); + + if(file_exists($cache_file)&&filectime($cache_file)>filectime($xml_file)) { + @include($cache_file); + return $widget_info; + } + + // cache 파일이 없으면 xml parsing하고 변수화 한 후에 캐시 파일에 쓰고 변수 바로 return + $oXmlParser = new XmlParser(); + $tmp_xml_obj = $oXmlParser->loadXmlFile($xml_file); + $xml_obj = $tmp_xml_obj->widget; + if(!$xml_obj) return; + + $buff = ''; + + // 위젯의 제목, 버전 + $buff .= sprintf('$widget_info->widget = "%s";', $widget); + $buff .= sprintf('$widget_info->path = "%s";', $widget_path); + $buff .= sprintf('$widget_info->title = "%s";', $xml_obj->title->body); + $buff .= sprintf('$widget_info->version = "%s";', $xml_obj->attrs->version); + $buff .= sprintf('$widget_info->widget_srl = $widget_srl;'); + $buff .= sprintf('$widget_info->widget_title = $widget_title;'); + + // 작성자 정보 + $buff .= sprintf('$widget_info->author->name = "%s";', $xml_obj->author->name->body); + $buff .= sprintf('$widget_info->author->email_address = "%s";', $xml_obj->author->attrs->email_address); + $buff .= sprintf('$widget_info->author->homepage = "%s";', $xml_obj->author->attrs->link); + $buff .= sprintf('$widget_info->author->date = "%s";', $xml_obj->author->attrs->date); + $buff .= sprintf('$widget_info->author->description = "%s";', $xml_obj->author->description->body); + + // 추가 변수 (템플릿에서 사용할 제작자 정의 변수) + if(!is_array($xml_obj->extra_vars->var)) $extra_vars[] = $xml_obj->extra_vars->var; + else $extra_vars = $xml_obj->extra_vars->var; + if($extra_vars[0]->attrs->id) { + $extra_var_count = count($extra_vars); + + $buff .= sprintf('$widget_info->extra_var_count = "%s";', $extra_var_count); + for($i=0;$i<$extra_var_count;$i++) { + unset($var); + unset($options); + $var = $extra_vars[$i]; + + $buff .= sprintf('$widget_info->extra_var->%s->name = "%s";', $var->attrs->id, $var->name->body); + $buff .= sprintf('$widget_info->extra_var->%s->type = "%s";', $var->attrs->id, $var->type->body); + $buff .= sprintf('$widget_info->extra_var->%s->value = $vars->%s;', $var->attrs->id, $var->attrs->id); + $buff .= sprintf('$widget_info->extra_var->%s->description = "%s";', $var->attrs->id, str_replace('"','\"',$var->description->body)); + + $options = $var->options; + if(!$options) continue; + + if(!is_array($options)) $options = array($options); + $options_count = count($options); + for($j=0;$j<$options_count;$j++) { + $buff .= sprintf('$widget_info->extra_var->%s->options["%s"] = "%s";', $var->attrs->id, $options[$j]->value->body, $options[$j]->name->body); + } + + } + } + + $buff = ''; + FileHandler::writeFile($cache_file, $buff); + + if(file_exists($cache_file)) @include($cache_file); + return $widget_info; + } + + } +?> diff --git a/modules/widget/widget.view.php b/modules/widget/widget.view.php new file mode 100644 index 000000000..b60e56e60 --- /dev/null +++ b/modules/widget/widget.view.php @@ -0,0 +1,67 @@ +setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 위젯의 상세 정보(conf/info.xml)를 팝업 출력 + **/ + function dispWidgetInfo() { + // 선택된 위젯 정보를 구함 + $oWidgetModel = &getModel('widget'); + $widget_info = $oWidgetModel->getWidgetInfo(Context::get('selected_widget')); + Context::set('widget_info', $widget_info); + + // 위젯을 팝업으로 지정 + $this->setLayoutFile('popup_layout'); + + // 템플릿 파일 지정 + $this->setTemplateFile('widget_detail_info'); + } + + /** + * @brief 위젯의 코드 생성기 + **/ + function dispWidgetGenerateCode() { + // 선택된 위젯 정보를 구함 + $oWidgetModel = &getModel('widget'); + $widget_info = $oWidgetModel->getWidgetInfo(Context::get('selected_widget')); + Context::set('widget_info', $widget_info); + + // mid 목록을 가져옴 + $oModuleModel = &getModel('module'); + $mid_list = $oModuleModel->getMidList(); + Context::set('mid_list', $mid_list); + + // 스킨의 정보를 구함 + $skin_list = $oModuleModel->getSkins($widget_info->path); + Context::set('skin_list', $skin_list); + + // 위젯을 팝업으로 지정 + $this->setLayoutFile('popup_layout'); + + // 템플릿 파일 지정 + $this->setTemplateFile('widget_generate_code'); + } + + /** + * @brief 페이지 관리에서 사용될 코드 생성 팝업 + **/ + function dispWidgetGenerateCodeInPage() { + $this->dispWidgetGenerateCode(); + $this->setTemplateFile('widget_generate_code_in_page'); + } + + } +?> diff --git a/widgets/DroArc_clock/DroArc_clock.class.php b/widgets/DroArc_clock/DroArc_clock.class.php new file mode 100644 index 000000000..e1d2f8e31 --- /dev/null +++ b/widgets/DroArc_clock/DroArc_clock.class.php @@ -0,0 +1,42 @@ +widget_path, $args->skin); + $colorset = $args->colorset; + + // 템플릿 파일을 지정 + $tpl_file = 'clock'; + + $clock_width = $args->clock_width; + if(!$clock_width) $clock_width = 150; + $clock_height = $args->clock_height; + if(!$clock_height) $clock_height = 64; + + $widget_info->clock_width = $clock_width; + $widget_info->clock_height = $clock_height; + + $widget_info->src = sprintf("%s%s/%s/clock.swf", Context::getRequestUri(), $tpl_path, $colorset); + + Context::set('widget_info', $widget_info); + + // 템플릿 컴파일 + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + } +?> diff --git a/widgets/DroArc_clock/conf/info.xml b/widgets/DroArc_clock/conf/info.xml new file mode 100644 index 000000000..8446e27ef --- /dev/null +++ b/widgets/DroArc_clock/conf/info.xml @@ -0,0 +1,41 @@ + + + 플래시 디지털 시계 + Flash数字时钟 + デジタル時計 + Flash digital Clock + + 드로아크 + DroArc + DroArc + DroArc + 플래쉬로 된 디지털 시계를 출력합니다. + 显示Flash数字时钟。 + フラッシュのデジタル時計を表示します。 + This widget displays a digital clock made of flash. + + + + 가로길이 + 宽度 + 横幅 + Width + text + 가로길이를 지정하실 수 있습니다. (기본 150px) + 可以设置宽度大小。 (默认为 150px) + 横幅のサイズを指定することができます(デフォルト150px)。 + It will be able to set the width. (default is 150px) + + + 세로길이 + 高度 + 縦幅 + Height + text + 세로길이를 지정하실 수 있습니다. (기본 64px) + 可以设置高度大小。(默认为 64px) + 縦幅のサイズを指定することができます(デフォルト64px)。 + It will be able to set the width. (default is 64px) + + + diff --git a/widgets/DroArc_clock/skins/default/black/clock.swf b/widgets/DroArc_clock/skins/default/black/clock.swf new file mode 100644 index 000000000..69053c365 Binary files /dev/null and b/widgets/DroArc_clock/skins/default/black/clock.swf differ diff --git a/widgets/DroArc_clock/skins/default/clock.html b/widgets/DroArc_clock/skins/default/clock.html new file mode 100644 index 000000000..4393900f4 --- /dev/null +++ b/widgets/DroArc_clock/skins/default/clock.html @@ -0,0 +1,3 @@ + diff --git a/widgets/DroArc_clock/skins/default/green/clock.swf b/widgets/DroArc_clock/skins/default/green/clock.swf new file mode 100644 index 000000000..2a9bb0414 Binary files /dev/null and b/widgets/DroArc_clock/skins/default/green/clock.swf differ diff --git a/widgets/DroArc_clock/skins/default/orange/clock.swf b/widgets/DroArc_clock/skins/default/orange/clock.swf new file mode 100644 index 000000000..ae9c633e4 Binary files /dev/null and b/widgets/DroArc_clock/skins/default/orange/clock.swf differ diff --git a/widgets/DroArc_clock/skins/default/pink/clock.swf b/widgets/DroArc_clock/skins/default/pink/clock.swf new file mode 100644 index 000000000..cff21cc4d Binary files /dev/null and b/widgets/DroArc_clock/skins/default/pink/clock.swf differ diff --git a/widgets/DroArc_clock/skins/default/red/clock.swf b/widgets/DroArc_clock/skins/default/red/clock.swf new file mode 100644 index 000000000..a705eba98 Binary files /dev/null and b/widgets/DroArc_clock/skins/default/red/clock.swf differ diff --git a/widgets/DroArc_clock/skins/default/skin.xml b/widgets/DroArc_clock/skins/default/skin.xml new file mode 100644 index 000000000..0b6422e8a --- /dev/null +++ b/widgets/DroArc_clock/skins/default/skin.xml @@ -0,0 +1,47 @@ + + + 플래시 디지털 시계 + Flash数字时钟 + Flash Digital Clock + + 드로아크 + DroArc + DroArc + 플래시 디지털 시계를 출력합니다. + 显示Flash数字时钟。 + It displays flash digital clock. + + + + 블랙 + 黑色 + ブラック + Black + + + 핑크 + 粉红色 + ピンク + Pink + + + 그린 + 绿色 + グリーン + Green + + + 레드 + 红色 + レッド + Red + + + 오렌지 + 橘黄色 + オレンジ + Orange + + + + diff --git a/widgets/archive_list/archive_list.class.php b/widgets/archive_list/archive_list.class.php new file mode 100644 index 000000000..542073b49 --- /dev/null +++ b/widgets/archive_list/archive_list.class.php @@ -0,0 +1,49 @@ +title; + $mid_list = explode(",",$args->mid_list); + + // DocumentModel::getMonthlyArchivedList()를 이용하기 위한 변수 정리 + $obj->mid = $mid_list; + + // document 모듈의 model 객체를 받아서 getMonthlyArchivedList() method를 실행 + $oDocumentModel = &getModel('document'); + $output = $oDocumentModel->getMonthlyArchivedList($obj); + + // 템플릿 파일에서 사용할 변수들을 세팅 + if(count($mid_list)==1) $widget_info->module_name = $mid_list[0]; + + $widget_info->title = $title; + $widget_info->archive_list = $output->data; + + Context::set('widget_info', $widget_info); + + // 템플릿의 스킨 경로를 지정 (skin, colorset에 따른 값을 설정) + $tpl_path = sprintf('%sskins/%s', $this->widget_path, $args->skin); + Context::set('colorset', $args->colorset); + + // 템플릿 파일을 지정 + $tpl_file = 'archive_list'; + + // 템플릿 컴파일 + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + } +?> diff --git a/widgets/archive_list/conf/info.xml b/widgets/archive_list/conf/info.xml new file mode 100644 index 000000000..437fefe5e --- /dev/null +++ b/widgets/archive_list/conf/info.xml @@ -0,0 +1,52 @@ + + + 월별 보관 현황 출력 + 存档 + バックアップリスト + Report of Stored-Articles by Month + + 제로 + zero + Zero + zero + + 선택된 모듈의 월별 글 보관 현황을 보여줍니다. + 글의 수가 너무 많을 경우 부하가 심해질 수 있습니다. + + + 按月统计被择模块的主题数。 + 主题过多可能会导致服务器超负荷运行。 + + + 選択されたモジュールの月別コンテンツのバクアップリストを表示します。書き込みが多いと負荷がかかる場合があります。 + + + This widget displays the present status of stored-articles selected module by month. + If there are lots of articles stored, the server may get a serious load. + + + + + 제목 + 栏目名 + タイトル + Title + text + 보관 현황 제목으로 출력됩니다. + 将显示为存档标题。 + バックアップリストのタイトルとして出力されます。 + It will be the title of the report. + + + 대상 모듈 + 对象模块 + モジュール + Target Module + mid_list + 선택하신 모듈에 등록된 글을 대상으로 합니다. + 把被选模块作为统计对象。 + チェックされたモジュールに登録されたコンテンツ(書き込み)を対象とします。 + The target articles will be the ones submitted in the selected module. + + + diff --git a/widgets/archive_list/skins/blog_archive_list/archive_list.html b/widgets/archive_list/skins/blog_archive_list/archive_list.html new file mode 100644 index 000000000..8f3d00725 --- /dev/null +++ b/widgets/archive_list/skins/blog_archive_list/archive_list.html @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + +
    +
    + +

    {$widget_info->title}

    + +

    archives

    + +
    + + +
    diff --git a/widgets/archive_list/skins/blog_archive_list/css/cyan.css b/widgets/archive_list/skins/blog_archive_list/css/cyan.css new file mode 100644 index 000000000..429103a65 --- /dev/null +++ b/widgets/archive_list/skins/blog_archive_list/css/cyan.css @@ -0,0 +1,6 @@ +div#archive { position:relative; border:1px solid #e0e1db; background:url(../images/cyan/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +div#archive h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +div#archive .archiveList { padding:.4em 1.2em .4em 1.2em; overflow:hidden;} +div#archive .archiveList li { font-size:.75em; display:block; color:#a4a4a4; margin-right:.1em; line-height:1.5em; font-family:tahoma; } +div#archive .archiveList li a { color:#a4a4a4; font-weight:bold; margin-right:1em; font-family:tahoma;} diff --git a/widgets/archive_list/skins/blog_archive_list/css/green.css b/widgets/archive_list/skins/blog_archive_list/css/green.css new file mode 100644 index 000000000..9c9ab8e4b --- /dev/null +++ b/widgets/archive_list/skins/blog_archive_list/css/green.css @@ -0,0 +1,6 @@ +div#archive { position:relative; border:1px solid #e0e1db; background:url(../images/green/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +div#archive h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +div#archive .archiveList { padding:.4em 1.2em .4em 1.2em; overflow:hidden;} +div#archive .archiveList li { font-size:.75em; display:block; color:#a4a4a4; margin-right:.1em; line-height:1.5em; font-family:tahoma; } +div#archive .archiveList li a { color:#a4a4a4; font-weight:bold; margin-right:1em; font-family:tahoma;} diff --git a/widgets/archive_list/skins/blog_archive_list/css/normal.css b/widgets/archive_list/skins/blog_archive_list/css/normal.css new file mode 100644 index 000000000..d61f0f0d5 --- /dev/null +++ b/widgets/archive_list/skins/blog_archive_list/css/normal.css @@ -0,0 +1,6 @@ +div#archive { position:relative; border:1px solid #e0e1db; background:url(../images/normal/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +div#archive h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +div#archive .archiveList { padding:.4em 1.2em .4em 1.2em; overflow:hidden;} +div#archive .archiveList li { font-size:.75em; display:block; color:#a4a4a4; margin-right:.1em; line-height:1.5em; font-family:tahoma; } +div#archive .archiveList li a { color:#a4a4a4; font-weight:bold; margin-right:1em; font-family:tahoma;} diff --git a/widgets/archive_list/skins/blog_archive_list/css/purple.css b/widgets/archive_list/skins/blog_archive_list/css/purple.css new file mode 100644 index 000000000..c641b59e7 --- /dev/null +++ b/widgets/archive_list/skins/blog_archive_list/css/purple.css @@ -0,0 +1,6 @@ +div#archive { position:relative; border:1px solid #e0e1db; background:url(../images/purple/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +div#archive h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +div#archive .archiveList { padding:.4em 1.2em .4em 1.2em; overflow:hidden;} +div#archive .archiveList li { font-size:.75em; display:block; color:#a4a4a4; margin-right:.1em; line-height:1.5em; font-family:tahoma; } +div#archive .archiveList li a { color:#a4a4a4; font-weight:bold; margin-right:1em; font-family:tahoma;} diff --git a/widgets/archive_list/skins/blog_archive_list/css/red.css b/widgets/archive_list/skins/blog_archive_list/css/red.css new file mode 100644 index 000000000..e044229dd --- /dev/null +++ b/widgets/archive_list/skins/blog_archive_list/css/red.css @@ -0,0 +1,6 @@ +div#archive { position:relative; border:1px solid #e0e1db; background:url(../images/red/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +div#archive h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +div#archive .archiveList { padding:.4em 1.2em .4em 1.2em; overflow:hidden;} +div#archive .archiveList li { font-size:.75em; display:block; color:#a4a4a4; margin-right:.1em; line-height:1.5em; font-family:tahoma; } +div#archive .archiveList li a { color:#a4a4a4; font-weight:bold; margin-right:1em; font-family:tahoma;} diff --git a/widgets/archive_list/skins/blog_archive_list/images/cyan/bgBoxTypeB.gif b/widgets/archive_list/skins/blog_archive_list/images/cyan/bgBoxTypeB.gif new file mode 100644 index 000000000..99a877045 Binary files /dev/null and b/widgets/archive_list/skins/blog_archive_list/images/cyan/bgBoxTypeB.gif differ diff --git a/widgets/archive_list/skins/blog_archive_list/images/green/bgBoxTypeB.gif b/widgets/archive_list/skins/blog_archive_list/images/green/bgBoxTypeB.gif new file mode 100644 index 000000000..1cdca75c2 Binary files /dev/null and b/widgets/archive_list/skins/blog_archive_list/images/green/bgBoxTypeB.gif differ diff --git a/widgets/archive_list/skins/blog_archive_list/images/normal/bgBoxTypeB.gif b/widgets/archive_list/skins/blog_archive_list/images/normal/bgBoxTypeB.gif new file mode 100644 index 000000000..09f7dd59c Binary files /dev/null and b/widgets/archive_list/skins/blog_archive_list/images/normal/bgBoxTypeB.gif differ diff --git a/widgets/archive_list/skins/blog_archive_list/images/purple/bgBoxTypeB.gif b/widgets/archive_list/skins/blog_archive_list/images/purple/bgBoxTypeB.gif new file mode 100644 index 000000000..9e130ae44 Binary files /dev/null and b/widgets/archive_list/skins/blog_archive_list/images/purple/bgBoxTypeB.gif differ diff --git a/widgets/archive_list/skins/blog_archive_list/images/red/bgBoxTypeB.gif b/widgets/archive_list/skins/blog_archive_list/images/red/bgBoxTypeB.gif new file mode 100644 index 000000000..01406b48a Binary files /dev/null and b/widgets/archive_list/skins/blog_archive_list/images/red/bgBoxTypeB.gif differ diff --git a/widgets/archive_list/skins/blog_archive_list/skin.xml b/widgets/archive_list/skins/blog_archive_list/skin.xml new file mode 100644 index 000000000..06e275ad6 --- /dev/null +++ b/widgets/archive_list/skins/blog_archive_list/skin.xml @@ -0,0 +1,48 @@ + + + 월별 보관 현황 목록 출력 + 月別のアーカイブリスト表示 + 存档列表默认皮肤 + Monthly Custody Status + + 제로 + zero + zero + 월별 보관 현황 목록을 출력합니다. + 月別のアーカイブリストを表示します。 + 显示存档列表。 + It displays monthly custody status. + + + + 기본 컬러 + デフォルトカラー + 默认颜色 + Default color + + + 청록색 + cyan + 青绿色 + cyan + + + 초록색 + green + 绿色 + green + + + 빨간색 + red + 红色 + red + + + 보라색 + purple + 紫色 + purple + + + diff --git a/widgets/archive_list/skins/cozy_simple/archive_list.html b/widgets/archive_list/skins/cozy_simple/archive_list.html new file mode 100644 index 000000000..bb317cc60 --- /dev/null +++ b/widgets/archive_list/skins/cozy_simple/archive_list.html @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + +
    +
    + +

    {$widget_info->title}

    + +

    archives

    + +
    + + +
    diff --git a/widgets/archive_list/skins/cozy_simple/css/blue.css b/widgets/archive_list/skins/cozy_simple/css/blue.css new file mode 100644 index 000000000..f0fb7138b --- /dev/null +++ b/widgets/archive_list/skins/cozy_simple/css/blue.css @@ -0,0 +1 @@ +div.archiveBox .header h2 { font-size:1em; color:#1187d8;} diff --git a/widgets/archive_list/skins/cozy_simple/css/bluish_green.css b/widgets/archive_list/skins/cozy_simple/css/bluish_green.css new file mode 100644 index 000000000..e21255c50 --- /dev/null +++ b/widgets/archive_list/skins/cozy_simple/css/bluish_green.css @@ -0,0 +1 @@ +div.archiveBox .header h2 { font-size:1em; color:#9ab09f;} diff --git a/widgets/archive_list/skins/cozy_simple/css/common.css b/widgets/archive_list/skins/cozy_simple/css/common.css new file mode 100644 index 000000000..2cabfbb51 --- /dev/null +++ b/widgets/archive_list/skins/cozy_simple/css/common.css @@ -0,0 +1,11 @@ +div.archiveBox { padding-bottom:1em;} +div.archiveBox .header { padding:7px 0 0 12px; height:21px; _height:20px; background:#f5f5f5; } +*:first-child+html div.archiveBox .header { height:20px; color:#ef2121;} + +div.archiveBox ul { padding:.5em; overflow:hidden;} +div.archiveBox ul li { color:#a4a4a4; margin-right:.1em; line-height:1.5em; font-size:.9em;} +div.archiveBox ul li a { font-size:.9em; color:#a4a4a4;} +div.archiveBox ul li.typeA a { color:#717171; font-weight:bold;} +div.archiveBox ul li.typeB a { color:#3d3d3d;} +div.archiveBox ul li.typeC a { font-weight:bold;} +div.archiveBox .tag_sort { width:100%; border-top:1px dashed #ababab; border-bottom:1px dashed #ababab; text-align:center; overflow:hidden;} diff --git a/widgets/archive_list/skins/cozy_simple/css/green.css b/widgets/archive_list/skins/cozy_simple/css/green.css new file mode 100644 index 000000000..2b13656ea --- /dev/null +++ b/widgets/archive_list/skins/cozy_simple/css/green.css @@ -0,0 +1 @@ +div.archiveBox .header h2 { font-size:1em; color:#8dc63f;} diff --git a/widgets/archive_list/skins/cozy_simple/css/pink.css b/widgets/archive_list/skins/cozy_simple/css/pink.css new file mode 100644 index 000000000..9532eb080 --- /dev/null +++ b/widgets/archive_list/skins/cozy_simple/css/pink.css @@ -0,0 +1 @@ +div.archiveBox .header h2 { font-size:1em; color:#f70795;} diff --git a/widgets/archive_list/skins/cozy_simple/css/red.css b/widgets/archive_list/skins/cozy_simple/css/red.css new file mode 100644 index 000000000..602191381 --- /dev/null +++ b/widgets/archive_list/skins/cozy_simple/css/red.css @@ -0,0 +1 @@ +div.archiveBox .header h2 { font-size:1em; color:#ef2121;} diff --git a/widgets/archive_list/skins/cozy_simple/skin.xml b/widgets/archive_list/skins/cozy_simple/skin.xml new file mode 100644 index 000000000..fff47a26f --- /dev/null +++ b/widgets/archive_list/skins/cozy_simple/skin.xml @@ -0,0 +1,65 @@ + + + cozy simple + Cozyシンプル + cozy simple skin + Cozy样式皮肤 + + 제로 + 제로 + zero + Zero + + cozy simple 위젯입니다. + 디자인 : 서기정 (http://blog.naver.com/addcozy) + HTML/CSS : 소지훈 + + + Cozyシンプルウィジェットです。 + デザイン:ソギジョン(http://blog.naver.com/addcozy) + HTML/CSS:ソジフン + + + This is cozy simple widget. + Design : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + Cozy样式皮肤。 + 设计 : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + + + 빨간색 + + Red + 红色 + + + 초록색 + + Green + 绿色 + + + 파란색 + + Blue + 蓝色 + + + 분홍색 + ピンク + Pink + 粉红色 + + + 청록색 + 青緑 + Cyan + 青绿色 + + + diff --git a/widgets/calendar/calendar.class.php b/widgets/calendar/calendar.class.php new file mode 100644 index 000000000..a3e5ce25b --- /dev/null +++ b/widgets/calendar/calendar.class.php @@ -0,0 +1,65 @@ +title; + $mid_list = explode(",",$args->mid_list); + + // DocumentModel::getDailyArchivedList()를 이용하기 위한 변수 정리 + $obj->mid = $mid_list; + + if(Context::get('search_target')=='regdate') { + $regdate = Context::get('search_keyword'); + if($regdate) $obj->regdate = zdate($regdate, 'Ym'); + } + if(!$obj->regdate) $obj->regdate = date('Ym'); + + // document 모듈의 model 객체를 받아서 getDailyArchivedList() method를 실행 + $oDocumentModel = &getModel('document'); + $output = $oDocumentModel->getDailyArchivedList($obj); + + // 템플릿 파일에서 사용할 변수들을 세팅 + $widget_info->cur_date = $obj->regdate; + $widget_info->today_str = sprintf('%4d%s %2d%s',zdate($obj->regdate, 'Y'), Context::getLang('unit_year'), zdate($obj->regdate,'m'), Context::getLang('unit_month')); + $widget_info->last_day = date('t', ztime($obj->regdate)); + $widget_info->start_week= date('w', ztime($obj->regdate)); + + $widget_info->prev_month = date('Ym', mktime(1,0,0,zdate($obj->regdate,'m'),1,zdate($obj->regdate,'Y'))-60*60*24); + $widget_info->next_month = date('Ym', mktime(1,0,0,zdate($obj->regdate,'m'),$widget_info->last_day,zdate($obj->regdate,'Y'))+60*60*24); + + if(count($mid_list)==1) $widget_info->module_name = $mid_list[0]; + $widget_info->title = $title; + + if(count($output->data)) { + foreach($output->data as $key => $val) $widget_info->calendar[$val->month] = $val->count; + } + + Context::set('widget_info', $widget_info); + + // 템플릿의 스킨 경로를 지정 (skin, colorset에 따른 값을 설정) + $tpl_path = sprintf('%sskins/%s', $this->widget_path, $args->skin); + Context::set('colorset', $args->colorset); + + // 템플릿 파일을 지정 + $tpl_file = 'calendar'; + + // 템플릿 컴파일 + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + } +?> diff --git a/widgets/calendar/conf/info.xml b/widgets/calendar/conf/info.xml new file mode 100644 index 000000000..2955bbdd5 --- /dev/null +++ b/widgets/calendar/conf/info.xml @@ -0,0 +1,30 @@ + + + 달력 출력 + 日历 + カレンダー表示 + Display Calendar + + 제로 + zero + Zero + zero + 달력을 표시하고 등록된 글이 있는 날에 표시와 링크를 해줍니다. + 显示日历,发表主题日期将跟日历相关联。 + カレンダーを表示して書き込みがあった日にリンクを張ります。 + This widget displays a calendar, and if there is an article submitted, the date will be highlighted with its url link. + + + + 대상 모듈 + 模块对象 + モジュール + Target Module + mid_list + 선택하신 모듈에 등록된 글을 대상으로 합니다. + 将把被选模块作为关联对象。 + チェックされたモジュールに登録されたコンテンツ(書き込み)を対象とします。 + The target articles will be the ones submitted in the selected module. + + + diff --git a/widgets/calendar/skins/blog_calendar_list/calendar.html b/widgets/calendar/skins/blog_calendar_list/calendar.html new file mode 100644 index 000000000..59d0b6d71 --- /dev/null +++ b/widgets/calendar/skins/blog_calendar_list/calendar.html @@ -0,0 +1,60 @@ + + + + +
    + + + + + {@ $day = ''} + + + + + + + {@ $num = $i*7 + $j} + + {@ $started = true} + {@ $day = 1} + {@ $cur_date = $widget_info->cur_date.sprintf('%02d',$day) } + + {@ $day++} + {@ $cur_date = $widget_info->cur_date.sprintf('%02d',$day) } + + + {@ $today_class = "today"}{@ $today_class = ""} + + {@ $cell_class_name = "sun"}{@ $cell_class_name = ""} + + + {@ $item_class_name = "posted"} + + {@ $day_link = getUrl('','mid',$layout_info->mid,'search_target','regdate','search_keyword',$cur_date) } + + {@ $day_link = getUrl('','mid',$mid,'search_target','regdate','search_keyword',$cur_date) } + + + {@ $item_class_name = ""} + {@ $day_link = ''} + + + + + + + + +
    + prev{zdate($widget_info->cur_date,"Y")}.{zdate($widget_info->cur_date,"m")}next +
    + + + {$day} + + {$day} + + +
    +
    diff --git a/widgets/calendar/skins/blog_calendar_list/css/normal.css b/widgets/calendar/skins/blog_calendar_list/css/normal.css new file mode 100644 index 000000000..f61bd3344 --- /dev/null +++ b/widgets/calendar/skins/blog_calendar_list/css/normal.css @@ -0,0 +1,18 @@ +/* Calendar */ +div#calendar { padding:1.2em .8em; position:relative; border:1px solid #e0e1db; margin-bottom:.7em;} +div#calendar table { width:100%;} +div#calendar table caption { font:bold 1.5em Tahoma; color:#9a9a9a; padding-bottom:.6em;} +div#calendar table caption .mm { font:bold 1em Tahoma; color:#54564b;} +div#calendar table caption a { padding:.2em;} +div#calendar table caption a img { vertical-align:middle;} +div#calendar table th, +div#calendar table td { padding:.25em 0;} +div#calendar table th { font-weight:normal; font-size:.9em; color:#9a9a9a;} +div#calendar table th.sun { color:#fe3614;} +div#calendar table td { text-align:center;} +div#calendar table td a { font:.9em Tahoma; color:#9a9a9a;} +div#calendar table td.sun { color:#fe3614;} +div#calendar table td.sun a { color:#fe3614;} +div#calendar table td.today { font-weight:bold; color:#54564b;} +div#calendar table td.today a { font-weight:bold; color:#54564b;} +div#calendar table td.posted a { text-decoration:underline;} diff --git a/widgets/calendar/skins/blog_calendar_list/images/buttonArrowCalendarLeft.gif b/widgets/calendar/skins/blog_calendar_list/images/buttonArrowCalendarLeft.gif new file mode 100644 index 000000000..6910d8085 Binary files /dev/null and b/widgets/calendar/skins/blog_calendar_list/images/buttonArrowCalendarLeft.gif differ diff --git a/widgets/calendar/skins/blog_calendar_list/images/buttonArrowCalendarRight.gif b/widgets/calendar/skins/blog_calendar_list/images/buttonArrowCalendarRight.gif new file mode 100644 index 000000000..fc204719f Binary files /dev/null and b/widgets/calendar/skins/blog_calendar_list/images/buttonArrowCalendarRight.gif differ diff --git a/widgets/calendar/skins/blog_calendar_list/skin.xml b/widgets/calendar/skins/blog_calendar_list/skin.xml new file mode 100644 index 000000000..58e852682 --- /dev/null +++ b/widgets/calendar/skins/blog_calendar_list/skin.xml @@ -0,0 +1,49 @@ + + + 달력 및 글 현황 표시 + カレンダーと書き込みリンク表示 + 日历默认皮肤 + Display Calendar and Article Status + + 제로 + Zero + zero + zero + calendar위젯의 블로그에 어울리는 기본 스킨입니다. + カレンダー(calendar)ウィジェットのブログに適したデフォルトスキンです。 + 适合用于博客的日历默认皮肤。 + It is a default skin which matches with calendar widget's blog well. + + + + 기본 컬러 + デフォルトカラー + 默认颜色 + Default color + + + 청록색 + cyan + 青绿色 + cyan + + + 초록색 + green + 绿色 + green + + + 빨간색 + red + 红色 + red + + + 보라색 + purple + 紫色 + purple + + + diff --git a/widgets/calendar/skins/cozy_simple/calendar.html b/widgets/calendar/skins/cozy_simple/calendar.html new file mode 100644 index 000000000..79bb2e463 --- /dev/null +++ b/widgets/calendar/skins/cozy_simple/calendar.html @@ -0,0 +1,84 @@ + + + + + + + + + + + + + {@ $colorset = "red" } + + + +
    + + + + + + + + + + + + + + + + {@ $day = ''} + + + + + + + {@ $num = $i*7 + $j} + + {@ $started = true} + {@ $day = 1} + {@ $cur_date = $widget_info->cur_date.sprintf('%02d',$day) } + + {@ $day++} + {@ $cur_date = $widget_info->cur_date.sprintf('%02d',$day) } + + + {@ $today_class = "today"}{@ $today_class = ""} + + {@ $cell_class_name = "sun"}{@ $cell_class_name = ""} + + + {@ $item_class_name = "posted"} + + {@ $day_link = getUrl('','mid',$layout_info->mid,'search_target','regdate','search_keyword',$cur_date) } + + {@ $day_link = getUrl('','mid',$mid,'search_target','regdate','search_keyword',$cur_date) } + + + {@ $item_class_name = ""} + {@ $day_link = ''} + + + + + + + + +
    + {zdate($widget_info->cur_date,"Y")}.{zdate($widget_info->cur_date,"m")} + prevnext +
    SMTWTFS
    + + + {$day} + + {$day} + + +
    +
    diff --git a/widgets/calendar/skins/cozy_simple/css/blue.css b/widgets/calendar/skins/cozy_simple/css/blue.css new file mode 100644 index 000000000..df39703e1 --- /dev/null +++ b/widgets/calendar/skins/cozy_simple/css/blue.css @@ -0,0 +1 @@ +div.calendarBox table caption { font:bold 1em 돋움; color:#1187d8; padding:1em;} diff --git a/widgets/calendar/skins/cozy_simple/css/bluish_green.css b/widgets/calendar/skins/cozy_simple/css/bluish_green.css new file mode 100644 index 000000000..5958ce4cf --- /dev/null +++ b/widgets/calendar/skins/cozy_simple/css/bluish_green.css @@ -0,0 +1 @@ +div.calendarBox table caption { font:bold 1em 돋움; color:#9ab09f; padding:1em;} diff --git a/widgets/calendar/skins/cozy_simple/css/common.css b/widgets/calendar/skins/cozy_simple/css/common.css new file mode 100644 index 000000000..99a74cc24 --- /dev/null +++ b/widgets/calendar/skins/cozy_simple/css/common.css @@ -0,0 +1,17 @@ +div.calendarBox {} +div.calendarBox table { width:100%; background:url(../images/bg_line_dot_x.gif) repeat-x left top;} +div.calendarBox table caption .mm { font:bold 1em 돋움; color:#555650;} +div.calendarBox table caption a { padding:.2em;} +div.calendarBox table caption a img { vertical-align:middle;} +div.calendarBox table th { padding:.6em 0;} +div.calendarBox table td { padding:.25em 0;} +div.calendarBox table th { font:bold .7em tahoma; color:#717171;} +div.calendarBox table th.sun { color:#000000;} +div.calendarBox table td { text-align:center; font:.8em Tahoma; color:#9a9a9a;} +div.calendarBox table td a { font:.7em Tahoma; color:#9a9a9a;} +div.calendarBox table td.sun { color:#000000;} +div.calendarBox table td.sun a { color:#000000;} +div.calendarBox table td.today a { font-weight:bold; color:#54564b;} +div.calendarBox table td.posted a { text-decoration:underline;} + + diff --git a/widgets/calendar/skins/cozy_simple/css/green.css b/widgets/calendar/skins/cozy_simple/css/green.css new file mode 100644 index 000000000..2ecf05d47 --- /dev/null +++ b/widgets/calendar/skins/cozy_simple/css/green.css @@ -0,0 +1 @@ +div.calendarBox table caption { font:bold 1em 돋움; color:#8dc63f; padding:1em;} diff --git a/widgets/calendar/skins/cozy_simple/css/pink.css b/widgets/calendar/skins/cozy_simple/css/pink.css new file mode 100644 index 000000000..674d0771a --- /dev/null +++ b/widgets/calendar/skins/cozy_simple/css/pink.css @@ -0,0 +1 @@ +div.calendarBox table caption { font:bold 1em 돋움; color:#f70795; padding:1em;} diff --git a/widgets/calendar/skins/cozy_simple/css/red.css b/widgets/calendar/skins/cozy_simple/css/red.css new file mode 100644 index 000000000..00f106ad0 --- /dev/null +++ b/widgets/calendar/skins/cozy_simple/css/red.css @@ -0,0 +1 @@ +div.calendarBox table caption { font:bold 1em 돋움; color:#ec1a25; padding:1em;} diff --git a/widgets/calendar/skins/cozy_simple/images/bg_line_dot_x.gif b/widgets/calendar/skins/cozy_simple/images/bg_line_dot_x.gif new file mode 100644 index 000000000..e1d6cb51e Binary files /dev/null and b/widgets/calendar/skins/cozy_simple/images/bg_line_dot_x.gif differ diff --git a/widgets/calendar/skins/cozy_simple/images/blue/buttonArrowCalendarLeft.gif b/widgets/calendar/skins/cozy_simple/images/blue/buttonArrowCalendarLeft.gif new file mode 100644 index 000000000..df4bf6d87 Binary files /dev/null and b/widgets/calendar/skins/cozy_simple/images/blue/buttonArrowCalendarLeft.gif differ diff --git a/widgets/calendar/skins/cozy_simple/images/blue/buttonArrowCalendarRight.gif b/widgets/calendar/skins/cozy_simple/images/blue/buttonArrowCalendarRight.gif new file mode 100644 index 000000000..dce26c455 Binary files /dev/null and b/widgets/calendar/skins/cozy_simple/images/blue/buttonArrowCalendarRight.gif differ diff --git a/widgets/calendar/skins/cozy_simple/images/bluish_green/buttonArrowCalendarLeft.gif b/widgets/calendar/skins/cozy_simple/images/bluish_green/buttonArrowCalendarLeft.gif new file mode 100644 index 000000000..cc85ba5f7 Binary files /dev/null and b/widgets/calendar/skins/cozy_simple/images/bluish_green/buttonArrowCalendarLeft.gif differ diff --git a/widgets/calendar/skins/cozy_simple/images/bluish_green/buttonArrowCalendarRight.gif b/widgets/calendar/skins/cozy_simple/images/bluish_green/buttonArrowCalendarRight.gif new file mode 100644 index 000000000..c3907747d Binary files /dev/null and b/widgets/calendar/skins/cozy_simple/images/bluish_green/buttonArrowCalendarRight.gif differ diff --git a/widgets/calendar/skins/cozy_simple/images/green/buttonArrowCalendarLeft.gif b/widgets/calendar/skins/cozy_simple/images/green/buttonArrowCalendarLeft.gif new file mode 100644 index 000000000..c1de473c8 Binary files /dev/null and b/widgets/calendar/skins/cozy_simple/images/green/buttonArrowCalendarLeft.gif differ diff --git a/widgets/calendar/skins/cozy_simple/images/green/buttonArrowCalendarRight.gif b/widgets/calendar/skins/cozy_simple/images/green/buttonArrowCalendarRight.gif new file mode 100644 index 000000000..120fe0df5 Binary files /dev/null and b/widgets/calendar/skins/cozy_simple/images/green/buttonArrowCalendarRight.gif differ diff --git a/widgets/calendar/skins/cozy_simple/images/pink/buttonArrowCalendarLeft.gif b/widgets/calendar/skins/cozy_simple/images/pink/buttonArrowCalendarLeft.gif new file mode 100644 index 000000000..45da9ae20 Binary files /dev/null and b/widgets/calendar/skins/cozy_simple/images/pink/buttonArrowCalendarLeft.gif differ diff --git a/widgets/calendar/skins/cozy_simple/images/pink/buttonArrowCalendarRight.gif b/widgets/calendar/skins/cozy_simple/images/pink/buttonArrowCalendarRight.gif new file mode 100644 index 000000000..6a10db48d Binary files /dev/null and b/widgets/calendar/skins/cozy_simple/images/pink/buttonArrowCalendarRight.gif differ diff --git a/widgets/calendar/skins/cozy_simple/images/red/buttonArrowCalendarLeft.gif b/widgets/calendar/skins/cozy_simple/images/red/buttonArrowCalendarLeft.gif new file mode 100644 index 000000000..6910d8085 Binary files /dev/null and b/widgets/calendar/skins/cozy_simple/images/red/buttonArrowCalendarLeft.gif differ diff --git a/widgets/calendar/skins/cozy_simple/images/red/buttonArrowCalendarRight.gif b/widgets/calendar/skins/cozy_simple/images/red/buttonArrowCalendarRight.gif new file mode 100644 index 000000000..fc204719f Binary files /dev/null and b/widgets/calendar/skins/cozy_simple/images/red/buttonArrowCalendarRight.gif differ diff --git a/widgets/calendar/skins/cozy_simple/skin.xml b/widgets/calendar/skins/cozy_simple/skin.xml new file mode 100644 index 000000000..0a0e01725 --- /dev/null +++ b/widgets/calendar/skins/cozy_simple/skin.xml @@ -0,0 +1,65 @@ + + + cozy simple + Cozyシンプル + cozy simple skin + Cozy样式皮肤 + + 제로 + Zero + zero + Zero + + cozy simple 위젯입니다. + 디자인 : 서기정 (http://blog.naver.com/addcozy) + HTML/CSS : 소지훈 + + + Cozyシンプルウィジェットです。 + デザイン:ソギジョン(http://blog.naver.com/addcozy) + HTML/CSS:ソジフン + + + This is cozy simple widget. + Design : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + Cozy样式皮肤。 + 设计 : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + + + 빨간색 + + Red + 红色 + + + 초록색 + + Green + 绿色 + + + 파란색 + + Blue + 蓝色 + + + 분홍색 + ピンク + Pink + 粉红色 + + + 청록색 + 青緑 + Cyan + 青绿色 + + + diff --git a/widgets/counter_status/conf/info.xml b/widgets/counter_status/conf/info.xml new file mode 100644 index 000000000..90065ad40 --- /dev/null +++ b/widgets/counter_status/conf/info.xml @@ -0,0 +1,30 @@ + + + 기본 카운터 위젯 + 接続カウンター + Basic Counter Widget + 计数器 + + 제로 + Zero + zero + zero + + 기본 카운터 모듈을 이용하여 전체, 어제, 오늘의 접속현황을 표시합니다. + counter모듈이 설치되어 있어야 하고 counter 애드온이 켜져 있어야 합니다. + + + デフォルトの接続カウンターモジュールを利用して、トータル、昨日、今日の接続状況を表示します。カウンター(counter)モジュールがインストールされていて、接続カウンター(counter)アドオンが「使用」に設定されていなければなりません。 + + + This widget displays the number of people who have visited yesterday and today by using the basic counter module. + It will also display the total count. + To get this, the counter module should be installed and the counter add-on should be turned on. + + + 利用访问统计模块显示总访问量以及昨天,今日的访问统计流量。 + 要想使用此组件必须先安装访问统计模块且得激活访问统计插件。 + + + + diff --git a/widgets/counter_status/counter_status.class.php b/widgets/counter_status/counter_status.class.php new file mode 100644 index 000000000..9e64645ff --- /dev/null +++ b/widgets/counter_status/counter_status.class.php @@ -0,0 +1,39 @@ +getStatus(array('00000000', date('Ymd', time()-60*60*24), date('Ymd'))); + 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); + } + + // 템플릿의 스킨 경로를 지정 (skin, colorset에 따른 값을 설정) + $tpl_path = sprintf('%sskins/%s', $this->widget_path, $args->skin); + Context::set('colorset', $args->colorset); + + // 템플릿 파일을 지정 + $tpl_file = 'counter_status'; + + // 템플릿 컴파일 + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + } +?> diff --git a/widgets/counter_status/skins/default/counter_status.html b/widgets/counter_status/skins/default/counter_status.html new file mode 100644 index 000000000..989bc54b4 --- /dev/null +++ b/widgets/counter_status/skins/default/counter_status.html @@ -0,0 +1,21 @@ + + + + +
    + +
      + +
    • Total : {$total_counter->unique_visitor}
    • + + + +
    • Today : {$today_counter->unique_visitor}
    • + + + +
    • Yesterday : {$yesterday_counter->unique_visitor}
    • + +
    + +
    diff --git a/widgets/counter_status/skins/default/normal/style.css b/widgets/counter_status/skins/default/normal/style.css new file mode 100644 index 000000000..528a1bea7 --- /dev/null +++ b/widgets/counter_status/skins/default/normal/style.css @@ -0,0 +1,10 @@ +.counter_widget { + border:3px solid #DDDDDD; + padding:6px; + margin-bottom:10px; + color:#999999; + font-family:tahoma; + font-size:8pt; +} + +.counter_widget ul { list-style:none; } diff --git a/widgets/counter_status/skins/default/skin.xml b/widgets/counter_status/skins/default/skin.xml new file mode 100644 index 000000000..337dfc05a --- /dev/null +++ b/widgets/counter_status/skins/default/skin.xml @@ -0,0 +1,25 @@ + + + 접속자 현황 출력 기본 스킨 + 接続統計表示のデフォルトスキン + 计数器默认皮肤 + Default Counter Skin + + 제로 + Zero + zero + zero + counter_status 의 기본 스킨 + 接続統計(counter_status)のデフォルトスキン + 计数器默认皮肤。 + Default skin of counter_status + + + + 기본 + デフォルト + default + 默认 + + + diff --git a/widgets/counter_status/skins/styx_flash/counter.swf b/widgets/counter_status/skins/styx_flash/counter.swf new file mode 100644 index 000000000..04f3a7407 Binary files /dev/null and b/widgets/counter_status/skins/styx_flash/counter.swf differ diff --git a/widgets/counter_status/skins/styx_flash/counter_status.html b/widgets/counter_status/skins/styx_flash/counter_status.html new file mode 100644 index 000000000..c8e91b966 --- /dev/null +++ b/widgets/counter_status/skins/styx_flash/counter_status.html @@ -0,0 +1,3 @@ + diff --git a/widgets/counter_status/skins/styx_flash/skin.xml b/widgets/counter_status/skins/styx_flash/skin.xml new file mode 100644 index 000000000..3c593d823 --- /dev/null +++ b/widgets/counter_status/skins/styx_flash/skin.xml @@ -0,0 +1,24 @@ + + + 스틱스 플래시 카운터 + スティクスフラッシュカウンター + styx flash 计数器皮肤 + Styx Flash Counter + + styx + styx + styx + 플래시로 오늘,어제,전체 카운터 현황을 출력해주시는 위젯입니다. + フラッシュで、今日、昨日、トータルの接続数を表示させるウィジェットです。 + 用flash显示今天,昨天,全部访问统计的控件。 + This is a widget that displays today, yesterday, all counter status with flash. + + + + 기본 + デフォルト + 默认 + default + + + diff --git a/widgets/language_select/conf/info.xml b/widgets/language_select/conf/info.xml new file mode 100644 index 000000000..5dd6cfb98 --- /dev/null +++ b/widgets/language_select/conf/info.xml @@ -0,0 +1,18 @@ + + + 언어 선택 + 言語選択 + 多国语言切换 + Language Selection + + zero + Zero + zero + zero + 사용자의 접속언어를 변경할 수 있는 select폼을 출력합니다. + 言語を変更することができるセレクト(select)フォームを表示します。 + 可以实现多国语言相互切换。 + This widget displays a select form for change of users' language. + + + diff --git a/widgets/language_select/language_select.class.php b/widgets/language_select/language_select.class.php new file mode 100644 index 000000000..66da94ce0 --- /dev/null +++ b/widgets/language_select/language_select.class.php @@ -0,0 +1,27 @@ +widget_path, $args->skin); + $tpl_file = 'language_select'; + + // 템플릿 컴파일 + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + } +?> diff --git a/widgets/language_select/skins/default/language_select.html b/widgets/language_select/skins/default/language_select.html new file mode 100644 index 000000000..182ee5485 --- /dev/null +++ b/widgets/language_select/skins/default/language_select.html @@ -0,0 +1,10 @@ +
    + +
    diff --git a/widgets/language_select/skins/default/skin.xml b/widgets/language_select/skins/default/skin.xml new file mode 100644 index 000000000..377239153 --- /dev/null +++ b/widgets/language_select/skins/default/skin.xml @@ -0,0 +1,25 @@ + + + 언어 출력 + 言語選択 + 多国语言切换 + Display Language + + zero + Zero + zero + zero + 스킨 기능이 없습니다 + スキン機能がありません。 + 不支持皮肤。 + There is no skin function + + + + 기본 + デフォルト + 默认 + default + + + diff --git a/widgets/login_info/conf/info.xml b/widgets/login_info/conf/info.xml new file mode 100644 index 000000000..dc8e691c9 --- /dev/null +++ b/widgets/login_info/conf/info.xml @@ -0,0 +1,18 @@ + + + 로그인 정보 출력 + 登陆表单 + ログイン情報表示 + Display Login Info + + 제로 + zero + Zero + zero + 로그인 폼이나 로그인 정보를 출력합니다 + 显示登陆表单或登陆信息。 + ログインフォームまたはログイン情報を表示します。 + This widget displays login form or login info. + + + diff --git a/widgets/login_info/login_info.class.php b/widgets/login_info/login_info.class.php new file mode 100644 index 000000000..8fe336b34 --- /dev/null +++ b/widgets/login_info/login_info.class.php @@ -0,0 +1,39 @@ +widget_path, $args->skin); + Context::set('colorset', $args->colorset); + + // 템플릿 파일을 지정 + if(Context::get('is_logged')) $tpl_file = 'login_info'; + else $tpl_file = 'login_form'; + + // 회원 관리 정보를 받음 + $oModuleModel = &getModel('module'); + $this->member_config = $oModuleModel->getModuleConfig('member'); + Context::set('member_config', $this->member_config); + + // 템플릿 컴파일 + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + + } +?> diff --git a/widgets/login_info/skins/default/css/default.css b/widgets/login_info/skins/default/css/default.css new file mode 100644 index 000000000..a3ccd1e0a --- /dev/null +++ b/widgets/login_info/skins/default/css/default.css @@ -0,0 +1,41 @@ +.fc_01 { color:#797771; } +.fc_02 { color:#9A9893; } + +.box_login { border:solid 3px #D5D8DB; background:#FFFFFE; margin-bottom:10px;} + +.box_login .user_info { padding:5px 0 0 5px; height:22px; } + +.box_login .hr_dot_01 { background:url(../images/default/hr_dot_01.gif) repeat-x; height:2px; overflow:hidden; clear:both; margin:6px; } +.box_login .item { background:url(../images/default/bul_01.gif) no-repeat 5px 5px; height:16px; padding:3px 0px 0px 20px; margin-left:5px; margin-top:2px; } +.box_login .item a { color:#666666; text-decoration:none; } +.box_login .item { font-size:11px; letter-spacing:-1px; margin-right:10px; padding:3px 0px 0px 20px; white-space:nowrap; } +.box_login .profile { width:70px; float:left; background:url(../images/default/icon_profile.gif) no-repeat left; } +.box_login .message { width:70px; float:left; background:url(../images/default/icon_note.gif) no-repeat left; } +.box_login .friend { float:left; background:url(../images/default/icon_friend.gif) no-repeat left; } +.box_login .administrative { float:left; background:url(../images/default/icon_key.gif) no-repeat left; margin-right:0px; } +.box_login .administrative a { color:#D80D0F; } +.box_login .lastlogin { clear:both; padding-bottom:5px;} + +.box_login .form_field { float:left; margin:9px 9px 0 9px; _margin:3px 3px 0 3px; height:55px; } +.box_login .form_field div { margin-top:2px; margin-bottom:3px; } +.box_login input.submit { width:45px; height:45px; background:url(../images/default/login_btn_submit.gif) no-repeat; border:none; margin:9px 0 0 0; _margin:5px 0 0 0; cursor:pointer; } +.box_login .input { width:140px; background-color: #ffffff; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:2px; height:14px; margin:0px; cursor:text; color:#666666;} +.box_login ul.option { clear:both; height:20px; margin:0 0 0 9px;} +.box_login ul.option li { float:left; list-style:none;} +.box_login ul.option li a.btn { background:url(../images/default/bul_01.gif) no-repeat left; padding-left:10px; margin-left:14px; } +.box_login .checkbox { width:15px; height:15px; margin:-1px 0px 0px -1px; margin-right:2px; } +.box_login .clear { clear:both; } + +.openid_login { clear:both; height:38px; border:3px solid #D5D8DB; background-color:#FFFFFF; margin:0 0 10px 0; } +.openid_login .openid_user_id { width:110px; _width:100px; background: url(../images/openid_login_bg.gif) left no-repeat; background-color: #ffffff; background-position: 0 50%; padding:3px 3px 3px 18px; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; height:16px; line-height:1em; vertical-align:middle; margin-bottom:.5em; color:#666666;} + +.openid_login .wButtonTypeA { display:block; cursor:pointer; background:url(../images/default/buttonTypeACenter.gif) repeat-x left center; line-height:100%; overflow:visible; color:#3f4040; margin:0 1px; white-space:nowrap;border:0px;} +.openid_login .wButtonTypeA:hover { text-decoration:none;} +.openid_login .wButtonTypeA img { vertical-align:middle;} +.openid_login .wButtonTypeA input { border:none; cursor:pointer; background:url(../images/default/buttonTypeACenter.gif) repeat-x left center; line-height:100%; overflow:visible; color:#3f4040; margin:0 1px; white-space:nowrap;border:0px; vertical-align:middle; } +.openid_login .wButtonTypeA .leftCap { width:2px; height:24px; background:url(../images/default/buttonTypeALeft.gif) no-repeat; margin:0 .3em 0 0; position:relative; left:-1px;} +.openid_login .wButtonTypeA .rightCap { width:2px; height:24px; background:url(../images/default/buttonTypeARight.gif) no-repeat; margin:0 -1px 0 .4em;} +.openid_login .wButtonTypeA .icon { margin:0 .2em;} +.openid_login .wButtonWrite ul { text-align:center; clear:both; display:block;} +.openid_login .wButtonWrite li { margin-top:.5em; float:left; margin-left:.3em; list-style:none;} + diff --git a/widgets/login_info/skins/default/filter/login.xml b/widgets/login_info/skins/default/filter/login.xml new file mode 100644 index 000000000..9d39bc59b --- /dev/null +++ b/widgets/login_info/skins/default/filter/login.xml @@ -0,0 +1,14 @@ + +
    + + + + + + + + + + + +
    diff --git a/widgets/login_info/skins/default/filter/logout.xml b/widgets/login_info/skins/default/filter/logout.xml new file mode 100644 index 000000000..8005776d3 --- /dev/null +++ b/widgets/login_info/skins/default/filter/logout.xml @@ -0,0 +1,7 @@ + +
    + + + + + diff --git a/widgets/login_info/skins/default/filter/openid_login.xml b/widgets/login_info/skins/default/filter/openid_login.xml new file mode 100644 index 000000000..61bba2ff2 --- /dev/null +++ b/widgets/login_info/skins/default/filter/openid_login.xml @@ -0,0 +1,10 @@ + + + + + + + + + +
    diff --git a/widgets/login_info/skins/default/images/blank.gif b/widgets/login_info/skins/default/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/widgets/login_info/skins/default/images/blank.gif differ diff --git a/widgets/login_info/skins/default/images/default/bul_01.gif b/widgets/login_info/skins/default/images/default/bul_01.gif new file mode 100755 index 000000000..8482c5daf Binary files /dev/null and b/widgets/login_info/skins/default/images/default/bul_01.gif differ diff --git a/widgets/login_info/skins/default/images/default/buttonTypeACenter.gif b/widgets/login_info/skins/default/images/default/buttonTypeACenter.gif new file mode 100644 index 000000000..56127ea2e Binary files /dev/null and b/widgets/login_info/skins/default/images/default/buttonTypeACenter.gif differ diff --git a/widgets/login_info/skins/default/images/default/buttonTypeALeft.gif b/widgets/login_info/skins/default/images/default/buttonTypeALeft.gif new file mode 100644 index 000000000..12839fe05 Binary files /dev/null and b/widgets/login_info/skins/default/images/default/buttonTypeALeft.gif differ diff --git a/widgets/login_info/skins/default/images/default/buttonTypeARight.gif b/widgets/login_info/skins/default/images/default/buttonTypeARight.gif new file mode 100644 index 000000000..1dd5aac05 Binary files /dev/null and b/widgets/login_info/skins/default/images/default/buttonTypeARight.gif differ diff --git a/widgets/login_info/skins/default/images/default/hr_dot_01.gif b/widgets/login_info/skins/default/images/default/hr_dot_01.gif new file mode 100755 index 000000000..b0eb453c5 Binary files /dev/null and b/widgets/login_info/skins/default/images/default/hr_dot_01.gif differ diff --git a/widgets/login_info/skins/default/images/default/icon_friend.gif b/widgets/login_info/skins/default/images/default/icon_friend.gif new file mode 100644 index 000000000..fc3d86376 Binary files /dev/null and b/widgets/login_info/skins/default/images/default/icon_friend.gif differ diff --git a/widgets/login_info/skins/default/images/default/icon_friend_list.gif b/widgets/login_info/skins/default/images/default/icon_friend_list.gif new file mode 100644 index 000000000..adabcfc6e Binary files /dev/null and b/widgets/login_info/skins/default/images/default/icon_friend_list.gif differ diff --git a/widgets/login_info/skins/default/images/default/icon_key.gif b/widgets/login_info/skins/default/images/default/icon_key.gif new file mode 100644 index 000000000..8a4cfc342 Binary files /dev/null and b/widgets/login_info/skins/default/images/default/icon_key.gif differ diff --git a/widgets/login_info/skins/default/images/default/icon_last_login.gif b/widgets/login_info/skins/default/images/default/icon_last_login.gif new file mode 100644 index 000000000..ab9e0a709 Binary files /dev/null and b/widgets/login_info/skins/default/images/default/icon_last_login.gif differ diff --git a/widgets/login_info/skins/default/images/default/icon_message_box.gif b/widgets/login_info/skins/default/images/default/icon_message_box.gif new file mode 100644 index 000000000..5a05d50e2 Binary files /dev/null and b/widgets/login_info/skins/default/images/default/icon_message_box.gif differ diff --git a/widgets/login_info/skins/default/images/default/icon_note.gif b/widgets/login_info/skins/default/images/default/icon_note.gif new file mode 100644 index 000000000..5367d40af Binary files /dev/null and b/widgets/login_info/skins/default/images/default/icon_note.gif differ diff --git a/widgets/login_info/skins/default/images/default/icon_profile.gif b/widgets/login_info/skins/default/images/default/icon_profile.gif new file mode 100644 index 000000000..a750c0ad0 Binary files /dev/null and b/widgets/login_info/skins/default/images/default/icon_profile.gif differ diff --git a/widgets/login_info/skins/default/images/default/login_btn_submit.gif b/widgets/login_info/skins/default/images/default/login_btn_submit.gif new file mode 100755 index 000000000..2fcbf2815 Binary files /dev/null and b/widgets/login_info/skins/default/images/default/login_btn_submit.gif differ diff --git a/widgets/login_info/skins/default/images/openid_login_bg.gif b/widgets/login_info/skins/default/images/openid_login_bg.gif new file mode 100644 index 000000000..cde836c89 Binary files /dev/null and b/widgets/login_info/skins/default/images/openid_login_bg.gif differ diff --git a/widgets/login_info/skins/default/js/login.js b/widgets/login_info/skins/default/js/login.js new file mode 100644 index 000000000..da278dc3b --- /dev/null +++ b/widgets/login_info/skins/default/js/login.js @@ -0,0 +1,36 @@ +/* 로그인 영역에 포커스 */ +function doFocusUserId(fo_id) { + var fo_obj = xGetElementById(fo_id); + if(xGetCookie('user_id')) { + fo_obj.user_id.value = xGetCookie('user_id'); + fo_obj.remember_user_id.checked = true; + try{ + fo_obj.password.focus(); + } catch(e) {}; + } else { + try{ + fo_obj.user_id.focus(); + } catch(e) {}; + } +} + +/* 로그인 후 */ +function completeLogin(ret_obj, response_tags, params, fo_obj) { + if(fo_obj.remember_user_id && fo_obj.remember_user_id.checked) { + var expire = new Date(); + expire.setTime(expire.getTime()+ (7000 * 24 * 3600000)); + xSetCookie('user_id', fo_obj.user_id.value, expire); + } + + var url = current_url.setQuery('act',''); + location.href = url; +} + +/* 오픈아이디 로그인 후 */ +function completeOpenIDLogin(ret_obj, response_tags) { + var redirect_url = ret_obj['redirect_url']; + location.href = redirect_url; +} + + + diff --git a/widgets/login_info/skins/default/login_form.html b/widgets/login_info/skins/default/login_form.html new file mode 100644 index 000000000..de787e6de --- /dev/null +++ b/widgets/login_info/skins/default/login_form.html @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + diff --git a/widgets/login_info/skins/default/login_info.html b/widgets/login_info/skins/default/login_info.html new file mode 100644 index 000000000..40920a4f4 --- /dev/null +++ b/widgets/login_info/skins/default/login_info.html @@ -0,0 +1,22 @@ + + + + + + + diff --git a/widgets/login_info/skins/default/skin.xml b/widgets/login_info/skins/default/skin.xml new file mode 100644 index 000000000..9a8b55eb1 --- /dev/null +++ b/widgets/login_info/skins/default/skin.xml @@ -0,0 +1,25 @@ + + + 로그인 정보 출력 기본 스킨 + ログイン情報表示のデフォルトスキン + 登陆表单默认皮肤 + Default Login Info Display Skin + + 제로 + Zero + zero + zero + 기본 스킨 + ログイン情報表示(login_info)のデフォルトスキン + 登陆表单默认皮肤。 + default skin + + + + 기본 + デフォルト + 默认 + default + + + diff --git a/widgets/login_info/skins/xe_official/css/black.css b/widgets/login_info/skins/xe_official/css/black.css new file mode 100644 index 000000000..f1b542774 --- /dev/null +++ b/widgets/login_info/skins/xe_official/css/black.css @@ -0,0 +1,42 @@ +#login { border:2px solid #515151; width:196px; position:relative; _padding-top:2px; display:block;} +*:first-child+html body#black #login { padding-top:2px;} +#login legend { display:block; width:0; height:0; overflow:hidden; font-size:0;} +#login form { position:relative; border:1px solid #6b6b6b; padding:11px 11px 7px 11px; width:172px;} +#login form .idpwWrap { overflow:hidden; clear:both; width:172px;} +#login form .idpw { float:left;} +#login form .idpw input { border:1px solid #6b6b6b; color:#cbcbcb; width:105px; background:#515151; padding:1px 5px; margin-bottom:2px; font:.9em Tahoma;} +#login form .login { float:right;} +#login form p.save { clear:both; padding:.3em 0;} +#login form p.save input { vertical-align:middle; _margin:-3px;} +*:first-child+html body#black #login form p input { margin:-3px; } +#login form p.save label { font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; color:#818181;} +#login form ul.help { border-top:1px solid #515151; overflow:hidden; padding:.5em 0 0 0; white-space:nowrap;} +#login form ul.help li { list-style:none; float:left; display:block; padding:0 3px 0 7px; background:url(../images/black/vrType1.gif) no-repeat left center;} +#login form ul.help li.first-child { background:none; padding-left:0;} +#login form ul.help li a { color:#818181; font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; white-space:nowrap; text-decoration:none;} +#login form ul.help li a:hover { text-decoration:underline;} +#login form ul.help li.first-child a { color:#cbcbcb;} +#login form .userName { width:172px; overflow:hidden; border-bottom:1px solid #515151; padding:0 0 6px 0; margin-top:-5px;} +#login form .userName strong { color:#cbcbcb; float:left; padding:4px 0 0 2px; font:bold .9em Tahoma;} +#login form .userName a { float:right;} +#login form ul.userMenu { padding:0 0 6px 4px; overflow:hidden; margin-top:10px;} +#login form ul.userMenu li { list-style:none; color:#cbcbcb; list-style:none;padding-left:10px; background:url(../images/black/bulletFF1A00.gif) no-repeat left 4px; height:18px; } +#login form ul.userMenu li a { color:#cbcbcb;text-decoration:none;} +#login form ul.userMenu li a:hover {text-decoration:underline;} +#login form p.latestLogin { color:#818181; font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;} +#login form p.latestLogin span { font:1em Tahoma;} + +img.login_mask { width:201px; height:5px; background:#3d3d3d; display:block;} + +#openid_login { border:2px solid #515151; width:196px; position:relative; _padding-top:2px; display:block;} +*:first-child+html body#black #openid_login { padding-top:2px;} +#openid_login legend { display:block; width:0; height:0; overflow:hidden; font-size:0;} +#openid_login form { position:relative; border:1px solid #6b6b6b; padding:11px 11px 7px 11px; width:172px;} +#openid_login form .idpwWrap { overflow:hidden; clear:both; width:172px;} +#openid_login form .idpw { float:left;} +#openid_login form .idpw p { margin-bottom:5px; background: url(../images/openid_login_bg.gif) left no-repeat; padding-left:18px; font-size:.9em Tahoma;color:#999999} +#openid_login form .idpw input { border:1px solid #6b6b6b; color:#cbcbcb; width:105px; background:#515151; padding:1px 5px; margin-bottom:2px; font:.9em Tahoma;} +#openid_login form .login { float:right;} +#openid_login form p.save { clear:both; padding:.3em 0;} +#openid_login form p.save input { vertical-align:middle; _margin:-3px;} +*:first-child+html body #openid_login form p input { margin:-3px; } diff --git a/widgets/login_info/skins/xe_official/css/default.css b/widgets/login_info/skins/xe_official/css/default.css new file mode 100644 index 000000000..46e93b6d2 --- /dev/null +++ b/widgets/login_info/skins/xe_official/css/default.css @@ -0,0 +1,42 @@ +#login { border:2px solid #d9d9d9; width:196px; position:relative; _padding-top:2px; display:block;} +*:first-child+html body #login { padding-top:2px;} +#login legend { display:block; width:0; height:0; overflow:hidden; font-size:0;} +#login form { position:relative; border:1px solid #cacaca; padding:11px 11px 7px 11px; width:172px;} +#login form .idpwWrap { overflow:hidden; clear:both; width:172px;} +#login form .idpw { float:left;} +#login form .idpw input { border:1px solid #c9c9c9; color:#282828; width:105px; background:#fbfbfb; padding:1px 5px; margin-bottom:2px; font:.9em Tahoma;} +#login form .login { float:right;} +#login form p.save { clear:both; padding:.3em 0;} +#login form p.save input { vertical-align:middle; _margin:-3px;} +*:first-child+html body #login form p input { margin:-3px; } +#login form p.save label { font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; color:#999999;} +#login form ul.help { border-top:1px solid #e4e4e4; overflow:hidden; padding:.5em 0 0 0; white-space:nowrap;} +#login form ul.help li { float:left; display:block; padding:0 3px 0 7px; background:url(../images/default/vrType1.gif) no-repeat left center;} +#login form ul.help li.first-child { background:none; padding-left:0;} +#login form ul.help li a { color:#999999; font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; white-space:nowrap; text-decoration:none; } +#login form ul.help li.first-child a { color:#54564b; text-decoration:none;} +#login form ul.help li a:hover { text-decoration:underline; } +#login form .userName { width:172px; overflow:hidden; border-bottom:1px solid #e4e4e4; padding:0 0 6px 0; margin-top:-5px;} +#login form .userName strong { color:#282828; float:left; padding:4px 0 0 2px; font:bold .9em Tahoma;} +#login form .userName a { float:right;} +#login form ul.userMenu { padding:0 0 6px 4px; overflow:hidden; margin-top:10px;} +#login form ul.userMenu li { list-style:none; padding-left:10px; background:url(../images/default/bulletFF1A00.gif) no-repeat left 4px; height:18px; } +#login form ul.userMenu li a { color:#54564b; text-decoration:none;} +#login form ul.userMenu li a:hover { text-decoration:underline;} +#login form p.latestLogin { color:#999999; font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;} +#login form p.latestLogin span { font:1em Tahoma;} + +img.login_mask { width:201px; height:5px; background:#ffffff; display:block;} +#openid_login { border:2px solid #d9d9d9; width:196px; position:relative; _padding-top:2px; display:block; } +*:first-child+html body #openid_login { padding-top:2px;} +#openid_login legend { display:block; width:0; height:0; overflow:hidden; font-size:0;} +#openid_login form { position:relative; border:1px solid #cacaca; padding:11px 11px 7px 11px; width:172px; } +#openid_login form .idpwWrap { overflow:hidden; clear:both; width:172px;} +#openid_login form .idpw { float:left;} +#openid_login form .idpw p { margin-bottom:5px; background: url(../images/openid_login_bg.gif) left no-repeat; padding-left:18px; font-size:.9em Tahoma;color:#999999} +#openid_login form .idpw input { border:1px solid #c9c9c9; color:#282828; width:105px; background:#fbfbfb; padding:1px 5px; margin-bottom:2px; font:.9em Tahoma; } +#openid_login form .login { float:right;} +#openid_login form p.save { clear:both; padding:.3em 0;} +#openid_login form p.save input { vertical-align:middle; _margin:-3px;} +*:first-child+html body #openid_login form p input { margin:-3px; } +#openid_login form p.save label { font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; color:#999999;} diff --git a/widgets/login_info/skins/xe_official/css/white.css b/widgets/login_info/skins/xe_official/css/white.css new file mode 100644 index 000000000..f8dbb1671 --- /dev/null +++ b/widgets/login_info/skins/xe_official/css/white.css @@ -0,0 +1,38 @@ +#login { border:2px solid #d9d9d9; width:196px; position:relative; _padding-top:2px; display:block;} +*:first-child+html body#white #login { padding-top:2px;} +#login legend { display:block; width:0; height:0; overflow:hidden; font-size:0;} +#login form { position:relative; border:1px solid #cacaca; padding:11px 11px 7px 11px; width:172px;} +#login form .idpwWrap { overflow:hidden; clear:both; width:172px;} +#login form .idpw { float:left;} +#login form .idpw input { border:1px solid #c9c9c9; color:#282828; width:105px; background:#fbfbfb; padding:1px 5px; margin-bottom:2px; font:.9em Tahoma;} +#login form .login { float:right;} +#login form p.save { clear:both; padding:.3em 0;} +#login form p.save input { vertical-align:middle; _margin:-3px;} +*:first-child+html body#white #login form p input { margin:-3px; } +#login form p.save label { font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; color:#999999;} +#login form ul.help { border-top:1px solid #e4e4e4; overflow:hidden; padding:.5em 0 0 0; white-space:nowrap;} +#login form ul.help li { list-style:none; float:left; display:block; padding:0 3px 0 7px; background:url(../images/white/vrType1.gif) no-repeat left center;} +#login form ul.help li.first-child { background:none; padding-left:0;} +#login form ul.help li a { color:#999999; font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; white-space:nowrap; text-decoration:none; } +#login form ul.help li a:hover { text-decoration:underline; } +#login form ul.help li.first-child a { color:#54564b;} +#login form .userName { width:172px; overflow:hidden; border-bottom:1px solid #e4e4e4; padding:0 0 6px 0; margin-top:-5px;} +#login form .userName strong { color:#282828; float:left; padding:4px 0 0 2px; font:bold .9em Tahoma;} +#login form .userName a { float:right; text-decoration:none; } +#login form ul.userMenu { padding:0 0 6px 4px; overflow:hidden; margin-top:10px;} +#login form ul.userMenu li { list-style:none; padding-left:10px; background:url(../images/white/bulletFF1A00.gif) no-repeat left 4px; height:18px; } +#login form ul.userMenu li a { color:#54564b; text-decoration:none; } +#login form ul.userMenu li a:hover { text-decoration:underline; } +#login form p.latestLogin { color:#999999; font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;} +#login form p.latestLogin span { font:1em Tahoma;} + +img.login_mask { width:201px; height:5px; background:#ffffff; display:block;} +#openid_login { border:2px solid #d9d9d9; width:196px; position:relative; _padding-top:2px; display:block; } +*:first-child+html body #openid_login { padding-top:2px;} +#openid_login legend { display:block; width:0; height:0; overflow:hidden; font-size:0;} +#openid_login form { position:relative; border:1px solid #cacaca; padding:11px 11px 7px 11px; width:172px; } +#openid_login form .idpwWrap { overflow:hidden; clear:both; width:172px;} +#openid_login form .idpw { float:left;} +#openid_login form .idpw p { margin-bottom:5px; background: url(../images/openid_login_bg.gif) left no-repeat; padding-left:18px; font-size:.9em Tahoma;color:#999999} +#openid_login form .idpw input { border:1px solid #c9c9c9; color:#282828; width:105px; background:#fbfbfb; padding:1px 5px; margin-bottom:2px; font:.9em Tahoma; } +#openid_login form .login { float:right;} diff --git a/widgets/login_info/skins/xe_official/filter/login.xml b/widgets/login_info/skins/xe_official/filter/login.xml new file mode 100644 index 000000000..9d39bc59b --- /dev/null +++ b/widgets/login_info/skins/xe_official/filter/login.xml @@ -0,0 +1,14 @@ + +
    + + + + + + + + + + + +
    diff --git a/widgets/login_info/skins/xe_official/filter/logout.xml b/widgets/login_info/skins/xe_official/filter/logout.xml new file mode 100644 index 000000000..8005776d3 --- /dev/null +++ b/widgets/login_info/skins/xe_official/filter/logout.xml @@ -0,0 +1,7 @@ + +
    + + + + + diff --git a/widgets/login_info/skins/xe_official/filter/openid_login.xml b/widgets/login_info/skins/xe_official/filter/openid_login.xml new file mode 100644 index 000000000..61bba2ff2 --- /dev/null +++ b/widgets/login_info/skins/xe_official/filter/openid_login.xml @@ -0,0 +1,10 @@ + + + + + + + + + +
    diff --git a/widgets/login_info/skins/xe_official/images/black/bulletFF1A00.gif b/widgets/login_info/skins/xe_official/images/black/bulletFF1A00.gif new file mode 100644 index 000000000..4026f2521 Binary files /dev/null and b/widgets/login_info/skins/xe_official/images/black/bulletFF1A00.gif differ diff --git a/widgets/login_info/skins/xe_official/images/black/buttonLogin.gif b/widgets/login_info/skins/xe_official/images/black/buttonLogin.gif new file mode 100644 index 000000000..a95725fdb Binary files /dev/null and b/widgets/login_info/skins/xe_official/images/black/buttonLogin.gif differ diff --git a/widgets/login_info/skins/xe_official/images/black/buttonLogout.gif b/widgets/login_info/skins/xe_official/images/black/buttonLogout.gif new file mode 100644 index 000000000..3516fa18a Binary files /dev/null and b/widgets/login_info/skins/xe_official/images/black/buttonLogout.gif differ diff --git a/widgets/login_info/skins/xe_official/images/black/vrType1.gif b/widgets/login_info/skins/xe_official/images/black/vrType1.gif new file mode 100644 index 000000000..65772afee Binary files /dev/null and b/widgets/login_info/skins/xe_official/images/black/vrType1.gif differ diff --git a/widgets/login_info/skins/xe_official/images/blank.gif b/widgets/login_info/skins/xe_official/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/widgets/login_info/skins/xe_official/images/blank.gif differ diff --git a/widgets/login_info/skins/xe_official/images/default/bulletFF1A00.gif b/widgets/login_info/skins/xe_official/images/default/bulletFF1A00.gif new file mode 100644 index 000000000..4026f2521 Binary files /dev/null and b/widgets/login_info/skins/xe_official/images/default/bulletFF1A00.gif differ diff --git a/widgets/login_info/skins/xe_official/images/default/buttonLogin.gif b/widgets/login_info/skins/xe_official/images/default/buttonLogin.gif new file mode 100644 index 000000000..b7513ba4b Binary files /dev/null and b/widgets/login_info/skins/xe_official/images/default/buttonLogin.gif differ diff --git a/widgets/login_info/skins/xe_official/images/default/buttonLogout.gif b/widgets/login_info/skins/xe_official/images/default/buttonLogout.gif new file mode 100644 index 000000000..fb0365084 Binary files /dev/null and b/widgets/login_info/skins/xe_official/images/default/buttonLogout.gif differ diff --git a/widgets/login_info/skins/xe_official/images/default/vrType1.gif b/widgets/login_info/skins/xe_official/images/default/vrType1.gif new file mode 100644 index 000000000..e3766aa3b Binary files /dev/null and b/widgets/login_info/skins/xe_official/images/default/vrType1.gif differ diff --git a/widgets/login_info/skins/xe_official/images/openid_login_bg.gif b/widgets/login_info/skins/xe_official/images/openid_login_bg.gif new file mode 100644 index 000000000..cde836c89 Binary files /dev/null and b/widgets/login_info/skins/xe_official/images/openid_login_bg.gif differ diff --git a/widgets/login_info/skins/xe_official/images/white/bulletFF1A00.gif b/widgets/login_info/skins/xe_official/images/white/bulletFF1A00.gif new file mode 100644 index 000000000..4026f2521 Binary files /dev/null and b/widgets/login_info/skins/xe_official/images/white/bulletFF1A00.gif differ diff --git a/widgets/login_info/skins/xe_official/images/white/buttonLogin.gif b/widgets/login_info/skins/xe_official/images/white/buttonLogin.gif new file mode 100644 index 000000000..b7513ba4b Binary files /dev/null and b/widgets/login_info/skins/xe_official/images/white/buttonLogin.gif differ diff --git a/widgets/login_info/skins/xe_official/images/white/buttonLogout.gif b/widgets/login_info/skins/xe_official/images/white/buttonLogout.gif new file mode 100644 index 000000000..fb0365084 Binary files /dev/null and b/widgets/login_info/skins/xe_official/images/white/buttonLogout.gif differ diff --git a/widgets/login_info/skins/xe_official/images/white/powerdByZeroboard.gif b/widgets/login_info/skins/xe_official/images/white/powerdByZeroboard.gif new file mode 100644 index 000000000..8be15c8f4 Binary files /dev/null and b/widgets/login_info/skins/xe_official/images/white/powerdByZeroboard.gif differ diff --git a/widgets/login_info/skins/xe_official/images/white/vrType1.gif b/widgets/login_info/skins/xe_official/images/white/vrType1.gif new file mode 100644 index 000000000..e3766aa3b Binary files /dev/null and b/widgets/login_info/skins/xe_official/images/white/vrType1.gif differ diff --git a/widgets/login_info/skins/xe_official/js/login.js b/widgets/login_info/skins/xe_official/js/login.js new file mode 100644 index 000000000..37f18288a --- /dev/null +++ b/widgets/login_info/skins/xe_official/js/login.js @@ -0,0 +1,47 @@ +/* 로그인 영역에 포커스 */ +function doFocusUserId(fo_id) { + var fo_obj = xGetElementById(fo_id); + if(xGetCookie('user_id')) { + fo_obj.user_id.value = xGetCookie('user_id'); + fo_obj.remember_user_id.checked = true; + try{ + fo_obj.password.focus(); + } catch(e) {}; + } else { + try{ + fo_obj.user_id.focus(); + } catch(e) {}; + } +} + +/* 로그인 후 */ +function completeLogin(ret_obj, response_tags, params, fo_obj) { + if(fo_obj.remember_user_id && fo_obj.remember_user_id.checked) { + var expire = new Date(); + expire.setTime(expire.getTime()+ (7000 * 24 * 3600000)); + xSetCookie('user_id', fo_obj.user_id.value, expire); + } + + var url = current_url.setQuery('act',''); + location.href = url; +} + +/* 오픈아이디 로그인 후 */ +function completeOpenIDLogin(ret_obj, response_tags) { + var redirect_url = ret_obj['redirect_url']; + location.href = redirect_url; +} + +/* 오픈 아이디 폼 변환 */ +function toggleLoginForm(obj) { + if(xGetElementById('login').style.display != "none") { + xGetElementById('login').style.display = "none"; + xGetElementById('openid_login').style.display = "block"; + xGetElementById('use_open_id_2').checked = true; + } else { + xGetElementById('openid_login').style.display = "none"; + xGetElementById('login').style.display = "block"; + xGetElementById('use_open_id').checked = false; + xGetElementById('use_open_id_2').checked = false; + } +} diff --git a/widgets/login_info/skins/xe_official/login_form.html b/widgets/login_info/skins/xe_official/login_form.html new file mode 100644 index 000000000..1171d6adb --- /dev/null +++ b/widgets/login_info/skins/xe_official/login_form.html @@ -0,0 +1,63 @@ + + + + + + + + + + + + + +
    +{$lang->cmd_login} +
    + +
    +
    + + +
    + +
    +

    + + + + + + + +

    + +
    +
    + + + + + + + diff --git a/widgets/login_info/skins/xe_official/login_info.html b/widgets/login_info/skins/xe_official/login_info.html new file mode 100644 index 000000000..8d474d39c --- /dev/null +++ b/widgets/login_info/skins/xe_official/login_info.html @@ -0,0 +1,36 @@ + + + + + + + + + + + +
    +{$lang->cmd_login} +
    + +
    +
    {$logged_info->nick_name}
    + {$lang->cmd_logout} +
    + +

    {$lang->last_login} : {zDate($logged_info->last_login, "Y-m-d H:i")}

    +
    +
    + diff --git a/widgets/login_info/skins/xe_official/skin.xml b/widgets/login_info/skins/xe_official/skin.xml new file mode 100644 index 000000000..77f3d8009 --- /dev/null +++ b/widgets/login_info/skins/xe_official/skin.xml @@ -0,0 +1,45 @@ + + + XE 공식 로그인 정보 출력 + XEログイン情報表示 + Display XE Official Login Info + XE 官方网站登陆表单皮肤 + + 제로 + Zero + zero + Zero + + XE 공식 레이아웃에 적합한 로그인 정보 출력 위젯입니다. + 디자인 : 이소라 (http://ra-ra.pe.kr) + 퍼블리싱 : 정찬명 (http://naradesign.net) + 레이아웃 제작 : zero (http://blog.nzeo.com) + + + XEレイアウトに適したログイン情報表示用のウィジェットです。 + デザイン:イソラ(http://ra-ra.pe.kr) + パブリシング:ジョンチャンミョン(http://naradesign.net) + レイアウト:Zero (http://blog.nzeo.com) + + + This is a suitable login info display widget for XE Official layout. + Design : So-ra Lee (http://ra-ra.pe.kr) + Publishing : Chan-Myeong Jeong (http://naradesign.net) + Layout Maker : Zero (http://blog.nzeo.com) + + + 适合XE 官房网站布局的登陆表单控件。 + 设计 : So-Ra Lee(http://ra-ra.pe.kr) + HTML/CSS : Chan-Myung Jeong(http://naradesign.net) + 布局: zero (http://blog.nzeo.com) + + + + + 기본 + デフォルト + 默认 + default + + + diff --git a/widgets/member_group/conf/info.xml b/widgets/member_group/conf/info.xml new file mode 100644 index 000000000..5dd5513f6 --- /dev/null +++ b/widgets/member_group/conf/info.xml @@ -0,0 +1,66 @@ + + + 특정 그룹 회원 출력 위젯 + グループ会員表示 + Display Specific Group Member + 会员列表 + + 제로 + Zero + zero + Zero + + 특정 그룹에 속한 회원의 목록을 출력하는 위젯입니다. + 아직 테스트용 위젯이며 해당 그룹에 지정된 수 이상의 회원이 있을 경우 최근 가입순서대로 출력이 됩니다. + 아래 그룹이름 입력칸에 출력을 원하는 그룹명을 , (콤마)로 연결하여 입력하시면 됩니다. + + + 特定グループに所属している会員のリストを表示するウィジェットです。まだテスト用のウィジェットです。該当するグループに指定された以上の会員が存在した場合、最近加入順に表示されます。下のグループ名の入力フィールドに、希望するグループ名を「,(コンマ)」で区切って入力します。 + + + This widget displays members in specific group. + It is a test widget, and if there are more members than assigned number in the group, they will be ordered as latest join date. + You may input groups for displaying in below space. You can use comma(,) for multiple input. + + + 显示特定用户组会员列表的控件。 + 该组用户数比要显示的用户数多时,按照最近注册日期顺来显示。(测试中的控件) + 要显示的对象用户组名称以,(逗号)来分隔。 + + + + + 제목 + タイトル + Title + 栏目名 + text + 최근 게시물의 제목으로 출력됩니다. + 最新コンテンツのタイトルとして表示されます。 + It will be displayed as title of newest article. + 显示为会员列表的标题。 + + + 목록수 + リスト数 + Number of List + 目录数 + text + 출력될 목록의 수를 정하실 수 있습니다. (기본 5개) + 表示されるリストの数を指定することができます。(デフォルト5個) + You may choose number of list. (5 as default) + 可设置要显示的目录数。 (默认为5个) + + + 대상 회원 그룹 + 対象会員グループ + Target Member Group + 对象用户组 + text + 소속 회원 출력을 원하는 회원 그룹명을 ,(콤마)로 연결하여 입력하세요. + 所属会員を表示したい場合は、会員グループ名を「,(コンマ)」で区切って入力してください。 + Please input member group name for display with comma(,). + 要显示的对象用户组名称以,(逗号)来分隔。 + + + diff --git a/widgets/member_group/member_group.class.php b/widgets/member_group/member_group.class.php new file mode 100644 index 000000000..ec925ab1b --- /dev/null +++ b/widgets/member_group/member_group.class.php @@ -0,0 +1,69 @@ +title; + $list_count = (int)$args->list_count; + if(!$list_count) $list_count = 5; + + $tmp_groups = explode(",",$args->target_group); + $count = count($tmp_groups); + for($i=0;$i<$count;$i++) { + $group_name = trim($tmp_groups[$i]); + if(!$group_name) continue; + $target_group[] = $group_name; + + } + + if(count($target_group)) { + + // 그룹 목록을 구해옴 + $oMemberModel = &getModel('member'); + $group_list = $oMemberModel->getGroups(); + + foreach($group_list as $group_srl => $val) { + if(!in_array($val->title, $target_group)) continue; + $target_group_srl_list[] = $group_srl; + } + + // 해당 그룹의 멤버를 구해옴 + if(count($target_group_srl_list)) { + $obj->selected_group_srl = implode(',',$target_group_srl_list); + $obj->list_count = $list_count; + $output = executeQuery('member.getMemberListWithinGroup', $obj); + $widget_info->member_list = $output->data; + } + } + + $widget_info->title = $title; + Context::set('widget_info', $widget_info); + + // 템플릿의 스킨 경로를 지정 (skin, colorset에 따른 값을 설정) + $tpl_path = sprintf('%sskins/%s', $this->widget_path, $args->skin); + Context::set('colorset', $args->colorset); + + // 템플릿 파일을 지정 + $tpl_file = 'list'; + + // 템플릿 컴파일 + $oTemplate = &TemplateHandler::getInstance(); + $output = $oTemplate->compile($tpl_path, $tpl_file); + return $output; + } + } +?> diff --git a/widgets/member_group/skins/default/css/normal.css b/widgets/member_group/skins/default/css/normal.css new file mode 100644 index 000000000..96616b60b --- /dev/null +++ b/widgets/member_group/skins/default/css/normal.css @@ -0,0 +1,4 @@ +.mg { padding-bottom:15px; overflow:hidden; position:relative;} +.mg h2 { font-size:1em; display:block; height:21px; padding:9px 0 0 9px; margin-bottom:4px; color:#000000; background:url(../images/normal/lineNotice.gif) no-repeat left bottom;} +.mg ul { overflow:hidden; width:100%;} +.mg ul li { white-space:nowrap; padding:3px 0 3px 10px; overflow:hidden; border-bottom:1px dashed #EEEEEE; color:#54564b;} diff --git a/widgets/member_group/skins/default/images/normal/bulletD0.gif b/widgets/member_group/skins/default/images/normal/bulletD0.gif new file mode 100644 index 000000000..e8e17d4c6 Binary files /dev/null and b/widgets/member_group/skins/default/images/normal/bulletD0.gif differ diff --git a/widgets/member_group/skins/default/images/normal/lineNotice.gif b/widgets/member_group/skins/default/images/normal/lineNotice.gif new file mode 100644 index 000000000..dbf2c8220 Binary files /dev/null and b/widgets/member_group/skins/default/images/normal/lineNotice.gif differ diff --git a/widgets/member_group/skins/default/list.html b/widgets/member_group/skins/default/list.html new file mode 100644 index 000000000..bd6a8fbd1 --- /dev/null +++ b/widgets/member_group/skins/default/list.html @@ -0,0 +1,20 @@ + + + + + + +
    + + +

    {$widget_info->title}

    + + +
      + +
    • +
      {htmlspecialchars($val->nick_name)}
      +
    • + +
    +
    diff --git a/widgets/member_group/skins/default/skin.xml b/widgets/member_group/skins/default/skin.xml new file mode 100644 index 000000000..ac3fc8464 --- /dev/null +++ b/widgets/member_group/skins/default/skin.xml @@ -0,0 +1,25 @@ + + + 그룹회원 출력 위젯 기본 스킨 + グループ会員表示ウィジェットのデフォルトスキン + Basic Skin of Group Member Display Widget + 会员列表默认皮肤 + + 제로 + Zero + zero + Zero + 그룹회원 출력 위젯의 기본 스킨 + グループ会員表示ウィジェットのデフォルトスキン + Basic skin of group member display widget + 显示特定用户组会员列表的默认皮肤。 + + + + 기본 컬러 + デフォルトカラー + Default Color + 默认颜色 + + + diff --git a/widgets/newest_comment/conf/info.xml b/widgets/newest_comment/conf/info.xml new file mode 100644 index 000000000..685afa31b --- /dev/null +++ b/widgets/newest_comment/conf/info.xml @@ -0,0 +1,52 @@ + + + 최근 댓글 출력 + 评论列表 + 最近のコメント表示 + Display Newest Comments + + 제로 + zero + Zero + zero + 최근 댓글 (comment)를 출력하는 위젯입니다. + 显示最新评论列表的控件。 + 最近のコメント(comment)を表示させるウィジェットです。 + This widget displays newest comments. + + + + 제목 + 栏目名 + タイトル + Title + text + 최근 댓글의 제목으로 출력됩니다. + 显示为最新评论列表的输入的标题。 + 最近のコメント書き込みのタイトルとして表示されます。 + This will be the title of lnewest comments. + + + 목록수 + 目录数 + リスト数 + The Number of List + text + 출력될 목록의 수를 정하실 수 있습니다. (기본 5개) + 可设置要显示的目录数。 (默认为5个) + 出力されるリストの数が指定できます(デフォルト5個) + You can set the number of list(default is 5). + + + 대상 모듈 + 模块对象 + モジュール + Target Module + mid_list + 선택하신 모듈에 등록된 글을 대상으로 합니다. + 将把被选模块当中的主题作为对象。 + チェックされたモジュールに登録されたコンテンツ(書き込み)を対象とします。 + The target articles for the newest comments will be the ones submitted in the selected module. + + + diff --git a/widgets/newest_comment/newest_comment.class.php b/widgets/newest_comment/newest_comment.class.php new file mode 100644 index 000000000..76ee87be7 --- /dev/null +++ b/widgets/newest_comment/newest_comment.class.php @@ -0,0 +1,55 @@ +title; + $order_target = $args->order_target; + $order_type = $args->order_type; + $list_count = (int)$args->list_count; + if(!$list_count) $list_count = 5; + $mid_list = explode(",",$args->mid_list); + + // CommentModel::getCommentList()를 이용하기 위한 변수 정리 + $obj->mid = $mid_list; + $obj->sort_index = $order_target; + $obj->list_count = $list_count; + + // comment 모듈의 model 객체를 받아서 getCommentList() method를 실행 + $oCommentModel = &getModel('comment'); + $output = $oCommentModel->getNewestCommentList($obj); + + // 템플릿 파일에서 사용할 변수들을 세팅 + if(count($mid_list)==1) $widget_info->module_name = $mid_list[0]; + + $widget_info->title = $title; + $widget_info->comment_list = $output->data; + + Context::set('widget_info', $widget_info); + + // 템플릿의 스킨 경로를 지정 (skin, colorset에 따른 값을 설정) + $tpl_path = sprintf('%sskins/%s', $this->widget_path, $args->skin); + Context::set('colorset', $args->colorset); + + // 템플릿 파일을 지정 + $tpl_file = 'list'; + + // 템플릿 컴파일 + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + } +?> diff --git a/widgets/newest_comment/skins/blog_newest_comment/css/cyan.css b/widgets/newest_comment/skins/blog_newest_comment/css/cyan.css new file mode 100644 index 000000000..1b89bc5d5 --- /dev/null +++ b/widgets/newest_comment/skins/blog_newest_comment/css/cyan.css @@ -0,0 +1,6 @@ +.newestComment { position:relative; border:1px solid #e0e1db; background:url(../images/cyan/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +.newestComment h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +.newestComment .commentList { padding:1.2em; overflow:hidden;} +.newestComment .commentList li { display:block; color:#a4a4a4; margin-right:.1em; overflow:hidden; } +.newestComment .commentList li a { color:#a4a4a4; line-height:1.5em;} diff --git a/widgets/newest_comment/skins/blog_newest_comment/css/green.css b/widgets/newest_comment/skins/blog_newest_comment/css/green.css new file mode 100644 index 000000000..2558f75cf --- /dev/null +++ b/widgets/newest_comment/skins/blog_newest_comment/css/green.css @@ -0,0 +1,6 @@ +.newestComment { position:relative; border:1px solid #e0e1db; background:url(../images/green/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +.newestComment h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +.newestComment .commentList { padding:1.2em; overflow:hidden;} +.newestComment .commentList li { display:block; color:#a4a4a4; margin-right:.1em; overflow:hidden; } +.newestComment .commentList li a { color:#a4a4a4; line-height:1.5em;} diff --git a/widgets/newest_comment/skins/blog_newest_comment/css/normal.css b/widgets/newest_comment/skins/blog_newest_comment/css/normal.css new file mode 100644 index 000000000..07eee4a64 --- /dev/null +++ b/widgets/newest_comment/skins/blog_newest_comment/css/normal.css @@ -0,0 +1,6 @@ +.newestComment { position:relative; border:1px solid #e0e1db; background:url(../images/normal/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +.newestComment h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +.newestComment .commentList { padding:1.2em; overflow:hidden;} +.newestComment .commentList li { display:block; color:#a4a4a4; margin-right:.1em; overflow:hidden; } +.newestComment .commentList li a { color:#a4a4a4; line-height:1.5em;} diff --git a/widgets/newest_comment/skins/blog_newest_comment/css/purple.css b/widgets/newest_comment/skins/blog_newest_comment/css/purple.css new file mode 100644 index 000000000..cfecc68e9 --- /dev/null +++ b/widgets/newest_comment/skins/blog_newest_comment/css/purple.css @@ -0,0 +1,6 @@ +.newestComment { position:relative; border:1px solid #e0e1db; background:url(../images/purple/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +.newestComment h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +.newestComment .commentList { padding:1.2em; overflow:hidden;} +.newestComment .commentList li { display:block; color:#a4a4a4; margin-right:.1em; overflow:hidden; } +.newestComment .commentList li a { color:#a4a4a4; line-height:1.5em;} diff --git a/widgets/newest_comment/skins/blog_newest_comment/css/red.css b/widgets/newest_comment/skins/blog_newest_comment/css/red.css new file mode 100644 index 000000000..c7d81ff6c --- /dev/null +++ b/widgets/newest_comment/skins/blog_newest_comment/css/red.css @@ -0,0 +1,6 @@ +.newestComment { position:relative; border:1px solid #e0e1db; background:url(../images/red/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +.newestComment h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +.newestComment .commentList { padding:1.2em; overflow:hidden;} +.newestComment .commentList li { display:block; color:#a4a4a4; margin-right:.1em; overflow:hidden; } +.newestComment .commentList li a { color:#a4a4a4; line-height:1.5em;} diff --git a/widgets/newest_comment/skins/blog_newest_comment/images/cyan/bgBoxTypeB.gif b/widgets/newest_comment/skins/blog_newest_comment/images/cyan/bgBoxTypeB.gif new file mode 100644 index 000000000..99a877045 Binary files /dev/null and b/widgets/newest_comment/skins/blog_newest_comment/images/cyan/bgBoxTypeB.gif differ diff --git a/widgets/newest_comment/skins/blog_newest_comment/images/green/bgBoxTypeB.gif b/widgets/newest_comment/skins/blog_newest_comment/images/green/bgBoxTypeB.gif new file mode 100644 index 000000000..1cdca75c2 Binary files /dev/null and b/widgets/newest_comment/skins/blog_newest_comment/images/green/bgBoxTypeB.gif differ diff --git a/widgets/newest_comment/skins/blog_newest_comment/images/normal/bgBoxTypeB.gif b/widgets/newest_comment/skins/blog_newest_comment/images/normal/bgBoxTypeB.gif new file mode 100644 index 000000000..09f7dd59c Binary files /dev/null and b/widgets/newest_comment/skins/blog_newest_comment/images/normal/bgBoxTypeB.gif differ diff --git a/widgets/newest_comment/skins/blog_newest_comment/images/purple/bgBoxTypeB.gif b/widgets/newest_comment/skins/blog_newest_comment/images/purple/bgBoxTypeB.gif new file mode 100644 index 000000000..9e130ae44 Binary files /dev/null and b/widgets/newest_comment/skins/blog_newest_comment/images/purple/bgBoxTypeB.gif differ diff --git a/widgets/newest_comment/skins/blog_newest_comment/images/red/bgBoxTypeB.gif b/widgets/newest_comment/skins/blog_newest_comment/images/red/bgBoxTypeB.gif new file mode 100644 index 000000000..01406b48a Binary files /dev/null and b/widgets/newest_comment/skins/blog_newest_comment/images/red/bgBoxTypeB.gif differ diff --git a/widgets/newest_comment/skins/blog_newest_comment/list.html b/widgets/newest_comment/skins/blog_newest_comment/list.html new file mode 100644 index 000000000..65ac865c9 --- /dev/null +++ b/widgets/newest_comment/skins/blog_newest_comment/list.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + +
    +
    + +

    {$widget_info->title}

    + +

    newest comments

    + +
    + + +
    diff --git a/widgets/newest_comment/skins/blog_newest_comment/skin.xml b/widgets/newest_comment/skins/blog_newest_comment/skin.xml new file mode 100644 index 000000000..eb2f74602 --- /dev/null +++ b/widgets/newest_comment/skins/blog_newest_comment/skin.xml @@ -0,0 +1,49 @@ + + + 블로그 스타일의 최신 댓글 목록 + ブログスタイルの最新コメントリスト + 博客式最新评论列表 + Newest Comments List of Blog Style + + 제로 + Zero + zero + zero + 블로그 스타일로 최신 댓글을 출력합니다. + ブログスタイルで最新のコメントを表示します。 + 显示为博客式的最新评论。 + It displays newest comments with blog style. + + + + 기본 컬러 + デフォルトカラー + 默认颜色 + Default color + + + 청록색 + 青緑 + 青绿色 + Cyan + + + 초록색 + + 绿色 + Green + + + 빨간색 + + 红色 + Red + + + 보라색 + + 紫色 + Purple + + + diff --git a/widgets/newest_comment/skins/cozy_simple/css/blue.css b/widgets/newest_comment/skins/cozy_simple/css/blue.css new file mode 100644 index 000000000..70ebc9b1c --- /dev/null +++ b/widgets/newest_comment/skins/cozy_simple/css/blue.css @@ -0,0 +1 @@ +div.commentBox .header h2 { font-size:1em; color:#1187d8;} diff --git a/widgets/newest_comment/skins/cozy_simple/css/bluish_green.css b/widgets/newest_comment/skins/cozy_simple/css/bluish_green.css new file mode 100644 index 000000000..908e68b75 --- /dev/null +++ b/widgets/newest_comment/skins/cozy_simple/css/bluish_green.css @@ -0,0 +1 @@ +div.commentBox .header h2 { font-size:1em; color:#9ab09f;} diff --git a/widgets/newest_comment/skins/cozy_simple/css/common.css b/widgets/newest_comment/skins/cozy_simple/css/common.css new file mode 100644 index 000000000..c1ebce260 --- /dev/null +++ b/widgets/newest_comment/skins/cozy_simple/css/common.css @@ -0,0 +1,7 @@ +div.commentBox { padding-bottom:1em;} +div.commentBox .header { padding:7px 0 0 12px; height:21px; _height:20px; background:#f5f5f5; } +*:first-child+html div.commentBox .header { height:20px; color:#ef2121;} + +div.commentBox ul { padding:.5em; overflow:hidden;} +div.commentBox ul li { color:#a4a4a4; margin-right:.1em; line-height:1.5em;} +div.commentBox ul li a { color:#a4a4a4;} diff --git a/widgets/newest_comment/skins/cozy_simple/css/green.css b/widgets/newest_comment/skins/cozy_simple/css/green.css new file mode 100644 index 000000000..2bd4446d2 --- /dev/null +++ b/widgets/newest_comment/skins/cozy_simple/css/green.css @@ -0,0 +1 @@ +div.commentBox .header h2 { font-size:1em; color:#8dc63f;} diff --git a/widgets/newest_comment/skins/cozy_simple/css/pink.css b/widgets/newest_comment/skins/cozy_simple/css/pink.css new file mode 100644 index 000000000..575584310 --- /dev/null +++ b/widgets/newest_comment/skins/cozy_simple/css/pink.css @@ -0,0 +1 @@ +div.commentBox .header h2 { font-size:1em; color:#f70795;} diff --git a/widgets/newest_comment/skins/cozy_simple/css/red.css b/widgets/newest_comment/skins/cozy_simple/css/red.css new file mode 100644 index 000000000..4d47f62e9 --- /dev/null +++ b/widgets/newest_comment/skins/cozy_simple/css/red.css @@ -0,0 +1 @@ +div.commentBox .header h2 { font-size:1em; color:#ef2121;} diff --git a/widgets/newest_comment/skins/cozy_simple/list.html b/widgets/newest_comment/skins/cozy_simple/list.html new file mode 100644 index 000000000..4db09bbd9 --- /dev/null +++ b/widgets/newest_comment/skins/cozy_simple/list.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + +
    +
    + +

    {$widget_info->title}

    + +

    newest comments

    + +
    + + +
    diff --git a/widgets/newest_comment/skins/cozy_simple/skin.xml b/widgets/newest_comment/skins/cozy_simple/skin.xml new file mode 100644 index 000000000..893a92ebb --- /dev/null +++ b/widgets/newest_comment/skins/cozy_simple/skin.xml @@ -0,0 +1,65 @@ + + + cozy simple + Cozyシンプル + cozy simple skin + Cozy样式皮肤 + + 제로 + Zero + zero + 제로 + + cozy simple 위젯입니다. + 디자인 : 서기정 (http://blog.naver.com/addcozy) + HTML/CSS : 소지훈 + + + cozy simple 위젯입니다. + デザイン:ソギジョン(http://blog.naver.com/addcozy) + HTML/CSS:ソジフン + + + This is cozy simple widget. + Design : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + Cozy样式皮肤。 + 设计 : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + + + 빨간색 + + Red + 红色 + + + 초록색 + + Green + 绿色 + + + 파란색 + + Blue + 蓝色 + + + 분홍색 + ピンク + Pink + 粉红色 + + + 청록색 + 青緑 + Cyan + 青绿色 + + + diff --git a/widgets/newest_document/conf/info.xml b/widgets/newest_document/conf/info.xml new file mode 100644 index 000000000..6b4b142cb --- /dev/null +++ b/widgets/newest_document/conf/info.xml @@ -0,0 +1,113 @@ + + + 최근 문서 출력 + 主题列表 + 最近の書き込み表示 + Display Newest Articles + + 제로 + zero + Zero + zero + 최근 문서 (document)를 출력하는 위젯입니다. + 显示最新主题列表 (document)的控件。 + 最近の書き込み(document)を表示させるウィジェットです。 + This widget displays newest articles. + + + + 제목 + 栏目名 + タイトル + Title + text + 최근 게시물의 제목으로 출력됩니다. + 显示为最新主题列表的标题。 + 最近の書き込みのタイトルとして表示されます。 + It will be the title of the newest articles. + + + 정렬 대상 + 排序对象 + ソート対象 + Target to be sorted + select + 등록된 순서 또는 변경된 순서로 정렬을 할 수 있습니다. + 可以按照指定的顺序进行排序。 + 登録された順番または変更された順番にソートできます。 + The list of newewst articles may be sorted by submitted order or modified order. + + 최신 등록순 + 最新发表顺 + 最新登録順 + Newest Submitted Order + list_order + + + 최근 변경순 + 最新修改顺 + 最近変更順 + Newest Modified Order + update_order + + + + 정렬 방법 + 排序方式 + ソートタイプ + Sorting Type + select + 정렬대상을 내림차순 또는 올림차순으로 정렬할 수 있습니다. + 对其排序对象可进行升序/降序方式排序。 + ソートタイプを、降順、昇順にソートできます。 + You can sort target articles by asending or desending order. + + 내림차순 + 降序 + 降順 + Desending order + desc + + + 올림차순 + 升序 + 昇順 + Asending order + asc + + + + 목록수 + 目录数 + リスト数 + The number of list + text + 출력될 목록의 수를 정하실 수 있습니다. (기본 5개) + 可设置要显示的目录数。 (默认为5个) + 出力されるリストの数を指定することができます。(デフォルト5個) + You can set the number of articles to be displayed. (default is 5) + + + 대상 모듈 + 模块对象 + モジュール + Target Module + mid_list + 선택하신 모듈에 등록된 글을 대상으로 합니다. + 将把被选模块当中的主题作为对象。 + チェックされたモジュールに登録されたコンテンツ(書き込み)を対象とします。 + The target articles to be sorted will be the ones submitted in the selected module. + + + 제목 글자수 + タイトルの文字数 + 标题字数 + Length of Subject + text + 제목 글자수를 지정할 수 있습니다. (0또는 비워주시면 자르지 않습니다) + タイトルの文字数が指定できます(「0」または空欄の場合は、文字数を制限しません)。 + 可以设置标题的字数。(0或留空为不限) + Length of Subject can be assigned. (0 or blank value will not restrict the length) + + + diff --git a/widgets/newest_document/newest_document.class.php b/widgets/newest_document/newest_document.class.php new file mode 100644 index 000000000..7543496bb --- /dev/null +++ b/widgets/newest_document/newest_document.class.php @@ -0,0 +1,59 @@ +title; + $order_target = $args->order_target; + $order_type = $args->order_type; + $list_count = (int)$args->list_count; + if(!$list_count) $list_count = 5; + $mid_list = explode(",",$args->mid_list); + $subject_cut_size = $args->subject_cut_size; + if(!$subject_cut_size) $subject_cut_size = 0; + + // DocumentModel::getDocumentList()를 이용하기 위한 변수 정리 + $obj->mid = $mid_list; + $obj->sort_index = $order_target; + $obj->list_count = $list_count; + + // document 모듈의 model 객체를 받아서 getDocumentList() method를 실행 + $oDocumentModel = &getModel('document'); + $output = $oDocumentModel->getDocumentList($obj); + + // 템플릿 파일에서 사용할 변수들을 세팅 + if(count($mid_list)==1) $widget_info->module_name = $mid_list[0]; + + $widget_info->title = $title; + $widget_info->document_list = $output->data; + $widget_info->subject_cut_size = $subject_cut_size; + + Context::set('widget_info', $widget_info); + + // 템플릿의 스킨 경로를 지정 (skin, colorset에 따른 값을 설정) + $tpl_path = sprintf('%sskins/%s', $this->widget_path, $args->skin); + Context::set('colorset', $args->colorset); + + // 템플릿 파일을 지정 + $tpl_file = 'list'; + + // 템플릿 컴파일 + $oTemplate = &TemplateHandler::getInstance(); + $output = $oTemplate->compile($tpl_path, $tpl_file); + return $output; + } + } +?> diff --git a/widgets/newest_document/skins/blog_newest_document/css/cyan.css b/widgets/newest_document/skins/blog_newest_document/css/cyan.css new file mode 100644 index 000000000..aa7f78f35 --- /dev/null +++ b/widgets/newest_document/skins/blog_newest_document/css/cyan.css @@ -0,0 +1,6 @@ +.newestDocument { position:relative; border:1px solid #e0e1db; background:url(../images/cyan/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +.newestDocument h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +.newestDocument .documentList { padding:1.2em; overflow:hidden;} +.newestDocument .documentList li { display:block; color:#a4a4a4; margin-right:.1em; overflow:hidden; } +.newestDocument .documentList li a { color:#a4a4a4; line-height:1.5em; } diff --git a/widgets/newest_document/skins/blog_newest_document/css/green.css b/widgets/newest_document/skins/blog_newest_document/css/green.css new file mode 100644 index 000000000..d69fd7918 --- /dev/null +++ b/widgets/newest_document/skins/blog_newest_document/css/green.css @@ -0,0 +1,6 @@ +.newestDocument { position:relative; border:1px solid #e0e1db; background:url(../images/green/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +.newestDocument h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +.newestDocument .documentList { padding:1.2em; overflow:hidden;} +.newestDocument .documentList li { display:block; color:#a4a4a4; margin-right:.1em; overflow:hidden; } +.newestDocument .documentList li a { color:#a4a4a4; line-height:1.5em; } diff --git a/widgets/newest_document/skins/blog_newest_document/css/normal.css b/widgets/newest_document/skins/blog_newest_document/css/normal.css new file mode 100644 index 000000000..a2b0dda06 --- /dev/null +++ b/widgets/newest_document/skins/blog_newest_document/css/normal.css @@ -0,0 +1,6 @@ +.newestDocument { position:relative; border:1px solid #e0e1db; background:url(../images/normal/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +.newestDocument h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +.newestDocument .documentList { padding:1.2em; overflow:hidden;} +.newestDocument .documentList li { display:block; color:#a4a4a4; margin-right:.1em; overflow:hidden; } +.newestDocument .documentList li a { color:#a4a4a4; line-height:1.5em; } diff --git a/widgets/newest_document/skins/blog_newest_document/css/purple.css b/widgets/newest_document/skins/blog_newest_document/css/purple.css new file mode 100644 index 000000000..721d228a4 --- /dev/null +++ b/widgets/newest_document/skins/blog_newest_document/css/purple.css @@ -0,0 +1,6 @@ +.newestDocument { position:relative; border:1px solid #e0e1db; background:url(../images/purple/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +.newestDocument h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +.newestDocument .documentList { padding:1.2em; overflow:hidden;} +.newestDocument .documentList li { display:block; color:#a4a4a4; margin-right:.1em; overflow:hidden; } +.newestDocument .documentList li a { color:#a4a4a4; line-height:1.5em; } diff --git a/widgets/newest_document/skins/blog_newest_document/css/red.css b/widgets/newest_document/skins/blog_newest_document/css/red.css new file mode 100644 index 000000000..8e110ef76 --- /dev/null +++ b/widgets/newest_document/skins/blog_newest_document/css/red.css @@ -0,0 +1,6 @@ +.newestDocument { position:relative; border:1px solid #e0e1db; background:url(../images/red/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +.newestDocument h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +.newestDocument .documentList { padding:1.2em; overflow:hidden;} +.newestDocument .documentList li { display:block; color:#a4a4a4; margin-right:.1em; overflow:hidden; } +.newestDocument .documentList li a { color:#a4a4a4; line-height:1.5em; } diff --git a/widgets/newest_document/skins/blog_newest_document/images/cyan/bgBoxTypeB.gif b/widgets/newest_document/skins/blog_newest_document/images/cyan/bgBoxTypeB.gif new file mode 100644 index 000000000..99a877045 Binary files /dev/null and b/widgets/newest_document/skins/blog_newest_document/images/cyan/bgBoxTypeB.gif differ diff --git a/widgets/newest_document/skins/blog_newest_document/images/green/bgBoxTypeB.gif b/widgets/newest_document/skins/blog_newest_document/images/green/bgBoxTypeB.gif new file mode 100644 index 000000000..1cdca75c2 Binary files /dev/null and b/widgets/newest_document/skins/blog_newest_document/images/green/bgBoxTypeB.gif differ diff --git a/widgets/newest_document/skins/blog_newest_document/images/normal/bgBoxTypeB.gif b/widgets/newest_document/skins/blog_newest_document/images/normal/bgBoxTypeB.gif new file mode 100644 index 000000000..09f7dd59c Binary files /dev/null and b/widgets/newest_document/skins/blog_newest_document/images/normal/bgBoxTypeB.gif differ diff --git a/widgets/newest_document/skins/blog_newest_document/images/purple/bgBoxTypeB.gif b/widgets/newest_document/skins/blog_newest_document/images/purple/bgBoxTypeB.gif new file mode 100644 index 000000000..9e130ae44 Binary files /dev/null and b/widgets/newest_document/skins/blog_newest_document/images/purple/bgBoxTypeB.gif differ diff --git a/widgets/newest_document/skins/blog_newest_document/images/red/bgBoxTypeB.gif b/widgets/newest_document/skins/blog_newest_document/images/red/bgBoxTypeB.gif new file mode 100644 index 000000000..01406b48a Binary files /dev/null and b/widgets/newest_document/skins/blog_newest_document/images/red/bgBoxTypeB.gif differ diff --git a/widgets/newest_document/skins/blog_newest_document/list.html b/widgets/newest_document/skins/blog_newest_document/list.html new file mode 100644 index 000000000..be6a08f2c --- /dev/null +++ b/widgets/newest_document/skins/blog_newest_document/list.html @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + +
    +
    + +

    {$widget_info->title}

    + +

    newest documents

    + +
    + +
    diff --git a/widgets/newest_document/skins/blog_newest_document/skin.xml b/widgets/newest_document/skins/blog_newest_document/skin.xml new file mode 100644 index 000000000..65daad341 --- /dev/null +++ b/widgets/newest_document/skins/blog_newest_document/skin.xml @@ -0,0 +1,49 @@ + + + 블로그 스타일의 최신글 목록 + ブログスタイルの最新コンテンツリスト + 博客式最新主题列表 + Newest Article List of Blog Style + + 제로 + Zero + zero + zero + 블로그 스타일로 최신글을 출력합니다. + ブログスタイルで最新のコンテンツを表示します。 + 显示为博客式的最新主题列表。 + It displays newest article with blog style. + + + + 기본 컬러 + デフォルトカラー + 默认颜色 + Default color + + + 청록색 + 青緑 + 青绿色 + cyan + + + 초록색 + + 绿色 + green + + + 빨간색 + + 红色 + red + + + 보라색 + + 紫色 + purple + + + diff --git a/widgets/newest_document/skins/cozy_simple/css/blue.css b/widgets/newest_document/skins/cozy_simple/css/blue.css new file mode 100644 index 000000000..defd87313 --- /dev/null +++ b/widgets/newest_document/skins/cozy_simple/css/blue.css @@ -0,0 +1 @@ +div.documentBox .header h2 { font-size:1em; color:#1187d8;} diff --git a/widgets/newest_document/skins/cozy_simple/css/bluish_green.css b/widgets/newest_document/skins/cozy_simple/css/bluish_green.css new file mode 100644 index 000000000..a0897736b --- /dev/null +++ b/widgets/newest_document/skins/cozy_simple/css/bluish_green.css @@ -0,0 +1 @@ +div.documentBox .header h2 { font-size:1em; color:#9ab09f;} diff --git a/widgets/newest_document/skins/cozy_simple/css/common.css b/widgets/newest_document/skins/cozy_simple/css/common.css new file mode 100644 index 000000000..0ef9b2ad1 --- /dev/null +++ b/widgets/newest_document/skins/cozy_simple/css/common.css @@ -0,0 +1,7 @@ +div.documentBox { padding-bottom:1em;} +div.documentBox .header { padding:7px 0 0 12px; height:21px; _height:20px; background:#f5f5f5; } +*:first-child+html div.documentBox .header { height:20px; color:#ef2121;} + +div.documentBox ul { padding:.5em; overflow:hidden;} +div.documentBox ul li { color:#a4a4a4; margin-right:.1em; line-height:1.5em;} +div.documentBox ul li a { color:#a4a4a4;} diff --git a/widgets/newest_document/skins/cozy_simple/css/green.css b/widgets/newest_document/skins/cozy_simple/css/green.css new file mode 100644 index 000000000..ebe0066a8 --- /dev/null +++ b/widgets/newest_document/skins/cozy_simple/css/green.css @@ -0,0 +1 @@ +div.documentBox .header h2 { font-size:1em; color:#8dc63f;} diff --git a/widgets/newest_document/skins/cozy_simple/css/pink.css b/widgets/newest_document/skins/cozy_simple/css/pink.css new file mode 100644 index 000000000..c06fc7343 --- /dev/null +++ b/widgets/newest_document/skins/cozy_simple/css/pink.css @@ -0,0 +1 @@ +div.documentBox .header h2 { font-size:1em; color:#f70795;} diff --git a/widgets/newest_document/skins/cozy_simple/css/red.css b/widgets/newest_document/skins/cozy_simple/css/red.css new file mode 100644 index 000000000..ea497e003 --- /dev/null +++ b/widgets/newest_document/skins/cozy_simple/css/red.css @@ -0,0 +1 @@ +div.documentBox .header h2 { font-size:1em; color:#ef2121;} diff --git a/widgets/newest_document/skins/cozy_simple/list.html b/widgets/newest_document/skins/cozy_simple/list.html new file mode 100644 index 000000000..716118341 --- /dev/null +++ b/widgets/newest_document/skins/cozy_simple/list.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + +
    +
    + +

    {$widget_info->title}

    + +

    newest documents

    + +
    + +
    diff --git a/widgets/newest_document/skins/cozy_simple/skin.xml b/widgets/newest_document/skins/cozy_simple/skin.xml new file mode 100644 index 000000000..6a3ecd852 --- /dev/null +++ b/widgets/newest_document/skins/cozy_simple/skin.xml @@ -0,0 +1,65 @@ + + + cozy simple + Cozyシンプル + cozy simple skin + Cozy样式皮肤 + + 제로 + Zero + zero + Zero + + cozy simple 위젯입니다. + 디자인 : 서기정 (http://blog.naver.com/addcozy) + HTML/CSS : 소지훈 + + + Cozyシンプルウィジェットです。 + デザイン:ソギジョン(http://blog.naver.com/addcozy) + HTML/CSS:ソジフン + + + This is cozy simple widget. + Design : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + Cozy样式皮肤。 + 设计 : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + + + 빨간색 + + Red + 红色 + + + 초록색 + + Green + 绿色 + + + 파란색 + + Blue + 蓝色 + + + 분홍색 + ピンク + Pink + 粉红色 + + + 청록색 + 青緑 + Cyan + 青绿色 + + + diff --git a/widgets/newest_document/skins/default/blue/document_bullet.gif b/widgets/newest_document/skins/default/blue/document_bullet.gif new file mode 100644 index 000000000..5a7b98307 Binary files /dev/null and b/widgets/newest_document/skins/default/blue/document_bullet.gif differ diff --git a/widgets/newest_document/skins/default/blue/style.css b/widgets/newest_document/skins/default/blue/style.css new file mode 100644 index 000000000..f9bf3a5b7 --- /dev/null +++ b/widgets/newest_document/skins/default/blue/style.css @@ -0,0 +1,75 @@ +.newest_document_default_blue { +} + +.newest_document_default_blue .newest_document_default_box { +} + +.newest_document_default_blue .newest_document_default_box .title_box { + border:1px solid #EEEEEE; + padding:5px; + height:14px; + overflow:hidden; +} + +.newest_document_default_blue .newest_document_default_box .title_box .title { + background:url(./title_bullet.gif) no-repeat left; + font-weight:bold; + height:16px; + padding-left:20px; + float:left; +} + +.newest_document_default_blue .newest_document_default_box .title_box .more A { + float:right; + color:#AAAAAA; + text-decoration:none; + font-weight:bold; + font-size:.75em; +} + +.newest_document_default_blue .newest_document_default_box .document_box { + padding:3px 3px 3px 5px; + clear:both; + border-bottom:1px solid #EEEEEE; + height:16px; + margin:0px 0px 2px 0px; + overflow:hidden; +} + +.newest_document_default_blue .newest_document_default_box .document { + padding:0px 0px 5px 20px; + background:url(./document_bullet.gif) no-repeat left; + float:left; +} + +.newest_document_default_blue .newest_document_default_box .document A { + text-decoration:none; + color:#555555; +} + +.newest_document_default_blue .newest_document_default_box .document A:hover { + text-decoration:underline; + color:#000000; +} + +.newest_document_default_blue .newest_document_default_box .document A:visited { + color:#AAAAAA; +} + +.newest_document_default_blue .newest_document_default_box .document .comment A { + font-size:7pt; + color:#AAAAAA; + letter-spacing:-1px; +} + +.newest_document_default_blue .newest_document_default_box .document .writer { + color:#AAAAAA; +} + + +.newest_document_default_blue .newest_document_default_box .regdate { + color:#AAAAAA; + font-size:8pt; + float:right; + white-space:nowrap; +} diff --git a/widgets/newest_document/skins/default/blue/title_bullet.gif b/widgets/newest_document/skins/default/blue/title_bullet.gif new file mode 100644 index 000000000..5f39482ed Binary files /dev/null and b/widgets/newest_document/skins/default/blue/title_bullet.gif differ diff --git a/widgets/newest_document/skins/default/list.html b/widgets/newest_document/skins/default/list.html new file mode 100644 index 000000000..5b72d6643 --- /dev/null +++ b/widgets/newest_document/skins/default/list.html @@ -0,0 +1,35 @@ + + + + + + + + + + +
    +
    +
    +
    {$widget_info->title}
    + + + +
    + + +
    + +
    {$oDocument->getRegdate("Y-m-d")}
    +
    + +
    +
    diff --git a/widgets/newest_document/skins/default/normal/document_bullet.gif b/widgets/newest_document/skins/default/normal/document_bullet.gif new file mode 100644 index 000000000..c29051c5d Binary files /dev/null and b/widgets/newest_document/skins/default/normal/document_bullet.gif differ diff --git a/widgets/newest_document/skins/default/normal/style.css b/widgets/newest_document/skins/default/normal/style.css new file mode 100644 index 000000000..b6da9bc70 --- /dev/null +++ b/widgets/newest_document/skins/default/normal/style.css @@ -0,0 +1,75 @@ +.newest_document_default_normal { +} + +.newest_document_default_normal .newest_document_default_box { +} + +.newest_document_default_normal .newest_document_default_box .title_box { + border:1px solid #EEEEEE; + padding:5px; + height:14px; + overflow:hidden; +} + +.newest_document_default_normal .newest_document_default_box .title_box .title { + background:url(./title_bullet.gif) no-repeat left; + font-weight:bold; + height:14px; + padding-left:20px; + float:left; +} + +.newest_document_default_normal .newest_document_default_box .title_box .more A { + float:right; + color:#AAAAAA; + text-decoration:none; + font-weight:bold; + font-size:.75em; +} + +.newest_document_default_normal .newest_document_default_box .document_box { + padding:3px 3px 3px 5px; + clear:both; + border-bottom:1px solid #EEEEEE; + height:16px; + margin:0px 0px 2px 0px; + overflow:hidden; +} + +.newest_document_default_normal .newest_document_default_box .document { + padding:0px 0px 5px 20px; + background:url(./document_bullet.gif) no-repeat left; + float:left; +} + +.newest_document_default_normal .newest_document_default_box .document A { + text-decoration:none; + color:#555555; +} + +.newest_document_default_normal .newest_document_default_box .document A:hover { + text-decoration:underline; + color:#000000; +} + +.newest_document_default_normal .newest_document_default_box .document A:visited { + color:#AAAAAA; +} + +.newest_document_default_normal .newest_document_default_box .document .comment A { + font-size:7pt; + color:#AAAAAA; + letter-spacing:-1px; +} + +.newest_document_default_normal .newest_document_default_box .document .writer { + color:#AAAAAA; +} + + +.newest_document_default_normal .newest_document_default_box .regdate { + color:#AAAAAA; + font-size:8pt; + float:right; + white-space:nowrap; +} diff --git a/widgets/newest_document/skins/default/normal/title_bullet.gif b/widgets/newest_document/skins/default/normal/title_bullet.gif new file mode 100644 index 000000000..12ed834cc Binary files /dev/null and b/widgets/newest_document/skins/default/normal/title_bullet.gif differ diff --git a/widgets/newest_document/skins/default/skin.xml b/widgets/newest_document/skins/default/skin.xml new file mode 100644 index 000000000..db522517a --- /dev/null +++ b/widgets/newest_document/skins/default/skin.xml @@ -0,0 +1,31 @@ + + + 최신글 목록 기본 스킨 + 最新書き込みリストのデフォルトスキン + 主题列表默认皮肤 + Default Skin of Newest Article List + + 제로 + Zero + zero + zero + 최신글 목록 위젯의 기본 스킨 + 最新書き込みリストウィジェットのデフォルトスキン + 主题列表控件的默认皮肤。 + Default skin of newest article list widget + + + + 기본 컬러 + デフォルトカラー + 默认颜色 + Default color + + + 푸른계통의 컬러 + 青系のカラー + 蓝色 + Blue style color + + + diff --git a/widgets/newest_document/skins/xe_official/css/black.css b/widgets/newest_document/skins/xe_official/css/black.css new file mode 100644 index 000000000..7a21fa5da --- /dev/null +++ b/widgets/newest_document/skins/xe_official/css/black.css @@ -0,0 +1,18 @@ +.latest_black { width:100%; padding-bottom:15px; overflow:hidden; position:relative;} +.latest_black h2 { display:block; height:21px; padding:9px 0 0 9px; margin-bottom:12px; color:#ffffff; background:url(../images/black/lineNotice.gif) no-repeat left bottom; font-size:1em;} + +.latest_black ul { } +.latest_black ul li { position:relative; height:21px; background:url(../images/black/bulletD0.gif) no-repeat left 5px; padding-left:10px; overflow:hidden; } + +.latest_black ul li .title { position:relative; z-index:0; overflow:hidden; width:100%; white-space:nowrap;} +.latest_black ul li .title a { color:#818181; text-decoration:none; } +.latest_black ul li .title a:hover { text-decoration:underline; } +.latest_black ul li .title span.comment { color:#FE6700; font:.8em Tahoma; } +.latest_black ul li .title span.comment a { color:#FE6700; font:.8em Tahoma; } + +.latest_black ul li .date { position:relative; z-index:1; } +.latest_black ul li .date span { background:#FFFFFF; position:relative; z-index:1; padding:3px 5px 3px 12px; text-align:right; float:right; top:-16px; _top:-18px; color:#999999; font:.8em Tahoma; } + +.latest_black .more { position:absolute; top:12px; right:11px; color:#54564b; font:.8em Tahoma;} +.latest_black a.more { text-decoration:none;} +.latest_black a.more:hover { text-decoration:underline;} diff --git a/widgets/newest_document/skins/xe_official/css/white.css b/widgets/newest_document/skins/xe_official/css/white.css new file mode 100644 index 000000000..1469a3265 --- /dev/null +++ b/widgets/newest_document/skins/xe_official/css/white.css @@ -0,0 +1,18 @@ +.latest_white { width:100%; padding-bottom:15px; overflow:hidden; position:relative;} +.latest_white h2 { display:block; height:21px; padding:9px 0 0 9px; margin-bottom:12px; color:#000000; background:url(../images/white/lineNotice.gif) no-repeat left bottom; font-size:1em;} + +.latest_white ul { } +.latest_white ul li { position:relative; height:21px; background:url(../images/white/bulletD0.gif) no-repeat left 5px; padding-left:10px; overflow:hidden; } + +.latest_white ul li .title { position:relative; z-index:0; overflow:hidden; width:100%; white-space:nowrap;} +.latest_white ul li .title a { color:#555555; text-decoration:none; } +.latest_white ul li .title a:hover { text-decoration:underline; } +.latest_white ul li .title span.comment { color:#FE6700; font:.8em Tahoma; } +.latest_white ul li .title span.comment a { color:#FE6700; font:.8em Tahoma; } + +.latest_white ul li .date { position:relative; z-index:1; } +.latest_white ul li .date span { background:#FFFFFF; position:relative; z-index:1; padding:3px 5px 3px 12px; text-align:right; float:right; top:-16px; _top:-18px; color:#999999; font:.8em Tahoma; } + +.latest_white .more { position:absolute; top:12px; right:11px; color:#54564b; font:.8em Tahoma;} +.latest_white a.more { text-decoration:none;} +.latest_white a.more:hover { text-decoration:underline;} diff --git a/widgets/newest_document/skins/xe_official/images/black/bulletD0.gif b/widgets/newest_document/skins/xe_official/images/black/bulletD0.gif new file mode 100644 index 000000000..e8e17d4c6 Binary files /dev/null and b/widgets/newest_document/skins/xe_official/images/black/bulletD0.gif differ diff --git a/widgets/newest_document/skins/xe_official/images/black/lineNotice.gif b/widgets/newest_document/skins/xe_official/images/black/lineNotice.gif new file mode 100644 index 000000000..dbf2c8220 Binary files /dev/null and b/widgets/newest_document/skins/xe_official/images/black/lineNotice.gif differ diff --git a/widgets/newest_document/skins/xe_official/images/white/bulletD0.gif b/widgets/newest_document/skins/xe_official/images/white/bulletD0.gif new file mode 100644 index 000000000..e8e17d4c6 Binary files /dev/null and b/widgets/newest_document/skins/xe_official/images/white/bulletD0.gif differ diff --git a/widgets/newest_document/skins/xe_official/images/white/lineNotice.gif b/widgets/newest_document/skins/xe_official/images/white/lineNotice.gif new file mode 100644 index 000000000..dbf2c8220 Binary files /dev/null and b/widgets/newest_document/skins/xe_official/images/white/lineNotice.gif differ diff --git a/widgets/newest_document/skins/xe_official/list.html b/widgets/newest_document/skins/xe_official/list.html new file mode 100644 index 000000000..dbf0517ec --- /dev/null +++ b/widgets/newest_document/skins/xe_official/list.html @@ -0,0 +1,29 @@ + + + + + + + + +
    + +

    {$widget_info->title}

    + + + + more + +
    diff --git a/widgets/newest_document/skins/xe_official/skin.xml b/widgets/newest_document/skins/xe_official/skin.xml new file mode 100644 index 000000000..2fce8df16 --- /dev/null +++ b/widgets/newest_document/skins/xe_official/skin.xml @@ -0,0 +1,41 @@ + + + XE 공식 레이아웃용 최신글 스킨 + XEデフォルトレイアウト用の最新コンテンツ表示スキン + XE 官方网站主题列表 + + 제로 + Zero + zero + + XE 공식 레이아웃에 적합한 최신글 스킨입니다. + 디자인 : 이소라 (http://ra-ra.pe.kr) + 퍼블리싱 : 정찬명 (http://naradesign.net) + 레이아웃 제작 : zero (http://blog.nzeo.com) + + + XEデフォルトレイアウトに最も適した最新コンテンツ表示用のスキンです。 + デザイン:イソラ(http://ra-ra.pe.kr) + パブリシング:ジョンチャンミョン(http://naradesign.net) + レイアウト作成:Zero (http://blog.nzeo.com) + + + 适合XE 官方网站的主题列表。 + 设计 : So-Ra Lee(http://ra-ra.pe.kr) + HTML/CSS : Chan-Myung Jeong(http://naradesign.net) + 布局: zero (http://blog.nzeo.com) + + + + + 흰색 바탕용 + 白い背景 + 白色背景 + + + 어두운 바탕용 + 暗い背景 + 暗色背景 + + + diff --git a/widgets/newest_images/conf/info.xml b/widgets/newest_images/conf/info.xml new file mode 100644 index 000000000..6cec49b59 --- /dev/null +++ b/widgets/newest_images/conf/info.xml @@ -0,0 +1,157 @@ + + + 최근 이미지 출력 + 最新イメージ表示 + 图片列表 + Display Newest Images + + 제로 + Zero + Zero + zero + 작성된 글의 내용에 포함된 이미지를 출력하는 위젯입니다. + 作成されたコンテンツの内容に含まれているイメージを表示するウィジェットです。 + 显示主题当中包含图片的控件。 + This widget displays images on articles. + + + + 제목 + 栏目名 + タイトル + Title + text + 최근 게시물의 제목으로 출력됩니다. + 显示为最新主题列表的标题。 + 最近の書き込みのタイトルとして表示されます。 + It will be the title of the newest articles. + + + 대상 모듈 + モジュール + 对象模块 + Target Module + mid_list + 선택하신 모듈에 등록된 글을 대상으로 합니다. + チェックされたコンテンツを対象とします。 + 把被选模块中的主题作为对象。 + Articles on chosen module will be the target. + + + 글 제목 길이 + 題名の文字数 + 标题长度 + Length of Subject + text + 정한 글자수만큼 글 제목을 잘라서 출력합니다. (기본 10자) + 指定された文字数分の長さを切り取って表示します。(デフォルト10文字) + 可以指定标题长度。(默认为10字) + It cuts the length of subject and displays (10 letters as default). (기본 10자) + + + 이미지 가로크기 + イメージ横幅 + 宽度 + Width of Image + text + 출력될 이미지의 가로크기를 정하실 수 있습니다. (기본 100) + 表示されるイメージの横幅のサイズを指定することができます(デフォルト100)。 + 可以指定要显示的图片宽度。(默认为100) + You can set the width of image. (100 as default) + + + 가로 이미지 수 + イメージ数 + 横向图片数 + Number of Images + text + 출력될 가로 이미지의 수를 정하실 수 있습니다. (기본 5개) + 表示されるイメージの数を指定することができます(デフォルト5個)。 + 可以指定要显示的横向图片个数。(默认为5个) + You can set the number of images to display. (5 as default) + + + 세로 이미지 수 + イメージ数 + 纵向图片数 + Number of Images + text + 출력될 세로 이미지의 수를 정하실 수 있습니다. (기본 1개) + 表示されるイメージの数を指定することができます(デフォルト5個)。 + 可以指定要显示的纵向图片个数。(默认为1个) + You can set the number of images to display. (5 as default) + + + 글쓴이 표시 + 投稿者表示 + 显示昵称 + Display Author + select + + + 표시 + 显示 + Y + + + 표시하지 않음 + 不显示 + N + + + + 작성일 표시 + 作成日表示 + 显示发表日期 + Display Registered Date + select + + + 표시 + 显示 + Y + + + 표시하지 않음 + 不显示 + N + + + + 조회수 표시 + 照合数表示 + 显示查看数 + Display Hit + + select + + 표시 + 显示 + Y + + + 표시하지 않음 + 不显示 + N + + + + 추천수 표시 + 推薦数表示 + 显示推荐数 + Display Votes + + select + + 표시 + 显示 + Y + + + 표시하지 않음 + 不显示 + N + + + + diff --git a/widgets/newest_images/newest_images.class.php b/widgets/newest_images/newest_images.class.php new file mode 100644 index 000000000..e83a9a918 --- /dev/null +++ b/widgets/newest_images/newest_images.class.php @@ -0,0 +1,108 @@ +title_length = (int)$args->title_length; + if(!$widget_info->title_length) $widget_info->title_length = 10; + + // 썸네일 가로 크기 + $widget_info->thumbnail_width = (int)$args->thumbnail_width; + if(!$widget_info->thumbnail_width) $widget_info->thumbnail_width = 100; + + // 가로 이미지 수 + $widget_info->rows_list_count = (int)$args->rows_list_count; + if(!$widget_info->rows_list_count) $widget_info->rows_list_count = 5; + + // 세로 이미지 수 + $widget_info->cols_list_count = (int)$args->cols_list_count; + if(!$widget_info->cols_list_count) $widget_info->cols_list_count = 1; + + // 노출 여부 체크 + if($args->display_author!='Y') $widget_info->display_author = 'N'; + else $widget_info->display_author = 'Y'; + if($args->display_regdate!='Y') $widget_info->display_regdate = 'N'; + else $widget_info->display_regdate = 'Y'; + if($args->display_readed_count!='Y') $widget_info->display_readed_count = 'N'; + else $widget_info->display_readed_count = 'Y'; + if($args->display_voted_count!='Y') $widget_info->display_voted_count = 'N'; + else $widget_info->display_voted_count = 'Y'; + + // 제목 + $widget_info->title = $args->title; + + // 대상 모듈 정리 + $mid_list = explode(",",$args->mid_list); + + // 템플릿 파일에서 사용할 변수들을 세팅 + if(count($mid_list)==1) $widget_info->module_name = $mid_list[0]; + + // 변수 정리 + $obj->sort_index = $order_target; + $obj->list_count = $widget_info->rows_list_count * $widget_info->cols_list_count; + + // mid에 해당하는 module_srl을 구함 + $oModuleModel = &getModel('module'); + $module_srl_list = $oModuleModel->getModuleSrlByMid($mid_list); + if(is_array($module_srl_list)) $obj->module_srls = implode(",",$module_srl_list); + else $obj->module_srls = $module_srl_list; + $obj->direct_download = 'Y'; + $obj->isvalid = 'Y'; + + // 정해진 모듈에서 문서별 파일 목록을 구함 + $files_output = executeQuery("file.getOneFileInDocument", $obj); + + // 결과에서 문서 번호만을 따로 추출 + if($files_output->data) { + foreach($files_output->data as $key => $val) { + $document_srl_list[] = $val->upload_target_srl; + } + } + + $oDocumentModel = &getModel('document'); + if(count($document_srl_list)) { + + $documents_output = $oDocumentModel->getDocuments($document_srl_list); + if(!count($documents_output)) return; + + foreach($documents_output as $key => $val) { + $document_list[] = $val; + } + + } + + $document_count = count($document_list); + $total_count = $widget_info->rows_list_count * $widget_info->cols_list_count; + for($i=$document_count;$i<$total_count;$i++) $document_list[] = new DocumentItem(); + + $widget_info->document_list = $document_list; + + Context::set('widget_info', $widget_info); + + // 템플릿의 스킨 경로를 지정 (skin, colorset에 따른 값을 설정) + $tpl_path = sprintf('%sskins/%s', $this->widget_path, $args->skin); + Context::set('colorset', $args->colorset); + + // 템플릿 파일을 지정 + $tpl_file = 'list'; + + // 템플릿 컴파일 + $oTemplate = &TemplateHandler::getInstance(); + $output = $oTemplate->compile($tpl_path, $tpl_file); + return $output; + } + } +?> diff --git a/widgets/newest_images/skins/default/css/normal.css b/widgets/newest_images/skins/default/css/normal.css new file mode 100644 index 000000000..61791d942 --- /dev/null +++ b/widgets/newest_images/skins/default/css/normal.css @@ -0,0 +1,23 @@ +.ni_box { overflow:hidden; } +.ni_box .title_box { border:1px solid #EEEEEE; padding:5px; height:14px; overflow:hidden; } +.ni_box .title_box .title { no-repeat left; font-weight:bold; height:14px; float:left; } +.ni_box .title_box .more A { float:right; color:#AAAAAA; text-decoration:none; font-weight:bold; font-size:.75em; } + +.ni_box .thumbnail_box { width:100%; table-layout:fixed; } +.ni_box .thumbnail_box .thumbnail { margin:3px; padding:3px; border:1px solid #EFEFEF; text-align:center; } +.ni_box .thumbnail_box .thumbnail:hover { border:1px solid #888888; } +.ni_box .thumbnail_box .thumbnail img { border:none; } +.ni_box .thumbnail_box .thumbnail img:hover { border:none; } + +.ni_box .thumbnail_box a { color:#444444; text-decoration:none; } +.ni_box .thumbnail_box a:visited { color:#AAAAAA; text-decoration:none; } + +.ni_box .thumbnail_box td.bottomBorder { border-bottom:1px dashed #EEEEEE; padding-bottom:5px; } +.ni_box .thumbnail_box div strong { font-weight:bold; font-size:0.75em; color:#CCCCCC; } +.ni_box .thumbnail_box div.author { color:#AAAAAA; } +.ni_box .thumbnail_box div.author a { color:#AAAAAA; } +.ni_box .thumbnail_box div.regdate { font-size:0.75em; color:#CCCCCC; margin-top:2px;} + +.ni_box .thumbnail_box div.readAndVoted { color:#AAAAAA; font-size:0.75em; } +.ni_box .thumbnail_box div.readAndVoted span.div_block { color:#DDDDDD; font-size:0.75em; } +.ni_box .thumbnail_box div.readAndVoted strong { color:#FE6700; } diff --git a/widgets/newest_images/skins/default/images/blank.gif b/widgets/newest_images/skins/default/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/widgets/newest_images/skins/default/images/blank.gif differ diff --git a/widgets/newest_images/skins/default/list.html b/widgets/newest_images/skins/default/list.html new file mode 100644 index 000000000..662b09849 --- /dev/null +++ b/widgets/newest_images/skins/default/list.html @@ -0,0 +1,67 @@ + + + + + + +
    + +
    +
    {$widget_info->title}
    + + + +
    + + + + + {@ $count = 0; } + + + + {@ $oDocument = $widget_info->document_list[$i*$widget_info->cols_list_count + $j]} + + + + + +
    rows_list_count>1)-->class="bottomBorder"> + +
    + +
    + {$oDocument->getTitleText($widget_info->title_length)} + [{$oDocument->getCommentCount()}] +
    + +
    {$oDocument->getNickName()}
    + + + +
    {$oDocument->getRegdate()}
    + + + +
    + + + {$lang->readed_count} {$oDocument->get('readed_count')} + + + + + + | + + {$lang->voted_count} {$oDocument->get('voted_count')} + + +
    + + + +
     
    + +
    +
    diff --git a/widgets/newest_images/skins/default/skin.xml b/widgets/newest_images/skins/default/skin.xml new file mode 100644 index 000000000..0acac1413 --- /dev/null +++ b/widgets/newest_images/skins/default/skin.xml @@ -0,0 +1,25 @@ + + + 최신 이미지 위젯 기본 스킨 + 最新イメージ表示のデフォルトスキン + 最新图片列表默认皮肤 + Newest Image Widget Default Skin + + 제로 + Zero + Zero + Zero + 최신 이미지 위젯의 기본 스킨입니다. + 最新イメージを表示するウィジェットのデフォルトスキンです。 + 最新图片列表控件的默认皮肤. + This is default skin of newest image widget. + + + + 기본 컬러 + デフォルトカラー + 默认颜色 + Default Color + + + diff --git a/widgets/newest_images/skins/xe_official/css/normal.css b/widgets/newest_images/skins/xe_official/css/normal.css new file mode 100644 index 000000000..bb11d371f --- /dev/null +++ b/widgets/newest_images/skins/xe_official/css/normal.css @@ -0,0 +1,24 @@ +.ni_box { padding-bottom:5px; overflow:hidden; position:relative;} +.ni_box h2 { font-size:1em; display:block; height:21px; padding:9px 0 0 9px; margin-bottom:5px; color:#000000; background:url(../images/normal/lineNotice.gif) no-repeat left bottom;} + +.ni_box .more { position:absolute; top:12px; right:11px; color:#000000; font:.8em Tahoma;} +.ni_box a.more { text-decoration:none;} +.ni_box a.more:hover { text-decoration:underline;} + +.ni_box .thumbnail_box { width:100%; table-layout:fixed; } +.ni_box .thumbnail_box .thumbnail { margin:3px; padding:3px; border:none; text-align:center; } +.ni_box .thumbnail_box .thumbnail img { border:1px solid #DEDEDE; } +.ni_box .thumbnail_box .thumbnail img:hover { border:1px solid #54564b; } + +.ni_box .thumbnail_box a { color:#000000; text-decoration:none; } +.ni_box .thumbnail_box a:visited { color:#54564b; text-decoration:none; } + +.ni_box .thumbnail_box td.bottomBorder { border-bottom:1px dashed #EEEEEE; padding-bottom:5px; } +.ni_box .thumbnail_box div strong { font-weight:bold; font-size:0.75em; color:#ed2a32; } +.ni_box .thumbnail_box div.author { color:#54564b; } +.ni_box .thumbnail_box div.author a { color:#54564b; } +.ni_box .thumbnail_box div.regdate { font-size:0.75em; color:#AAAAAA; margin-top:2px;} + +.ni_box .thumbnail_box div.readAndVoted { color:#333333; font-size:0.75em; } +.ni_box .thumbnail_box div.readAndVoted span.div_block { color:#333333; font-size:0.75em; } +.ni_box .thumbnail_box div.readAndVoted strong { color:#FE6700; } diff --git a/widgets/newest_images/skins/xe_official/images/blank.gif b/widgets/newest_images/skins/xe_official/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/widgets/newest_images/skins/xe_official/images/blank.gif differ diff --git a/widgets/newest_images/skins/xe_official/images/normal/bulletD0.gif b/widgets/newest_images/skins/xe_official/images/normal/bulletD0.gif new file mode 100644 index 000000000..e8e17d4c6 Binary files /dev/null and b/widgets/newest_images/skins/xe_official/images/normal/bulletD0.gif differ diff --git a/widgets/newest_images/skins/xe_official/images/normal/lineNotice.gif b/widgets/newest_images/skins/xe_official/images/normal/lineNotice.gif new file mode 100644 index 000000000..dbf2c8220 Binary files /dev/null and b/widgets/newest_images/skins/xe_official/images/normal/lineNotice.gif differ diff --git a/widgets/newest_images/skins/xe_official/list.html b/widgets/newest_images/skins/xe_official/list.html new file mode 100644 index 000000000..8b7732177 --- /dev/null +++ b/widgets/newest_images/skins/xe_official/list.html @@ -0,0 +1,67 @@ + + + + + + +
    + +

    {$widget_info->title}

    + + + +
    + + {@ $count = 0; } + + + + {@ $oDocument = $widget_info->document_list[$i*$widget_info->cols_list_count + $j]} + + + + + +
    rows_list_count>1)-->class="bottomBorder"> + +
    + +
    + {$oDocument->getTitleText($widget_info->title_length)} + [{$oDocument->getCommentCount()}] +
    + +
    {$oDocument->getNickName()}
    + + + +
    {$oDocument->getRegdate()}
    + + + +
    + + + {$lang->readed_count} {$oDocument->get('readed_count')} + + + + + + | + + {$lang->voted_count} {$oDocument->get('voted_count')} + + +
    + + + +
     
    + +
    + + + more + +
    diff --git a/widgets/newest_images/skins/xe_official/skin.xml b/widgets/newest_images/skins/xe_official/skin.xml new file mode 100644 index 000000000..5e645b8ce --- /dev/null +++ b/widgets/newest_images/skins/xe_official/skin.xml @@ -0,0 +1,25 @@ + + + 최신 이미지 위젯 기본 스킨 + 最新イメージ表示のデフォルトスキン + 官方网站图片列表皮肤 + Newest Image Widget Default Skin + + 제로 + Zero + Zero + Zero + 최신 이미지 위젯의 기본 스킨입니다. + 最新イメージを表示するウィジェットのデフォルトスキンです。 + 最新图片列表控件的官方网站皮肤。 + This is default skin of newest image widget. + + + + 기본 컬러 + デフォルトカラー + 默认颜色 + Default Color + + + diff --git a/widgets/newest_trackback/conf/info.xml b/widgets/newest_trackback/conf/info.xml new file mode 100644 index 000000000..f10819905 --- /dev/null +++ b/widgets/newest_trackback/conf/info.xml @@ -0,0 +1,52 @@ + + + 최근 엮인글 출력 + 引用列表 + 最近のトラックバック + Display Newest Trackbacks + + 제로 + zero + Zero + zero + 최근 엮인글 (trackback)을 출력하는 위젯입니다. + 显示最新引用 (trackback)列表的控件。 + 最近のトラックバック(trackback)を表示させるウィジェットです。 + This widget displays newest trackbacks + + + + 제목 + 栏目名 + タイトル + Title + text + 최근 엮인글 제목으로 출력됩니다. + 显示为最新引用列表的标题。 + 最新のトラックバックタイトルとして表示されます。 + This will be the title of the Newest Trackbacks to be displayed. + + + 목록수 + 目录数 + リスト数 + The number of list + text + 출력될 목록의 수를 정하실 수 있습니다. (기본 5개) + 可设置要显示的目录数。 (默认为5个) + 出力されるリストの数を指定することができます(デフォルト5個) + You can set the number of list to be displayed.(default is 5) + + + 대상 모듈 + 模块对象 + モジュール + Target Module + mid_list + 선택하신 모듈에 등록된 글을 대상으로 합니다. + 将把被选模块当中的主题作为对象。 + チェックされたモジュールに登録されたコンテンツ(書き込み)を対象とします。 + The target articles for the newest trackbacks will be the ones submitted in the selected module. + + + diff --git a/widgets/newest_trackback/newest_trackback.class.php b/widgets/newest_trackback/newest_trackback.class.php new file mode 100644 index 000000000..461549c2f --- /dev/null +++ b/widgets/newest_trackback/newest_trackback.class.php @@ -0,0 +1,57 @@ +title; + $order_target = $args->order_target; + $order_type = $args->order_type; + $list_count = (int)$args->list_count; + if(!$list_count) $list_count = 5; + $mid_list = explode(",",$args->mid_list); + + // TrackbackModel::getTrackbackList()를 이용하기 위한 변수 정리 + $obj->mid = $mid_list; + $obj->sort_index = $order_target; + $obj->list_count = $list_count; + + // trackback 모듈의 model 객체를 받아서 getTrackbackList() method를 실행 + $oTrackbackModel = &getModel('trackback'); + $output = $oTrackbackModel->getNewestTrackbackList($obj); + + // 템플릿 파일에서 사용할 변수들을 세팅 + if(count($mid_list)==1) $widget_info->module_name = $mid_list[0]; + + $widget_info->title = $title; + $widget_info->trackback_list = $output->data; + + preg_match_all('/(width|height)([^[:digit:]]+)([0-9]+)/i',$args->style,$matches); + $widget_info->width = trim($matches[3][0]); + Context::set('widget_info', $widget_info); + + // 템플릿의 스킨 경로를 지정 (skin, colorset에 따른 값을 설정) + $tpl_path = sprintf('%sskins/%s', $this->widget_path, $args->skin); + Context::set('colorset', $args->colorset); + + // 템플릿 파일을 지정 + $tpl_file = 'list'; + + // 템플릿 컴파일 + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + } +?> diff --git a/widgets/newest_trackback/skins/blog_newest_trackback/css/cyan.css b/widgets/newest_trackback/skins/blog_newest_trackback/css/cyan.css new file mode 100644 index 000000000..ba1323967 --- /dev/null +++ b/widgets/newest_trackback/skins/blog_newest_trackback/css/cyan.css @@ -0,0 +1,6 @@ +div#newestTrackback { position:relative; border:1px solid #e0e1db; background:url(../images/cyan/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +div#newestTrackback h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +div#newestTrackback .trackbackList { padding:1.2em; overflow:hidden;} +div#newestTrackback .trackbackList li { display:block; color:#a4a4a4; margin-right:.1em; } +div#newestTrackback .trackbackList li a { color:#a4a4a4; line-height:1.5em; } diff --git a/widgets/newest_trackback/skins/blog_newest_trackback/css/green.css b/widgets/newest_trackback/skins/blog_newest_trackback/css/green.css new file mode 100644 index 000000000..33ed535c4 --- /dev/null +++ b/widgets/newest_trackback/skins/blog_newest_trackback/css/green.css @@ -0,0 +1,6 @@ +div#newestTrackback { position:relative; border:1px solid #e0e1db; background:url(../images/green/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +div#newestTrackback h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +div#newestTrackback .trackbackList { padding:1.2em; overflow:hidden;} +div#newestTrackback .trackbackList li { display:block; color:#a4a4a4; margin-right:.1em; } +div#newestTrackback .trackbackList li a { color:#a4a4a4; line-height:1.5em; } diff --git a/widgets/newest_trackback/skins/blog_newest_trackback/css/normal.css b/widgets/newest_trackback/skins/blog_newest_trackback/css/normal.css new file mode 100644 index 000000000..338156dab --- /dev/null +++ b/widgets/newest_trackback/skins/blog_newest_trackback/css/normal.css @@ -0,0 +1,6 @@ +div#newestTrackback { position:relative; border:1px solid #e0e1db; background:url(../images/normal/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +div#newestTrackback h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +div#newestTrackback .trackbackList { padding:1.2em; overflow:hidden;} +div#newestTrackback .trackbackList li { display:block; color:#a4a4a4; margin-right:.1em; } +div#newestTrackback .trackbackList li a { color:#a4a4a4; line-height:1.5em; } diff --git a/widgets/newest_trackback/skins/blog_newest_trackback/css/purple.css b/widgets/newest_trackback/skins/blog_newest_trackback/css/purple.css new file mode 100644 index 000000000..60607bc05 --- /dev/null +++ b/widgets/newest_trackback/skins/blog_newest_trackback/css/purple.css @@ -0,0 +1,6 @@ +div#newestTrackback { position:relative; border:1px solid #e0e1db; background:url(../images/purple/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +div#newestTrackback h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +div#newestTrackback .trackbackList { padding:1.2em; overflow:hidden;} +div#newestTrackback .trackbackList li { display:block; color:#a4a4a4; margin-right:.1em; } +div#newestTrackback .trackbackList li a { color:#a4a4a4; line-height:1.5em; } diff --git a/widgets/newest_trackback/skins/blog_newest_trackback/css/red.css b/widgets/newest_trackback/skins/blog_newest_trackback/css/red.css new file mode 100644 index 000000000..10e02173c --- /dev/null +++ b/widgets/newest_trackback/skins/blog_newest_trackback/css/red.css @@ -0,0 +1,6 @@ +div#newestTrackback { position:relative; border:1px solid #e0e1db; background:url(../images/red/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +div#newestTrackback h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +div#newestTrackback .trackbackList { padding:1.2em; overflow:hidden;} +div#newestTrackback .trackbackList li { display:block; color:#a4a4a4; margin-right:.1em; } +div#newestTrackback .trackbackList li a { color:#a4a4a4; line-height:1.5em; } diff --git a/widgets/newest_trackback/skins/blog_newest_trackback/images/cyan/bgBoxTypeB.gif b/widgets/newest_trackback/skins/blog_newest_trackback/images/cyan/bgBoxTypeB.gif new file mode 100644 index 000000000..99a877045 Binary files /dev/null and b/widgets/newest_trackback/skins/blog_newest_trackback/images/cyan/bgBoxTypeB.gif differ diff --git a/widgets/newest_trackback/skins/blog_newest_trackback/images/green/bgBoxTypeB.gif b/widgets/newest_trackback/skins/blog_newest_trackback/images/green/bgBoxTypeB.gif new file mode 100644 index 000000000..1cdca75c2 Binary files /dev/null and b/widgets/newest_trackback/skins/blog_newest_trackback/images/green/bgBoxTypeB.gif differ diff --git a/widgets/newest_trackback/skins/blog_newest_trackback/images/normal/bgBoxTypeB.gif b/widgets/newest_trackback/skins/blog_newest_trackback/images/normal/bgBoxTypeB.gif new file mode 100644 index 000000000..09f7dd59c Binary files /dev/null and b/widgets/newest_trackback/skins/blog_newest_trackback/images/normal/bgBoxTypeB.gif differ diff --git a/widgets/newest_trackback/skins/blog_newest_trackback/images/purple/bgBoxTypeB.gif b/widgets/newest_trackback/skins/blog_newest_trackback/images/purple/bgBoxTypeB.gif new file mode 100644 index 000000000..9e130ae44 Binary files /dev/null and b/widgets/newest_trackback/skins/blog_newest_trackback/images/purple/bgBoxTypeB.gif differ diff --git a/widgets/newest_trackback/skins/blog_newest_trackback/images/red/bgBoxTypeB.gif b/widgets/newest_trackback/skins/blog_newest_trackback/images/red/bgBoxTypeB.gif new file mode 100644 index 000000000..01406b48a Binary files /dev/null and b/widgets/newest_trackback/skins/blog_newest_trackback/images/red/bgBoxTypeB.gif differ diff --git a/widgets/newest_trackback/skins/blog_newest_trackback/list.html b/widgets/newest_trackback/skins/blog_newest_trackback/list.html new file mode 100644 index 000000000..c462dc41b --- /dev/null +++ b/widgets/newest_trackback/skins/blog_newest_trackback/list.html @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + +
    +
    + +

    {$widget_info->title}

    + +

    newest trackbacks

    + +
    + + + +
    diff --git a/widgets/newest_trackback/skins/blog_newest_trackback/skin.xml b/widgets/newest_trackback/skins/blog_newest_trackback/skin.xml new file mode 100644 index 000000000..bb25accc0 --- /dev/null +++ b/widgets/newest_trackback/skins/blog_newest_trackback/skin.xml @@ -0,0 +1,49 @@ + + + 블로그 스타일의 최신 엮인글 목록 + ブログスタイルの最新のトラックバックリスト + 博客式最新引用列表 + Newest Trackback List of Blog Style + + 제로 + Zero + zero + zero + 블로그 스타일로 최신 엮인글 출력합니다. + ブログスタイルで最新のトラックバックのコンテンツ(書き込み)を表示します。 + 显示为博客式的最新引用列表。 + It displays newest trackback list with blog style. + + + + 기본 컬러 + デフォルトカラー + 默认颜色 + Default color + + + 청록색 + 青緑 + 青绿色 + cyan + + + 초록색 + + 绿色 + green + + + 빨간색 + + 红色 + red + + + 보라색 + + 紫色 + purple + + + diff --git a/widgets/newest_trackback/skins/cozy_simple/css/blue.css b/widgets/newest_trackback/skins/cozy_simple/css/blue.css new file mode 100644 index 000000000..6ff18a1e0 --- /dev/null +++ b/widgets/newest_trackback/skins/cozy_simple/css/blue.css @@ -0,0 +1 @@ +div.trackbackBox .header h2 { font-size:1em; color:#1187d8;} diff --git a/widgets/newest_trackback/skins/cozy_simple/css/bluish_green.css b/widgets/newest_trackback/skins/cozy_simple/css/bluish_green.css new file mode 100644 index 000000000..d43dfc191 --- /dev/null +++ b/widgets/newest_trackback/skins/cozy_simple/css/bluish_green.css @@ -0,0 +1 @@ +div.trackbackBox .header h2 { font-size:1em; color:#9ab09f;} diff --git a/widgets/newest_trackback/skins/cozy_simple/css/common.css b/widgets/newest_trackback/skins/cozy_simple/css/common.css new file mode 100644 index 000000000..753f183c7 --- /dev/null +++ b/widgets/newest_trackback/skins/cozy_simple/css/common.css @@ -0,0 +1,7 @@ +div.trackbackBox { padding-bottom:1em;} +div.trackbackBox .header { padding:7px 0 0 12px; height:21px; _height:20px; background:#f5f5f5; } +*:first-child+html div.trackbackBox .header { height:20px; color:#ef2121;} + +div.trackbackBox ul { padding:.5em; overflow:hidden;} +div.trackbackBox ul li { color:#a4a4a4; margin-right:.1em; line-height:1.5em;} +div.trackbackBox ul li a { color:#a4a4a4;} diff --git a/widgets/newest_trackback/skins/cozy_simple/css/green.css b/widgets/newest_trackback/skins/cozy_simple/css/green.css new file mode 100644 index 000000000..4158308a3 --- /dev/null +++ b/widgets/newest_trackback/skins/cozy_simple/css/green.css @@ -0,0 +1 @@ +div.trackbackBox .header h2 { font-size:1em; color:#8dc63f;} diff --git a/widgets/newest_trackback/skins/cozy_simple/css/pink.css b/widgets/newest_trackback/skins/cozy_simple/css/pink.css new file mode 100644 index 000000000..354d82ac8 --- /dev/null +++ b/widgets/newest_trackback/skins/cozy_simple/css/pink.css @@ -0,0 +1 @@ +div.trackbackBox .header h2 { font-size:1em; color:#f70795;} diff --git a/widgets/newest_trackback/skins/cozy_simple/css/red.css b/widgets/newest_trackback/skins/cozy_simple/css/red.css new file mode 100644 index 000000000..7a4c1a742 --- /dev/null +++ b/widgets/newest_trackback/skins/cozy_simple/css/red.css @@ -0,0 +1 @@ +div.trackbackBox .header h2 { font-size:1em; color:#ef2121;} diff --git a/widgets/newest_trackback/skins/cozy_simple/list.html b/widgets/newest_trackback/skins/cozy_simple/list.html new file mode 100644 index 000000000..9cd629670 --- /dev/null +++ b/widgets/newest_trackback/skins/cozy_simple/list.html @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + +
    +
    + +

    {$widget_info->title}

    + +

    newest trackbacks

    + +
    + + + +
    diff --git a/widgets/newest_trackback/skins/cozy_simple/skin.xml b/widgets/newest_trackback/skins/cozy_simple/skin.xml new file mode 100644 index 000000000..6f5dc8e3c --- /dev/null +++ b/widgets/newest_trackback/skins/cozy_simple/skin.xml @@ -0,0 +1,65 @@ + + + cozy simple + Cozyシンプル + cozy simple skin + Cozy样式皮肤 + + 제로 + Zero + zero + Zero + + cozy simple 위젯입니다. + 디자인 : 서기정 (http://blog.naver.com/addcozy) + HTML/CSS : 소지훈 + + + Cozyシンプルウィジェットです。 + デザイン:(http://blog.naver.com/addcozy) + HTML/CSS:ソジフン + + + This is cozy simple widget. + Design : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + Cozy样式皮肤。 + 设计 : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + + + 빨간색 + + Red + 红色 + + + 초록색 + + Green + 绿色 + + + 파란색 + + Blue + 蓝色 + + + 분홍색 + ピンク + Pink + 粉红色 + + + 청록색 + 青緑 + Cyan + 青绿色 + + + diff --git a/widgets/styx_clock/conf/info.xml b/widgets/styx_clock/conf/info.xml new file mode 100644 index 000000000..27d02074b --- /dev/null +++ b/widgets/styx_clock/conf/info.xml @@ -0,0 +1,80 @@ + + + 플래시 시계 + 时钟 + フラッシュ時計 + Flash Clock + + 스틱스 + styx + Styx + styx + 플래쉬로 된 시계를 출력합니다. + 显示Flash时钟的控件。 + フラッシュ時計を出力します。 + This widget displays a digital clock made of flash. + + + + 가로길이 + 宽度 + 横幅サイズ + Width + text + 가로길이를 지정하실 수 있습니다. (기본 200px) + 可以设置宽度。 (默认为 200px) + 横幅サイズを指定することができます。(デフォルト200px) + It will be able to set the width. (default is 200px) + + + 테마 + 风格 + テーマ + Theme + select + 흰색/검은색 배경색에 따라 조절하시면 됩니다. + 可以根据设置黑/白背景色来进行调解。 + 白/黒の背景で調節します。 + You may select a theme according to white/black background color. + + 흰색 배경 + 白色 + 白の背景 + White Background + white + + + 검은색 배경 + 黑色 + 黒の背景 + Black Background + black + + + + 일자 표시 + 显示日期 + 年月日表示 + Date Indication + select + 시계내에 일자를 표시하는 기능을 끄거나 켜실 수 있습니다. + 可以开启/关闭时钟内日期的显示。 + 時計内に年月日を表示させる機能がオン・オフできます。 + You can set on or off the function of the date indication in the clock + + 나타냄 + 显示 + 表示 + Show + + + + 숨김 + 关闭 + 隠す + Hide + false + + + + diff --git a/widgets/styx_clock/skins/default/clock.html b/widgets/styx_clock/skins/default/clock.html new file mode 100644 index 000000000..45fa900ca --- /dev/null +++ b/widgets/styx_clock/skins/default/clock.html @@ -0,0 +1,3 @@ + diff --git a/widgets/styx_clock/skins/default/moto/clock.swf b/widgets/styx_clock/skins/default/moto/clock.swf new file mode 100644 index 000000000..495126eea Binary files /dev/null and b/widgets/styx_clock/skins/default/moto/clock.swf differ diff --git a/widgets/styx_clock/skins/default/red/clock.swf b/widgets/styx_clock/skins/default/red/clock.swf new file mode 100644 index 000000000..0f6d046e1 Binary files /dev/null and b/widgets/styx_clock/skins/default/red/clock.swf differ diff --git a/widgets/styx_clock/skins/default/skin.xml b/widgets/styx_clock/skins/default/skin.xml new file mode 100644 index 000000000..a7f7ba9ea --- /dev/null +++ b/widgets/styx_clock/skins/default/skin.xml @@ -0,0 +1,37 @@ + + + 플래시 시계 + フラッシュ時計 + Flash时钟 + Flash Clock + + styx + Styx + styx + styx + 플래시 시계를 출력합니다. + フラッシュ時計を表示します。 + 显示Flash时钟。 + It displays flash clock. + + + + moto + MOTO + moto + moto + + + vis + VIS + vis + vis + + + red + RED + red + red + + + diff --git a/widgets/styx_clock/skins/default/vis/clock.swf b/widgets/styx_clock/skins/default/vis/clock.swf new file mode 100755 index 000000000..843bc4846 Binary files /dev/null and b/widgets/styx_clock/skins/default/vis/clock.swf differ diff --git a/widgets/styx_clock/styx_clock.class.php b/widgets/styx_clock/styx_clock.class.php new file mode 100644 index 000000000..084df2d84 --- /dev/null +++ b/widgets/styx_clock/styx_clock.class.php @@ -0,0 +1,43 @@ +widget_path, $args->skin); + $colorset = $args->colorset; + + // 템플릿 파일을 지정 + $tpl_file = 'clock'; + + $theme = $args->theme; + if($theme != "white") $theme = "black"; + + $day = $args->day; + if($day != "false") $day = "true"; + + $clock_width = $args->clock_width; + if(!$clock_width) $clock_width = 200; + $widget_info->clock_width = $clock_width; + $widget_info->src = sprintf("%s%s/%s/clock.swf?theme=%s&day=%s", Context::getRequestUri(), $tpl_path, $colorset, $theme, $day); + + Context::set('widget_info', $widget_info); + + // 템플릿 컴파일 + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + } +?> diff --git a/widgets/tag_list/conf/info.xml b/widgets/tag_list/conf/info.xml new file mode 100644 index 000000000..a345b55f4 --- /dev/null +++ b/widgets/tag_list/conf/info.xml @@ -0,0 +1,52 @@ + + + 꼬리표 목록 출력 + 标签 + タグリスト表示 + Show Tag List + + 제로 + 제로 + Zero + zero + 선택된 모듈의 꼬리표 목록을 정해진 순위만큼 노출하여 줍니다 + 显示被选模块指定个数的标签目录。 + 選択されたモジュールのタグリストを指定された順位まで表示します。 + This widget displays configured number of tags from target module + + + + 제목 + 栏目名 + タイトル + Title + text + 꼬리표 출력시 제목으로 출력됩니다. + 显示为标签目录的标题。 + タグ出力の際、タイトルとして表示されます。 + This will be shown as a title with tag list + + + 목록수 + 目录数 + リスト数 + Number of tags + text + 출력될 목록의 수를 정하실 수 있습니다. (기본 20개) + 可设置要显示的标签数。 (默认为 20个) + 出力されるリストの数を指定することができます。(デフォルト20個) + You can configure the number of tags to show. (Default is 20) + + + 대상 모듈 + 模块对象 + モジュール + Target Module + mid_list + 선택하신 모듈에 등록된 꼬리표를 대상으로 합니다. + 将把被选模块当中的标签作为对象。 + チェックされたモジュールに登録されたタグを対象とします。 + Tag list will be shown based on this target module. + + + diff --git a/widgets/tag_list/skins/blog_tag_list/css/cyan.css b/widgets/tag_list/skins/blog_tag_list/css/cyan.css new file mode 100644 index 000000000..35cb0df31 --- /dev/null +++ b/widgets/tag_list/skins/blog_tag_list/css/cyan.css @@ -0,0 +1,9 @@ +div#tag { position:relative; border:1px solid #e0e1db; background:url(../images/cyan/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +div#tag h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +div#tag .tagList { padding:1.2em; overflow:hidden;} +div#tag .tagList li { display:inline; color:#a4a4a4; margin-right:.1em; line-height:1.5em;} +div#tag .tagList li a { color:#a4a4a4;} +div#tag .tagList li.typeA a { color:#fe3614; font-weight:bold;} +div#tag .tagList li.typeB a { color:#fe3614;} +div#tag .tagList li.typeC a { font-weight:bold;} diff --git a/widgets/tag_list/skins/blog_tag_list/css/green.css b/widgets/tag_list/skins/blog_tag_list/css/green.css new file mode 100644 index 000000000..854a0c01d --- /dev/null +++ b/widgets/tag_list/skins/blog_tag_list/css/green.css @@ -0,0 +1,9 @@ +div#tag { position:relative; border:1px solid #e0e1db; background:url(../images/green/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +div#tag h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +div#tag .tagList { padding:1.2em; overflow:hidden;} +div#tag .tagList li { display:inline; color:#a4a4a4; margin-right:.1em; line-height:1.5em;} +div#tag .tagList li a { color:#a4a4a4;} +div#tag .tagList li.typeA a { color:#fe3614; font-weight:bold;} +div#tag .tagList li.typeB a { color:#fe3614;} +div#tag .tagList li.typeC a { font-weight:bold;} diff --git a/widgets/tag_list/skins/blog_tag_list/css/normal.css b/widgets/tag_list/skins/blog_tag_list/css/normal.css new file mode 100644 index 000000000..a211c2884 --- /dev/null +++ b/widgets/tag_list/skins/blog_tag_list/css/normal.css @@ -0,0 +1,9 @@ +div#tag { position:relative; border:1px solid #e0e1db; background:url(../images/normal/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +div#tag h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +div#tag .tagList { padding:1.2em; overflow:hidden;} +div#tag .tagList li { display:inline; color:#a4a4a4; margin-right:.1em; line-height:1.5em;} +div#tag .tagList li a { color:#a4a4a4;} +div#tag .tagList li.typeA a { color:#fe3614; font-weight:bold;} +div#tag .tagList li.typeB a { color:#fe3614;} +div#tag .tagList li.typeC a { font-weight:bold;} diff --git a/widgets/tag_list/skins/blog_tag_list/css/purple.css b/widgets/tag_list/skins/blog_tag_list/css/purple.css new file mode 100644 index 000000000..e69dae39f --- /dev/null +++ b/widgets/tag_list/skins/blog_tag_list/css/purple.css @@ -0,0 +1,9 @@ +div#tag { position:relative; border:1px solid #e0e1db; background:url(../images/purple/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +div#tag h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +div#tag .tagList { padding:1.2em; overflow:hidden;} +div#tag .tagList li { display:inline; color:#a4a4a4; margin-right:.1em; line-height:1.5em;} +div#tag .tagList li a { color:#a4a4a4;} +div#tag .tagList li.typeA a { color:#fe3614; font-weight:bold;} +div#tag .tagList li.typeB a { color:#fe3614;} +div#tag .tagList li.typeC a { font-weight:bold;} diff --git a/widgets/tag_list/skins/blog_tag_list/css/red.css b/widgets/tag_list/skins/blog_tag_list/css/red.css new file mode 100644 index 000000000..844e1d747 --- /dev/null +++ b/widgets/tag_list/skins/blog_tag_list/css/red.css @@ -0,0 +1,9 @@ +div#tag { position:relative; border:1px solid #e0e1db; background:url(../images/red/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } +div#tag h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +/*:first-child+html .boxTypeB h2 { height:20px;} */ +div#tag .tagList { padding:1.2em; overflow:hidden;} +div#tag .tagList li { display:inline; color:#a4a4a4; margin-right:.1em; line-height:1.5em;} +div#tag .tagList li a { color:#a4a4a4;} +div#tag .tagList li.typeA a { color:#fe3614; font-weight:bold;} +div#tag .tagList li.typeB a { color:#fe3614;} +div#tag .tagList li.typeC a { font-weight:bold;} diff --git a/widgets/tag_list/skins/blog_tag_list/images/cyan/bgBoxTypeB.gif b/widgets/tag_list/skins/blog_tag_list/images/cyan/bgBoxTypeB.gif new file mode 100644 index 000000000..99a877045 Binary files /dev/null and b/widgets/tag_list/skins/blog_tag_list/images/cyan/bgBoxTypeB.gif differ diff --git a/widgets/tag_list/skins/blog_tag_list/images/green/bgBoxTypeB.gif b/widgets/tag_list/skins/blog_tag_list/images/green/bgBoxTypeB.gif new file mode 100644 index 000000000..1cdca75c2 Binary files /dev/null and b/widgets/tag_list/skins/blog_tag_list/images/green/bgBoxTypeB.gif differ diff --git a/widgets/tag_list/skins/blog_tag_list/images/normal/bgBoxTypeB.gif b/widgets/tag_list/skins/blog_tag_list/images/normal/bgBoxTypeB.gif new file mode 100644 index 000000000..09f7dd59c Binary files /dev/null and b/widgets/tag_list/skins/blog_tag_list/images/normal/bgBoxTypeB.gif differ diff --git a/widgets/tag_list/skins/blog_tag_list/images/purple/bgBoxTypeB.gif b/widgets/tag_list/skins/blog_tag_list/images/purple/bgBoxTypeB.gif new file mode 100644 index 000000000..9e130ae44 Binary files /dev/null and b/widgets/tag_list/skins/blog_tag_list/images/purple/bgBoxTypeB.gif differ diff --git a/widgets/tag_list/skins/blog_tag_list/images/red/bgBoxTypeB.gif b/widgets/tag_list/skins/blog_tag_list/images/red/bgBoxTypeB.gif new file mode 100644 index 000000000..01406b48a Binary files /dev/null and b/widgets/tag_list/skins/blog_tag_list/images/red/bgBoxTypeB.gif differ diff --git a/widgets/tag_list/skins/blog_tag_list/skin.xml b/widgets/tag_list/skins/blog_tag_list/skin.xml new file mode 100644 index 000000000..a5893fc45 --- /dev/null +++ b/widgets/tag_list/skins/blog_tag_list/skin.xml @@ -0,0 +1,49 @@ + + + 꼬리표 목록 출력 + タグリスト表示 + 标签目录 + Display Tag List + + 제로 + Zero + zero + zero + 꼬리표 목록을 출력합니다. + タグリストを表示します。 + 显示标签目录。 + It displays tag list. + + + + 기본 컬러 + デフォルトカラー + 默认颜色 + Default color + + + 청록색 + 青緑 + 青绿色 + cyan + + + 초록색 + + 绿色 + green + + + 빨간색 + + 红色 + red + + + 보라색 + + 紫色 + purple + + + diff --git a/widgets/tag_list/skins/blog_tag_list/tags.html b/widgets/tag_list/skins/blog_tag_list/tags.html new file mode 100644 index 000000000..c60925e77 --- /dev/null +++ b/widgets/tag_list/skins/blog_tag_list/tags.html @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + +
    +
    + +

    {$widget_info->title}

    + +

    tags

    + +
    + + +
    diff --git a/widgets/tag_list/skins/cozy_simple/css/blue.css b/widgets/tag_list/skins/cozy_simple/css/blue.css new file mode 100644 index 000000000..272b2697f --- /dev/null +++ b/widgets/tag_list/skins/cozy_simple/css/blue.css @@ -0,0 +1 @@ +div.tagBox .header h2 { font-size:1em; color:#1187d8;} diff --git a/widgets/tag_list/skins/cozy_simple/css/bluish_green.css b/widgets/tag_list/skins/cozy_simple/css/bluish_green.css new file mode 100644 index 000000000..da4efd651 --- /dev/null +++ b/widgets/tag_list/skins/cozy_simple/css/bluish_green.css @@ -0,0 +1 @@ +div.tagBox .header h2 { font-size:1em; color:#9ab09f;} diff --git a/widgets/tag_list/skins/cozy_simple/css/common.css b/widgets/tag_list/skins/cozy_simple/css/common.css new file mode 100644 index 000000000..c416e9612 --- /dev/null +++ b/widgets/tag_list/skins/cozy_simple/css/common.css @@ -0,0 +1,11 @@ +div.tagBox { padding-bottom:1em;} +div.tagBox .header { padding:7px 0 0 12px; height:21px; _height:20px; background:#f5f5f5; } +*:first-child+html div.tagBox .header { height:20px; color:#ef2121;} + +div.tagBox ul { padding:.5em; overflow:hidden;} +div.tagBox ul li { display:inline; color:#a4a4a4; margin-right:.1em; line-height:1.5em;} +div.tagBox ul li a { color:#a4a4a4;} +div.tagBox ul li.typeA a { color:#717171; font-weight:bold;} +div.tagBox ul li.typeB a { color:#3d3d3d;} +div.tagBox ul li.typeC a { font-weight:bold;} +div.tagBox .tag_sort { width:100%; border-top:1px dashed #ababab; border-bottom:1px dashed #ababab; text-align:center; overflow:hidden;} diff --git a/widgets/tag_list/skins/cozy_simple/css/green.css b/widgets/tag_list/skins/cozy_simple/css/green.css new file mode 100644 index 000000000..17226a659 --- /dev/null +++ b/widgets/tag_list/skins/cozy_simple/css/green.css @@ -0,0 +1 @@ +div.tagBox .header h2 { font-size:1em; color:#8dc63f;} diff --git a/widgets/tag_list/skins/cozy_simple/css/pink.css b/widgets/tag_list/skins/cozy_simple/css/pink.css new file mode 100644 index 000000000..bc0312af4 --- /dev/null +++ b/widgets/tag_list/skins/cozy_simple/css/pink.css @@ -0,0 +1 @@ +div.tagBox .header h2 { font-size:1em; color:#f70795;} diff --git a/widgets/tag_list/skins/cozy_simple/css/red.css b/widgets/tag_list/skins/cozy_simple/css/red.css new file mode 100644 index 000000000..222ed6f31 --- /dev/null +++ b/widgets/tag_list/skins/cozy_simple/css/red.css @@ -0,0 +1 @@ +div.tagBox .header h2 { font-size:1em; color:#ef2121;} diff --git a/widgets/tag_list/skins/cozy_simple/skin.xml b/widgets/tag_list/skins/cozy_simple/skin.xml new file mode 100644 index 000000000..86e68d45b --- /dev/null +++ b/widgets/tag_list/skins/cozy_simple/skin.xml @@ -0,0 +1,65 @@ + + + cozy simple + Cozyシンプルスキン + cozy simple skin + Cozy样式皮肤 + + 제로 + Zero + zero + Zero + + cozy simple 위젯입니다. + 디자인 : 서기정 (http://blog.naver.com/addcozy) + HTML/CSS : 소지훈 + + + Cozyシンプルスキンです。 + デザイン:ソギジョン(http://blog.naver.com/addcozy) + HTML/CSS:ソジフン + + + This is cozy simple widget. + Design : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + Cozy样式皮肤。 + 设计 : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Ji-Hun So + + + + + 빨간색 + + Red + 红色 + + + 초록색 + + Green + 绿色 + + + 파란색 + + Blue + 蓝色 + + + 분홍색 + ピンク + Pink + 粉红色 + + + 청록색 + 青緑 + Cyan + 青绿色 + + + diff --git a/widgets/tag_list/skins/cozy_simple/tags.html b/widgets/tag_list/skins/cozy_simple/tags.html new file mode 100644 index 000000000..eb1b91b29 --- /dev/null +++ b/widgets/tag_list/skins/cozy_simple/tags.html @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + +
    +
    + +

    {$widget_info->title}

    + +

    tags

    + +
    + + +
    diff --git a/widgets/tag_list/tag_list.class.php b/widgets/tag_list/tag_list.class.php new file mode 100644 index 000000000..8712fc2a2 --- /dev/null +++ b/widgets/tag_list/tag_list.class.php @@ -0,0 +1,52 @@ +title; + $list_count = (int)$args->list_count; + if(!$list_count) $list_count = 20; + $mid_list = explode(",",$args->mid_list); + + // TagModel::getTagList()를 이용하기 위한 변수 정리 + $obj->mid = $mid_list; + $obj->list_count = $list_count; + + // tag 모듈의 model 객체를 받아서 getTagList() method를 실행 + $oTagModel = &getModel('tag'); + $output = $oTagModel->getTagList($obj); + + // 템플릿 파일에서 사용할 변수들을 세팅 + if(count($mid_list)==1) $widget_info->module_name = $mid_list[0]; + + $widget_info->title = $title; + $widget_info->tag_list = $output->data; + + Context::set('widget_info', $widget_info); + + // 템플릿의 스킨 경로를 지정 (skin, colorset에 따른 값을 설정) + $tpl_path = sprintf('%sskins/%s', $this->widget_path, $args->skin); + Context::set('colorset', $args->colorset); + + // 템플릿 파일을 지정 + $tpl_file = 'tags'; + + // 템플릿 컴파일 + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + } +?>