css 및 js 호출순서 조정기능 추가

git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5785 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
ngleader 2009-03-06 05:33:56 +00:00
parent 4f380d9c48
commit 61851f1dfe
2149 changed files with 109090 additions and 18689 deletions

View file

@ -13,11 +13,6 @@ RewriteRule ^(.+)/widgets/(.*) ./widgets/$2 [L]
RewriteRule ^(.+)/layouts/(.*) ./layouts/$2 [L]
RewriteRule ^(.+)/addons/(.*) ./addons/$2 [L]
# tools
RewriteRule ^tools/([a-zA-Z0-9_]+)$ ./tools/$1 [L]
RewriteRule ^tools/$ ./tools/index.php [L]
RewriteRule ^tools$ ./tools/index.php [L]
# page
RewriteRule ^([a-zA-Z0-9_]+)/([[:digit:]]+)page$ ./index.php?mid=$1&page=$2 [L]
@ -30,7 +25,7 @@ RewriteRule ^atom/([[:digit:]]+)$ ./index.php?module=rss&act=atom&page=$1 [L]
RewriteRule ^atom$ ./index.php?module=rss&act=atom [L]
# administrator page
RewriteRule ^admin$ ./index.php?module=admin [L]
RewriteRule ^admin/?$ ./index.php?module=admin [L]
# mid + act
RewriteRule ^([a-zA-Z0-9_]+)/api$ ./index.php?mid=$1&act=api [L]
@ -53,6 +48,9 @@ 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 + entry title
RewriteRule ^([a-zA-Z0-9_]+)/entry/(.+)$ ./index.php?mid=$1&entry=$2 [L]
# mid + category link
RewriteRule ^([a-zA-Z0-9_]+)/category/([[:digit:]]+)$ ./index.php?mid=$1&category=$2 [L]

View file

@ -0,0 +1,108 @@
<?php
if(!defined("__ZBXE__")) exit();
/**
* @file captcha.addon.php
* @author zero (zero@nzeo.com)
* @brief 특정 action을 실행할때 captcah를 띄우도록
**/
// before_module_proc 일 경우 && act_type != everytime 이면 세션 초기화
if($called_position == "before_module_proc" && $addon_info->act_type == 'everytime' && $_SESSION['captcha_authed']) {
unset($_SESSION['captcha_authed']);
// before_module_init 일때에 captcha 동작
} else if($called_position == 'before_module_init') {
$logged_info = Context::get('logged_info');
if($logged_info->is_admin == 'Y' || $logged_info->is_site_admin) return;
if($addon_info->target != 'all' && Context::get('is_logged')) return;
// 캡챠 인증이 되지 않은 세션이면 실행 시작
if(!$_SESSION['captcha_authed']) {
// 언어파일 로드
Context::loadLang(_XE_PATH_.'addons/captcha/lang');
// 캡챠 세션 세팅
if(Context::get('act')=='setCaptchaSession') {
$f = FileHandler::readDir('./addons/captcha/icon');
shuffle($f);
$key = rand(0,count($f)-1);
$keyword = str_replace('.gif','',$f[$key]);
$_SESSION['captcha_keyword'] = $keyword;
$target = Context::getLang('target_captcha');
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");
printf("<response>\r\n<error>0</error>\r\n<message>success</message>\r\n<about><![CDATA[%s]]></about>\r\n<keyword><![CDATA[%s]]></keyword>\r\n</response>",Context::getLang('about_captcha'),$target[$keyword]);
Context::close();
exit();
// 캡챠 이미지 출력
} else if(Context::get('act')=='captchaImage') {
$f = FileHandler::readDir('./addons/captcha/icon');
shuffle($f);
$keyword = $_SESSION['captcha_keyword'];
for($key=0,$c=count($f);$key<$c;$key++) {
if($keyword.".gif" == $f[$key]) break;
}
// 이미지 만들기
$thumb = imagecreatetruecolor(250,100);
for($i=0,$c=count($f);$i<$c;$i++) {
$x = ($i%5)*50;
$y = $i>4?0:50;
imagedestroy($dummy);
$dummy = imagecreatefromgif('./addons/captcha/icon/'.$f[$i]);
imagecopyresampled($thumb, $dummy, $x, $y, 0, 0, 50, 50, 50, 50);
if($i==$key) {
$_SESSION['captcha_x'] = $x;
$_SESSION['captcha_y'] = $y;
}
}
imagedestroy($dummy);
header("Cache-Control: ");
header("Pragma: ");
header("Content-Type: image/png");
imagepng($thumb, null,9);
imagedestroy($thumb);
Context::close();
exit();
// 캡챠 이미지 점검
} else if(Context::get('act')=='captchaCompare') {
$x = Context::get('mx');
$y = Context::get('my');
$sx = $_SESSION['captcha_x'];
$sy = $_SESSION['captcha_y'];
if($x>=$sx && $x<=$sx+50 && $y>=$sy && $y<=$sy+50) $_SESSION['captcha_authed'] = true;
else $_SESSION['captcha_authed'] = false;
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("<response>\r\n<error>0</error>\r\n<message>success</message>\r\n</response>");
Context::close();
exit();
}
Context::addJsFile('./addons/captcha/captcha.js',false);
// 게시판/ 이슈트래커의 글쓰기/댓글쓰기 액션 호출시 세션 비교
if(in_array(Context::get('act'), array('procBoardInsertDocument','procBoardInsertComment','procIssuetrackerInsertIssue','procIssuetrackerInsertHistory'))) {
$this->error = "msg_not_permitted";
}
}
}
?>

109
addons/captcha/captcha.js Normal file
View file

@ -0,0 +1,109 @@
/**
* procFilter 함수를 가로채서 captcha 이미지 폼을 출력
**/
var oldExecXml = null;
var calledArgs = null;
(function($){
$(function() {
var captchaXE = null;
function xeCaptcha() {
var body = $(document.body);
var captchaIma;
if (!captchaXE) {
captchaXE = $("<div>")
.attr("id","captcha_screen")
.css({
position:"absolute",
display:"none",
backgroundColor:"#111",
backgroundRepeat:"repeat",
backgroundPosition:"0 0",
zIndex:500
});
$('<div id="captchaBox" style="display:none;*zoom:1;overflow:hidden;height:200px;">'+
'<img src="" id="captcha_image" />'+
'<p style="color:#666;width:250px;padding:0;margin:10px 0 20px 0; " id="captchaAbout">&nbsp;</p>'+
'<p style="color:#DDD;width:250px;font-size:15px;padding:0; margin:0 0 10px; font-weight:bold; text-align:center;" id="captchaText">&nbsp;</p>'+
'</div>').appendTo(captchaXE);
body.append(captchaXE);
captchaXE.exec= function(act, args) {
if(act == 'procBoardInsertDocument' || act == 'procBoardInsertComment' || act == 'procIssuetrackerInsertIssue' || act == 'procIssuetrackerInsertHistory') {
oldExecXml('captcha','setCaptchaSession',new Array(),this.show,new Array('error','message','about','keyword'));
calledArgs = args;
} else {
oldExecXml(args.module, args.act,args.params,args.callback_func,args.response_tags,args.callback_func_arg,args.fo_obj);
}
};
captchaXE.show = function(ret_obj) {
var clientWidth = $(window).width();
var clientHeight = $(window).height();
$(document).scrollTop(0);
$(document).scrollLeft(0);
$("#captcha_screen").css({
display:"block",
width : clientWidth+"px",
height : clientHeight+"px",
left : 0,
top : 0
});
$("#captchaAbout").html(ret_obj['about']);
$("#captchaText").html(ret_obj['keyword']);
$("#captcha_image")
.css( {
width:"250px",
height:"100px",
margin:"0 0 10px 0",
cursor:"pointer"
})
.attr("src", request_uri.setQuery('act','captchaImage').setQuery('rnd',Math.round(Math.random() * 6)))
.click (captchaXE.compare)
.focus( function() { this.blur(); } );
$("#captchaBox")
.css({
display:"block",
border:"10px solid #222222",
padding:"10px",
position:"absolute",
backgroundColor:"#2B2523",
left : (clientWidth/2-125)+"px",
top : (clientHeight/2-100)+"px"
})
};
captchaXE.compare = function(e) {
var posX = parseInt($("#captchaBox").css("left").replace(/px$/,''),10);
var posY = parseInt($("#captchaBox").css("top").replace(/px$/,''),10);
var x = e.pageX - posX - 20;
var y = e.pageY - posY - 20;
var params = new Array();
params["mx"] = x;
params["my"] = y;
oldExecXml('captcha','captchaCompare',params, function() {
$("#captcha_screen").css({ display:"none" });
oldExecXml(calledArgs.module, calledArgs.act, calledArgs.params, calledArgs.callback_func, calledArgs.response_tags, calledArgs.callback_func_arg, calledArgs.fo_obj);
} );
};
}
return captchaXE;
}
$(window).ready(function(){
oldExecXml = exec_xml;
exec_xml = null;
var newFunc = function(module, act, params, callback_func, response_tags, callback_func_arg, fo_obj) {xeCaptcha().exec(act, {module:module, act:act,params:params,callback_func:callback_func,response_tags:response_tags,callback_func_arg:callback_func_arg,fo_obj:fo_obj})};
exec_xml = newFunc;
});
});
})(jQuery);

View file

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon version="0.2">
<title xml:lang="ko">Captcha 애드온</title>
<title xml:lang="jp">Captchaアドオン</title>
<description xml:lang="ko">
프로그램 글 등록기를 막기 위해 게시판/ issueTracker에서 글/ 댓글을 입력하려 할 때 이미지를 보여주고 글에 해당하는 이미지를 선택하게 하는 애드온입니다.
로그인하지 않은 경우에만 해당됩니다.
</description>
<description xml:lang="jp">
ボット(bot)がプログラムによるスパム行為を防ぐために、掲示板issueTrackerで書き込み・コメントを入力する際、ランダムな文字や数字の列を画面に表示し、表示されたものと同じ情報を入力して、データを登録させるアドオンです。
ログインしてない時だけ、動作します。
</description>
<version>0.1</version>
<date>2009-02-20</date>
<author email_address="zero@zeroboard.com" link="http://blog.nzeo.com">
<name xml:lang="ko">zero</name>
<name xml:lang="jp">zero</name>
</author>
<extra_vars>
<var name="target" type="select">
<title xml:lang="ko">Captcha 표시 대상</title>
<title xml:lang="jp">Captchaを表示する対象</title>
<description xml:lang="ko">글/댓글 등록시 captcha가 동작할 대상을 정할 수 있습니다. 관리자는 무조건 제외됩니다</description>
<description xml:lang="jp">管理者以外、書き込み・コメントを入力する際captchaを見せる対象を設定します。</description>
<options value="">
<title xml:lang="ko">로그인하지 않은 사용자</title>
<title xml:lang="jp">ログインしてないユーザー</title>
</options>
<options value="all">
<title xml:lang="ko">모든 사용자</title>
<title xml:lang="jp">すべてのユーザー</title>
</options>
</var>
<var name="act_type" type="select">
<title xml:lang="ko">동작 방식</title>
<title xml:lang="jp">動作方式</title>
<description xml:lang="ko">"1번만 동작"을 선택하시면 1번만 동작후 상태를 저장해서 다음부터 물어보지 않고 그렇지 않으면 매번 물어보게 됩니다</description>
<description xml:lang="jp">"1回だけ表示"を選択すると、1回だけ動作した後、その情報を保存して次回からはCaptchaを見せないようにし、もう一つのオプションは毎回Captchaを表示します。</description>
<options value="onetime">
<title xml:lang="ko">1번만 동작</title>
<title xml:lang="jp">1回だけ表示</title>
</options>
<options value="everytime">
<title xml:lang="ko">매번 동작</title>
<title xml:lang="jp">毎回表示</title>
</options>
</var>
</extra_vars>
</addon>

BIN
addons/captcha/icon/airplane.gif Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
addons/captcha/icon/apple.gif Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
addons/captcha/icon/book.gif Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
addons/captcha/icon/camera.gif Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
addons/captcha/icon/dog.gif Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
addons/captcha/icon/earth.gif Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
addons/captcha/icon/flag.gif Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
addons/captcha/icon/mobile.gif Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
addons/captcha/icon/note.gif Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
addons/captcha/icon/skeleton.gif Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1,21 @@
<?php
/**
* @file addons/captcha/lang/jp.lang.php
* @author zero (zero@nzeo.com) 翻訳:ミニミ
* @brief 日本語言語パッケージ
**/
$lang->about_captcha = "ボットbotのスパム登録を防ぐため、下の単語と一致するイメージを選択して下さい。";
$lang->target_captcha = array(
"airplane" => "飛行機",
"apple" => "りんご",
"book" => "",
"camera" => "カメラ",
"dog" => "",
"earth" => "地球",
"flag" => "",
"mobile" => "携帯",
"note" => "音符",
"skeleton" => "がいこつ",
);
?>

View file

@ -0,0 +1,21 @@
<?php
/**
* @file ko.lang.php
* @author zero (zero@nzeo.com)
* @brief 한국어 언어팩
**/
$lang->about_captcha = "프로그램 등록을 방지하기 위하여 아래 알려주는 이름과 일치하는 이미지를 선택해주세요";
$lang->target_captcha = array(
"airplane" => "비행기",
"apple" => "사과",
"book" => "",
"camera" => "카메라",
"dog" => "강아지",
"earth" => "지구",
"flag" => "깃발",
"mobile" => "핸드폰",
"note" => "음표",
"skeleton" => "해골",
);
?>

View file

@ -5,16 +5,10 @@
* @file counter.addon.php
* @author zero (zero@nzeo.com)
* @brief 카운터 애드온
*
* 카운터 애드온은 XE의 기본 카운터(counter)모듈을 이용하여 로그를 남깁니다.
* 검색 로봇이나 기타 툴의 접속을 방지하고 부하를 줄이기 위해서 페이지가 로드된 후에 javascript로 다시 로그를 남기도록 합니다.
* 따라서 카운터 애드온은 카운터를 수집하게 하는 javascript 파일을 추가하는 동작만 하며 기본 카운터 모듈의 호출은 해당 javascript
* 파일내에서 이루어집니다.
**/
// called_position가 before_module_init 이고 module이 admin이 아닐 경우
if($called_position == 'before_module_init' && !$GLOBALS['__counter_addon_called__'] && !in_array(Context::get('act'), array('procCounterExecute','procFileDelete'))) {
if($this->module != 'admin') Context::addJsFile('./modules/counter/tpl/js/counter.js');
$GLOBALS['__counter_addon_called__'] = true;
// called_position가 before_display_content 일 경우 실행
if(Context::isInstalled() && $called_position == 'before_module_init' && Context::get('module')!='admin') {
$oCounterController = &getController('counter');
$oCounterController->procCounterExecute();
}
?>

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon version="0.2">
<title xml:lang="ko">키워드 링크 애드온</title>
<title xml:lang="zh-CN">关键字链接</title>
<title xml:lang="zh-TW">關鍵字連結</title>
<title xml:lang="jp">キーワードリンクアドオン</title>
<description xml:lang="ko">
@ -8,10 +9,15 @@
키워드는 콤마(,)로 구분하여 여러개 등록할 수 있습니다.
먼저 등록된 키워드가 우선순위를 갖습니다.
</description>
<description xml:lang="zh-CN">
此插件将自动给主题正文及评论中的关键字添加相应的预设链接。
多个关键字可以用逗号(,)来区分输入。
多个关键字的优先级以输入顺序准。
</description>
<description xml:lang="zh-TW">
게시글과 댓글의 내용중 등록된 키워드에 링크를 걸어주는 애드온입니다.
將文章與評論中和關鍵字相對應的文字自動作連結。
可用逗號(,)區隔多個關鍵字。
以第一關鍵字為主。
關鍵字的優先順序以第一關鍵字為主。
</description>
<description xml:lang="jp">
本文とコメントの内容中、登録されたキーワードにリンクを貼りつける機能を行います。
@ -33,32 +39,41 @@
<extra_vars>
<var name="cssquery">
<title xml:lang="ko">cssquery</title>
<title xml:lang="zh-CN">cssquery</title>
<title xml:lang="zh-TW">cssquery</title>
<title xml:lang="jp">cssquery</title>
<description xml:lang="ko">치환할 부분의 jQuery cssquery입니다.
xe_board 게시판 스킨이면 공백으로 두면 됩니다.</description>
<description xml:lang="zh-TW">치환할 부분의 jQuery cssquery입니다.
xe_board 게시판 스킨이면 공백으로 두면 됩니다.</description>
<description xml:lang="zh-TW">jQuery cssquery的部份可以置換。
如果是使用xe_board討論板面板請留白。</description>
<description xml:lang="zh-CN">替换部分的jQuery cssquery。
如果正使用的是官方默认皮肤(xe_board此处留空即可。</description>
<description xml:lang="jp">置き換える部分のjQuery cssqueryです。
xe_board掲示板スキンの場合、空白にして下さい。</description>
</var>
<var name="reg_type" type="select">
<title xml:lang="ko">링크 방법</title>
<title xml:lang="zh-CN">链接方式</title>
<title xml:lang="zh-TW">連結方式</title>
<title xml:lang="jp">リンクの貼りつけ方</title>
<description xml:lang="ko"> 키워드가 여러개 있을때 "첫번째 키워드"에만 링크를 걸 것인지 "모든 키워드"에 걸 것인지 선택합니다.
</description>
<description xml:lang="zh-CN">有多个预设关键字时,在此可以指定链接方式。
</description>
<description xml:lang="zh-TW"> 키워드가 여러개 있을때 "첫번째 키워드"에만 링크를 걸 것인지 "모든 키워드"에 걸 것인지 선택합니다.
</description>
<description xml:lang="jp"> 複数のキーワードの場合、"最初のキーワード"のみ、もしくは "全てのキーワード"にリンクを貼りつけるかを選択します。
</description> <options value="">
</description>
<options value="">
<title xml:lang="ko">첫번째 키워드</title>
<title xml:lang="zh-CN">首个关键字</title>
<title xml:lang="zh-TW">第一關鍵字</title>
<title xml:lang="jp">最初のキーワード</title>
</options>
<options value="g">
<title xml:lang="ko">모든 키워드</title>
<title xml:lang="zh-CN">所有关键字</title>
<title xml:lang="zh-TW">所有關鍵字</title>
<title xml:lang="jp">全てのキーワード</title>
</options>
@ -66,51 +81,61 @@
<var name="keyword01">
<title xml:lang="ko">키워드</title>
<title xml:lang="zh-CN">关键字</title>
<title xml:lang="zh-TW">關鍵字</title>
<title xml:lang="jp">キーワード</title>
</var>
<var name="url01">
<title xml:lang="ko">링크</title>
<title xml:lang="zh-CN">链接</title>
<title xml:lang="zh-TW">連結</title>
<title xml:lang="jp">リンク</title>
</var>
<var name="keyword02">
<title xml:lang="ko">키워드</title>
<title xml:lang="zh-CN">关键字</title>
<title xml:lang="zh-TW">關鍵字</title>
<title xml:lang="jp">キーワード</title>
</var>
<var name="url02">
<title xml:lang="ko">링크</title>
<title xml:lang="zh-CN">链接</title>
<title xml:lang="zh-TW">連結</title>
<title xml:lang="jp">リンク</title>
</var>
<var name="keyword03">
<title xml:lang="ko">키워드</title>
<title xml:lang="zh-CN">关键字</title>
<title xml:lang="zh-TW">關鍵字</title>
<title xml:lang="jp">キーワード</title>
</var>
<var name="url03">
<title xml:lang="ko">링크</title>
<title xml:lang="zh-CN">链接</title>
<title xml:lang="zh-TW">連結</title>
<title xml:lang="jp">リンク</title>
</var>
<var name="keyword04">
<title xml:lang="ko">키워드</title>
<title xml:lang="zh-CN">关键字</title>
<title xml:lang="zh-TW">關鍵字</title>
<title xml:lang="jp">キーワード</title>
</var>
<var name="url04">
<title xml:lang="ko">링크</title>
<title xml:lang="zh-CN">链接</title>
<title xml:lang="zh-TW">連結</title>
<title xml:lang="jp">リンク</title>
</var>
<var name="keyword05">
<title xml:lang="ko">키워드</title>
<title xml:lang="zh-CN">关键字</title>
<title xml:lang="zh-TW">關鍵字</title>
<title xml:lang="jp">キーワード</title>
</var>
<var name="url05">
<title xml:lang="ko">링크</title>
<title xml:lang="zh-CN">链接</title>
<title xml:lang="zh-TW">連結</title>
<title xml:lang="jp">リンク</title>
</var>

View file

@ -1,11 +1,11 @@
<?php
/**
* @file addons/mobile/lang/zh-CN.lang.php
* @author zero (zero@nzeo.com)
* @brief 中文语言包
* @author zero (zero@nzeo.com) 翻译guny
* @brief 手机XE插件简体中文语言包
**/
$lang->cmd_go_upper = '上一级';
$lang->cmd_go_home = '首页';
$lang->cmd_view_sitemap = 'View site map';
$lang->cmd_view_sitemap = '网站地图';
?>

View file

@ -1,11 +1,11 @@
<?php
/**
* @file addons/mobile/lang/zh-TW.lang.php
* @author zero (zero@nzeo.com)
* @author zero (zero@nzeo.com) 翻譯royallin
* @brief 正體中文語言包 (只有基本內容)
**/
$lang->cmd_go_upper = '回上頁';
$lang->cmd_go_home = '回首頁';
$lang->cmd_view_sitemap = 'View site map';
$lang->cmd_view_sitemap = '網站地圖';
?>

View file

@ -1,11 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon version="0.2">
<title xml:lang="ko">플래닛 Bookmark 애드온</title>
<title xml:lang="en">Planet Bookmark Add-Ons</title>
<title xml:lang="es">Guardar planeta Add-Ons</title>
<title xml:lang="zh-CN">微博收藏插件</title>
<title xml:lang="zh-TW">微型部落格書籤</title>
<title xml:lang="jp">Planet Bookmark アドオン</title>
<description xml:lang="ko">
플래닛 Bookmark 애드온
</description>
<description xml:lang="en">
Planet Bookmark Add-Ons
</description>
<description xml:lang="es">
Guardar planeta Add-Ons
</description>
<description xml:lang="zh-CN">
XE微博收藏插件。
@ -21,6 +29,8 @@
<author email_address="zero@zeroboard.com" link="http://blog.nzeo.com">
<name xml:lang="ko">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="jp">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="zh-TW">zero</name>

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon version="0.2">
<title xml:lang="ko">위키 링크 애드온</title>
<title xml:lang="zh-CN">维基链接插件</title>
<title xml:lang="zh-TW">維基百科</title>
<title xml:lang="jp">wikiリンクアドオン</title>
<description xml:lang="ko">
위키 링크를 추가해주는 애드온.
</description>
<description xml:lang="zh-CN">
给维基模块添加链接的插件。
</description>
<description xml:lang="zh-TW">
維基百科控件。
</description>
<description xml:lang="jp">
wikiリンクを追加するアドオン
</description>
<version>0.1</version>
<date>2009-02-03</date>
<author email_address="haneul0318@gmail.com" link="http://blog.nzeo.com">
<name xml:lang="ko">haneul</name>
<name xml:lang="zh-CN">haneul</name>
<name xml:lang="zh-TW">haneul</name>
<name xml:lang="jp">haneul</name>
</author>
</addon>

View file

@ -0,0 +1,14 @@
<?php
if(!defined("__ZBXE__")) exit();
if($called_position == 'after_module_proc' && Context::getResponseMethod()!="XMLRPC" && Context::get('act')=='dispWikiEditPage' ) {
$module_info = Context::get('module_info');
if(!$module_info->module) return;
if($module_info->module != 'wiki') return;
Context::loadJavascriptPlugin('hotkeys');
Context::addJsFile('./addons/wiki_link/wikilink.js');
Context::addCssFile('./addons/wiki_link/wikilink.css');
$footer = "<div id='link'> <div class='linkForm'>Link Target: <input type='text' id='linktarget' class='inputTypeText w100' /><a href='#' onclick='setText(); return false;'>AddLink</a></div></div>";
Context::addHtmlFooter($footer);
}
?>

View file

@ -0,0 +1,4 @@
#link { display: none; }
#link .linkForm { margin-left: 10px; margin-top: 10px; }
.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 5px; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }

View file

@ -0,0 +1,45 @@
function openWikiLinkDialog()
{
var link = jQuery("#link");
link.css('display', 'block');
var target = xGetElementById('linktarget');
target.value = "";
try{
link.dialog({height:100});
}
catch(e)
{
link.dialog("open");
}
}
function setText() {
var target = xGetElementById('linktarget');
if(!target.value || target.value.trim() == '') return;
var text = target.value;
text.replace(/&/ig,'&amp;').replace(/</ig,'&lt;').replace(/>/ig,'&gt;');
var url = request_uri.setQuery('mid',current_mid).setQuery('entry',text);
var link = "<a href=\""+url+"\" ";
link += ">"+text+"</a>";
var iframe_obj = editorGetIFrame(1)
editorReplaceHTML(iframe_obj, link);
jQuery("#link").dialog("close");
}
function addShortCutForWiki()
{
var iframe_obj = editorGetIFrame(1);
if(jQuery.os.Mac)
{
jQuery(iframe_obj.contentWindow.document).bind('keydown', "ALT+SPACE", function(evt) { openWikiLinkDialog(); });
}
else
{
jQuery(iframe_obj.contentWindow.document).bind('keydown', "CTRL+SPACE", function(evt) { openWikiLinkDialog(); });
}
jQuery(document).bind('keydown',"CTRL+ALT+SPACE", function(evt) {} );
}
xAddEventListener(window, 'load', addShortCutForWiki);

View file

@ -26,6 +26,7 @@
var $css_files = array(); ///< @brief display시에 사용하게 되는 css files의 목록
var $html_header = NULL; ///< @brief display시에 사용하게 되는 <head>..</head>내의 스크립트코드
var $body_header = NULL; ///< @brief display시에 사용하게 되는 <body> 바로 다음에 출력될 스크립트 코드
var $html_footer = NULL; ///< @brief display시에 사용하게 되는 </body> 바로 앞에 추가될 코드
var $path = ''; ///< zbxe의 경로
@ -44,6 +45,8 @@
var $is_uploaded = false; ///< @brief 첨부파일이 업로드 된 요청이였는지에 대한 체크 플래그
var $widget_include_info_flag = false; // 위젯 정보 코드 출력
/**
* @brief 유일한 Context 객체를 반환 (Singleton)
* Context는 어디서든 객체 선언없이 사용하기 위해서 static 하게 사용
@ -64,6 +67,9 @@
$this->context->lang = &$GLOBALS['lang'];
$this->context->_COOKIE = $_COOKIE;
// 사용자의 쿠키 설정된 언어 타입 추출
if($_COOKIE['lang_type']) $this->lang_type = $_COOKIE['lang_type'];
// 기본적인 DB정보 세팅
$this->_loadDBInfo();
@ -83,19 +89,6 @@
);
session_start();
// 쿠키로 설정된 언어타입 가져오기
if($_COOKIE['lang_type']) $this->lang_type = $_COOKIE['lang_type'];
else $this->lang_type = $this->db_info->lang_type;
if(!in_array($this->lang_type, array_keys($lang_supported))) $this->lang_type = $this->db_info->lang_type;
if(!$this->lang_type) $this->lang_type = "en";
Context::set('lang_supported', $lang_supported);
$this->setLangType($this->lang_type);
// 기본 언어파일 로드
$this->lang = &$GLOBALS['lang'];
$this->_loadLang(_XE_PATH_."common/lang/");
// Request Method 설정
$this->_setRequestMethod();
@ -105,13 +98,31 @@
$this->_setRequestArgument();
$this->_setUploadedArgument();
// 인증 관련 정보를 Context와 세션에 설정
// 설치가 되어 있다면 가상 사이트 정보를 구함
if(Context::isInstalled()) {
// site_module_info를 구함
$oModuleModel = &getModel('module');
$site_module_info = $oModuleModel->getDefaultMid();
Context::set('site_module_info', $site_module_info);
}
// 사용자 설정 언어 타입이 없으면 기본 언어타입으로 지정
if(!$this->lang_type) {
// 가상 사이트라면 가상사이트의 언어타입으로 지정
if($site_module_info && $site_module_info->default_language) $this->db_info->lang_type = $site_module_info->default_language;
// 언어 타입 지정
$this->lang_type = $this->db_info->lang_type;
}
// 지정된 언어가 지원 언어에 속하지 않거나 없으면 영문으로 지정
if(!in_array($this->lang_type, array_keys($lang_supported))) $this->lang_type = $this->db_info->lang_type;
if(!$this->lang_type) $this->lang_type = "en";
Context::set('lang_supported', $lang_supported);
$this->setLangType($this->lang_type);
// 인증 관련 정보를 Context와 세션에 설정
if(Context::isInstalled()) {
// 인증관련 데이터를 Context에 설정
$oMemberModel = &getModel('member');
$oMemberController = &getController('member');
@ -129,6 +140,10 @@
$this->_set('logged_info', $oMemberModel->getLoggedInfo() );
}
// 기본 언어파일 로드
$this->lang = &$GLOBALS['lang'];
$this->_loadLang(_XE_PATH_."common/lang/");
// rewrite 모듈사용 상태 체크
if(file_exists(_XE_PATH_.'.htaccess')&&$this->db_info->use_rewrite == 'Y') $this->allow_rewrite = true;
else $this->allow_rewrite = false;
@ -265,6 +280,14 @@
return $this->db_info;
}
/**
* @brief 기본 URL을 return
**/
function getDefaultUrl() {
$db_info = Context::getDBInfo();
return $db_info->default_url;
}
/**
* @brief 지원되는 언어 파일 찾기
**/
@ -305,6 +328,46 @@
return $lang_selected;
}
/**
* @brief SSO URL이 설정되어 있고 아직 SSO URL검사를 하지 않았다면 return true
**/
function checkSSO() {
// GET 접속이 아니거나 설치가 안되어 있으면 패스
if(Context::getRequestMethod()!='GET' || !Context::isInstalled()) return true;
// DB info에 설정된 Default URL이 없다면 무조건 무사통과
$default_url = trim($this->db_info->default_url);
if(!$default_url) return true;
if(substr($default_url,-1)!='/') $default_url .= '/';
// SSO 검증을 요청 받는 사이트
if($default_url == Context::getRequestUri()) {
if(Context::get('default_url')) {
$url = base64_decode(Context::get('default_url'));
$url_info = parse_url($url);
$url_info['query'].= ($url_info['query']?'&':'').'SSOID='.session_id();
$redirect_url = sprintf('%s://%s%s%s?%s',$url_info['scheme'],$url_info['host'],$url_info['port']?':'.$url_info['port']:'',$url_info['path'], $url_info['query']);
header("location:".$redirect_url);
return false;
}
// SSO 검증을 요청하는 사이트
} else {
// SSO 결과를 받는 경우 session_name() 세팅
if(Context::get('SSOID')) {
setcookie(session_name(), Context::get('SSOID'), 0, '/');
header("location:".getUrl('SSOID',''));
return false;
// SSO 결과를 요청
} else if($_COOKIE['sso']!=md5(Context::getRequestUri()) && !Context::get('SSOID')) {
setcookie('sso',md5(Context::getRequestUri()),0,'/');
$url = sprintf("%s?default_url=%s", $default_url, base64_encode(Context::getRequestUrl()));
header("location:".$url);
return false;
}
}
return true;
}
/**
* @biref FTP 정보가 등록되었는지 확인
@ -347,8 +410,8 @@
* @brief 사이트 title adding
**/
function _addBrowserTitle($site_title) {
if($this->site_title) $this->site_title .= ' - '.htmlspecialchars($site_title);
else $this->site_title .= htmlspecialchars($site_title);
if($this->site_title) $this->site_title .= ' - '.$site_title;
else $this->site_title .= $site_title;
}
/**
@ -364,7 +427,7 @@
* @brief 사이트 title setting
**/
function _setBrowserTitle($site_title) {
$this->site_title = htmlspecialchars($site_title);
$this->site_title = $site_title;
}
/**
@ -558,7 +621,7 @@
* @brief GET/POST방식일 경우 처리
**/
function _setRequestArgument() {
if($this->_getRequestMethod() == 'XMLRPC') return;
if($this->_getRequestMethod() == 'XMLRPC' || $this->_getRequestMethod() == 'JSON') return;
if(!count($_REQUEST)) return;
foreach($_REQUEST as $key => $val) {
@ -671,6 +734,21 @@
return $this->request_method;
}
/**
* @brief 현재 요청된 full url을 return
**/
function getRequestUrl() {
static $url = null;
if(is_null($url)) {
$url = Context::getRequestUri();
if(count($_GET)) {
foreach($_GET as $key => $val) $vars[] = $key.'='.$val;
$url .= '?'.implode('&',$vars);
}
}
return $url;
}
/**
* @brief 요청받은 url에 args_list를 적용하여 return
**/
@ -683,14 +761,25 @@
* @brief 요청받은 url에 args_list를 적용하여 return
**/
function _getUrl($num_args=0, $args_list=array(), $domain = null) {
if($domain) {
static $site_module_info = null;
if(is_null($site_module_info)) {
$site_module_info = Context::get('site_module_info');
}
if(!$domain) {
if($site_module_info->domain) $domain = $site_module_info->domain;
else {
if($this->db_info->default_url) $domain = $this->db_info->default_url;
else if(!$domain) $domain = Context::getRequestUri();
}
}
$domain = preg_replace('/^(http|https):\/\//i','', trim($domain));
if(substr($domain,-1) != '/') $domain .= '/';
}
if(!$this->get_vars || $args_list[0]=='') {
$get_vars = null;
if($args_list[0]=='') {
if(is_array($args_list) && $args_list[0]=='') {
array_shift($args_list);
$num_args = count($args_list);
}
@ -711,6 +800,9 @@
/* member module중의 쪽지함/친구 관리 기능이 communication 모듈로 이전하여 하위 호환성을 위한 act값 변경 */
if($get_vars['act'] == 'dispMemberFriend') $get_vars['act'] = 'dispCommunicationFriend';
elseif($get_vars['act'] == 'dispMemberMessages') $get_vars['act'] = 'dispCommunicationMessages';
/* 기존의 action의 값이 바뀌어서 이를 강제 변경 */
elseif($get_vars['act'] == 'dispDocumentAdminManageDocument') $get_vars['act'] = 'dispDocumentManageDocument';
elseif($get_vars['act'] == 'dispModuleAdminSelectList') $get_vars['act'] = 'dispModuleSelectList';
if($get_vars['act'] && $this->isExistsSSLAction($get_vars['act'])) $path = $this->getRequestUri(ENFORCE_SSL, $domain);
else $path = $this->getRequestUri(RELEASE_SSL, $domain);
@ -760,6 +852,8 @@
break;
case 'act.document_srl.mid' :
return sprintf('%s%s/%s/%s',$path,$get_vars['mid'], $get_vars['act'],$get_vars['document_srl']);
case 'entry.mid' :
return sprintf('%s%s/entry/%s',$path,$get_vars['mid'],$get_vars['entry']);
}
}
@ -952,17 +1046,20 @@
/**
* @brief js file을 추가
**/
function addJsFile($file, $optimized = true, $targetie = '') {
function addJsFile($file, $optimized = true, $targetie = '',$index=null) {
$oContext = &Context::getInstance();
return $oContext->_addJsFile($file, $optimized, $targetie);
return $oContext->_addJsFile($file, $optimized, $targetie,$index);
}
/**
* @brief js file을 추가
**/
function _addJsFile($file, $optimized, $targetie) {
function _addJsFile($file, $optimized, $targetie,$index) {
if(in_array($file, $this->js_files)) return;
$this->js_files[] = array('file' => $file, 'optimized' => $optimized, 'targetie' => $targetie);
if(is_null($index)) $index=count($this->js_files);
for($i=$index;array_key_exists($i,$this->js_files);$i++);
$this->js_files[$i] = array('file' => $file, 'optimized' => $optimized, 'targetie' => $targetie);
}
/**
@ -985,10 +1082,20 @@
}
}
/**
* @brief javascript filter 추가
**/
function addJsFilter($path, $filename) {
$oXmlFilter = new XmlJSFilter($path, $filename);
$oXmlFilter->compile();
}
/**
* @brief array_unique와 동작은 동일하나 file 첨자에 대해서만 동작함
**/
function _getUniqueFileList($files) {
ksort($files);
$files = array_values($files);
$filenames = array();
$size = count($files);
for($i = 0; $i < $size; ++ $i)
@ -997,6 +1104,7 @@
unset($files[$i]);
$filenames[] = $files[$i]['file'];
}
return $files;
}
@ -1020,19 +1128,22 @@
/**
* @brief CSS file 추가
**/
function addCSSFile($file, $optimized = true, $media = 'all', $targetie = '') {
function addCSSFile($file, $optimized = true, $media = 'all', $targetie = '',$index = null) {
$oContext = &Context::getInstance();
return $oContext->_addCSSFile($file, $optimized, $media, $targetie);
return $oContext->_addCSSFile($file, $optimized, $media, $targetie,$index);
}
/**
* @brief CSS file 추가
**/
function _addCSSFile($file, $optimized, $media, $targetie) {
function _addCSSFile($file, $optimized, $media, $targetie, $index) {
if(in_array($file, $this->css_files)) return;
if(is_null($index)) $index=count($this->css_files);
for($i=$index;array_key_exists($i,$this->css_files);$i++);
//if(preg_match('/^http:\/\//i',$file)) $file = str_replace(realpath("."), ".", realpath($file));
$this->css_files[] = array('file' => $file, 'optimized' => $optimized, 'media' => $media, 'targetie' => $targetie);
$this->css_files[$i] = array('file' => $file, 'optimized' => $optimized, 'media' => $media, 'targetie' => $targetie);
}
/**
@ -1081,6 +1192,10 @@
}
function _loadJavascriptPlugin($plugin_name) {
static $loaded_plugins = array();
if($loaded_plugins[$plugin_name]) return;
$loaded_plugins[$plugin_name] = true;
$plugin_path = './common/js/plugins/'.$plugin_name.'/';
if(!is_dir($plugin_path)) return;
@ -1129,6 +1244,36 @@
return $this->html_header;
}
/**
* @brief BodyHeader 추가
**/
function addBodyHeader($header) {
$oContext = &Context::getInstance();
return $oContext->_addBodyHeader($header);
}
/**
* @brief BodyHeader 추가
**/
function _addBodyHeader($header) {
$this->body_header .= "\n".$header;
}
/**
* @brief BodyHeader return
**/
function getBodyHeader() {
$oContext = &Context::getInstance();
return $oContext->_getBodyHeader();
}
/**
* @brief BodyHeader return
**/
function _getBodyHeader() {
return $this->body_header;
}
/**
* @brief HtmlFooter 추가
**/
@ -1179,16 +1324,30 @@
* 단순히 db config 파일의 존재 유무로 설치 여부를 체크한다
**/
function isInstalled() {
return file_exists(Context::getConfigFile());
return file_exists(Context::getConfigFile()) && filesize(Context::getConfigFile());
}
/**
* @brief 내용의 위젯이나 기타 기능에 대한 code를 실제 code로 변경을 위한 flag set
**/
function setTransWidgetCodeIncludeInfo($flag=false){
$oContext = &Context::getInstance();
$oContext->widget_include_info_flag = $flag ? true : false;
}
/**
* @brief 내용의 위젯이나 기타 기능에 대한 code를 실제 code로 변경
**/
function transContent($content) {
// 사용자 정의 언어로 변경
$oModuleController = &getController('module');
$oModuleController->replaceDefinedLangCode($content);
// 위젯 코드 변경
$oWidgetController = &getController('widget');
$content = $oWidgetController->transWidgetCode($content, false);
$content = $oWidgetController->transWidgetCode($content,$this->widget_include_info_flag);
// 메타 파일 변경
$content = preg_replace_callback('!<\!\-\-Meta:([^\-]*?)\-\->!is', array($this,'transMeta'), $content);
@ -1197,6 +1356,8 @@
$content = preg_replace_callback('!<div([^\>]*)editor_component=([^\>]*)>(.*?)\<\/div\>!is', array($this,'transEditorComponent'), $content);
$content = preg_replace_callback('!<img([^\>]*)editor_component=([^\>]*?)\>!is', array($this,'transEditorComponent'), $content);
// style의 url 경로를 재정의 한다.
$content = preg_replace('/url\(http:\/\/([^ ]+)http:\/\//is','url(http://', $content);
// body 내의 <style ..></style>를 header로 이동
$content = preg_replace_callback('!<style(.*?)<\/style>!is', array($this,'moveStyleToHeader'), $content);

View file

@ -50,7 +50,7 @@
**/
function &getInstance($db_type = NULL) {
if(!$db_type) $db_type = Context::getDBType();
if(!$db_type) return new Object(-1, 'msg_db_not_setted');
if(!$db_type && Context::isInstalled()) 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)));
@ -269,14 +269,13 @@
if(!file_exists($cache_file)) return new Object(-1, 'msg_invalid_queryid');
if($source_args) $args = clone($source_args);
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;
$output->_tables = ($output->_tables && is_array($output->_tables)) ? $output->_tables : array();
// action값에 따라서 쿼리 생성으로 돌입
switch($output->action) {
case 'insert' :
@ -300,6 +299,7 @@
else if(!is_a($output, 'Object') && !is_subclass_of($output, 'Object')) $output = new Object();
$output->add('_query', $this->query);
$output->add('_elapsed_time', sprintf("%0.5f",$this->elapsed_time));
return $output;
}
@ -434,7 +434,7 @@
return $name.' in ('.$value.')';
break;
case 'notin' :
return $name.' notin ('.$value.')';
return $name.' not in ('.$value.')';
break;
case 'notequal' :
return $name.' <> '.$value;

View file

@ -3,9 +3,10 @@
* @class DBCubrid
* @author zero (zero@nzeo.com)
* @brief Cubrid DBMS를 이용하기 위한 class
* @version 0.1
* @version 0.1p1
*
* cubrid 7.0 에서 테스트 하였음.
* CUBRID2008 R1.3 대응하도록 수정 Prototype (prototype@cubrid.com) / 09.02.23
* 7.3 ~ 2008 R1.3 까지 테스트 완료함.
* 기본 쿼리만 사용하였기에 특화된 튜닝이 필요
**/
@ -222,6 +223,14 @@
$this->_query($query);
}
/**
* @brief 특정 테이블에 특정 column 제거
**/
function dropColumn($table_name, $column_name) {
$query = sprintf("alter class %s%s drop %s ", $this->prefix, $table_name, $column_name);
$this->_query($query);
}
/**
* @brief 특정 테이블의 column의 정보를 return
**/
@ -411,8 +420,14 @@
$pipe = $v['pipe'];
$value = $this->getConditionValue($name, $value, $operation, $type, $column_type);
if(!$value) $value = $v['value'];
$str = $this->getConditionPart($name, $value, $operation);
if(!$value) {
$value = $v['value'];
if(strpos($value, ".") == false) $valuetmp = $value;
else $valuetmp = '"'.str_replace('.', '"."', $value).'"';
} else $valuetmp = $value;
if(strpos($name, ".") == false) $nametmp = '"'.$name.'"';
else $nametmp = '"'.str_replace('.', '"."', $name).'"';
$str = $this->getConditionPart($nametmp, $valuetmp, $operation);
if($sub_condition) $sub_condition .= ' '.$pipe.' ';
$sub_condition .= $str;
}
@ -544,7 +559,7 @@
// 테이블 정리
$table_list = array();
foreach($output->tables as $key => $val) {
$table_list[] = '"'.$this->prefix.$val.'" as '.$key;
$table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"';
}
$left_join = array();
@ -554,7 +569,7 @@
foreach($left_tables as $key => $val) {
$condition = $this->_getCondition($output->left_conditions[$key],$output->column_type);
if($condition){
$left_join[] = $val . ' "'.$this->prefix.$output->tables[$key].'" as '.$key . ' on (' . $condition . ')';
$left_join[] = $val . ' "'.$this->prefix.$output->_tables[$key].'" as "'.$key . '" on (' . $condition . ')';
}
}
@ -698,7 +713,7 @@
require_once(_XE_PATH_.'classes/page/PageHandler.class.php');
// 전체 개수를 구함
$count_query = sprintf("select count(*) as count from %s %s %s", implode(',',$table_list),implode(' ',$left_join), $condition);
$count_query = sprintf("select count(*) as \"count\" from %s %s %s", implode(',',$table_list),implode(' ',$left_join), $condition);
$total_count = $this->getCountCache($output->tables, $condition);
if($total_count === false) {
$result = $this->_query($count_query);

View file

@ -209,7 +209,7 @@
return $string;
}
function autoValueQuotes($string, $output){
function autoValueQuotes($string, $tables){
$tok = strtok($string, ",");
while($tok !== false) {
$values[] = $tok;
@ -225,8 +225,9 @@
$tmpString2 = trim($tmpString2);
$isTable = false;
foreach($output->tables as $key => $val) {
foreach($tables as $key => $val) {
if($key == $tmpString1) $isTable = true;
if($val == $tmpString1) $isTable = true;
}
if($isTable) {
@ -323,6 +324,14 @@
foreach($tmp as $key => $val) {
$type = $output->column_type[$key];
if($type == null) {
foreach($output->columns as $cols) {
if($cols['alias'] == $key) {
$type = $output->column_type[$cols['name']];
}
}
}
if($type == "text" || $type == "bigtext") {
$blob_data = ibase_blob_info($tmp->{$key});
$blob_hndl = ibase_blob_open($tmp->{$key});
@ -382,6 +391,14 @@
@ibase_commit($this->fd);
}
/**
* @brief 특정 테이블에 특정 column 제거
**/
function dropColumn($table_name, $column_name) {
$query = sprintf("alter table %s%s drop %s ", $this->prefix, $table_name, $column_name);
$this->_query($query);
}
/**
* @brief 특정 테이블의 column의 정보를 return
@ -598,17 +615,17 @@
**/
function getCondition($output) {
if(!$output->conditions) return;
$condition = $this->_getCondition($output->conditions,$output->column_type);
$condition = $this->_getCondition($output->conditions,$output->column_type,$output->tables);
if($condition) $condition = ' where '.$condition;
return $condition;
}
function getLeftCondition($conditions,$column_type){
return $this->_getCondition($conditions,$column_type);
function getLeftCondition($conditions,$column_type,$tables){
return $this->_getCondition($conditions,$column_type,$tables);
}
function _getCondition($conditions,$column_type) {
function _getCondition($conditions,$column_type,$tables) {
$condition = '';
foreach($conditions as $val) {
$sub_condition = '';
@ -627,7 +644,7 @@
if(!$value) $value = $v['value'];
$name = $this->autoQuotes($name);
$value = $this->autoValueQuotes($value, $output);
$value = $this->autoValueQuotes($value, $tables);
$str = $this->getConditionPart($name, $value, $operation);
if($sub_condition) $sub_condition .= ' '.$pipe.' ';
@ -638,6 +655,7 @@
$condition .= '('.$sub_condition.')';
}
}
return $condition;
}
@ -710,9 +728,14 @@
}
if(strlen($value) != 0) {
if(($pos = strpos($value, '+1')) !== false) {
$pos = strpos($value, '+');
if($pos == 0) $pos = strpos($value, '-');
if($pos == 0) $pos = strpos($value, '*');
if($pos == 0) $pos = strpos($value, '/');
if($pos != 0) {
$substr = substr($value, 0, $pos);
$value = '"'.$substr.'"'."+1";
$value = '"'.$substr.'"'.substr($value, $pos, strlen($value));
$column_list[] = sprintf("\"%s\" = %s", $name, $value);
continue;
}
@ -769,7 +792,7 @@
$left_tables= (array)$output->left_tables;
foreach($left_tables as $key => $val) {
$condition = $this->_getCondition($output->left_conditions[$key],$output->column_type);
$condition = $this->getLeftCondition($output->left_conditions[$key],$output->column_type,$output->tables);
if($condition){
$left_join[] = $val . ' "'.$this->prefix.$output->_tables[$key].'" as '.$key . ' on (' . $condition . ')';
}
@ -850,7 +873,7 @@
require_once(_XE_PATH_.'classes/page/PageHandler.class.php');
// 전체 개수를 구함
$count_query = sprintf("select count(*) as count from %s %s %s", implode(',',$table_list),implode(' ',$left_join), $condition);
$count_query = sprintf("select count(*) as \"count\" from %s %s %s", implode(',',$table_list),implode(' ',$left_join), $condition);
$total_count = $this->getCountCache($output->tables, $condition);
if($total_count === false) {
$result = $this->_query($count_query);
@ -925,6 +948,14 @@
foreach($tmp as $key => $val){
$type = $output->column_type[$key];
if($type == null) {
foreach($output->columns as $cols) {
if($cols['alias'] == $key) {
$type = $output->column_type[$cols['name']];
}
}
}
if($type == "text" || $type == "bigtext") {
$blob_data = ibase_blob_info($tmp->{$key});
$blob_hndl = ibase_blob_open($tmp->{$key});

View file

@ -229,6 +229,13 @@
$this->_query($query);
}
/**
* @brief 특정 테이블에 특정 column 제거
**/
function dropColumn($table_name, $column_name) {
$query = sprintf("alter table %s%s drop %s ", $this->prefix, $table_name, $column_name);
$this->_query($query);
}
/**
* @brief 특정 테이블의 column의 정보를 return

View file

@ -239,6 +239,13 @@
$this->_query($query);
}
/**
* @brief 특정 테이블에 특정 column 제거
**/
function dropColumn($table_name, $column_name) {
$query = sprintf("alter table %s%s drop %s ", $this->prefix, $table_name, $column_name);
$this->_query($query);
}
/**
* @brief 특정 테이블의 column의 정보를 return

View file

@ -1,22 +1,27 @@
<?php
/**
/**
* @class DBPostgreSQL
* @author ioseph (ioseph@postgresql.kr)
* @author ioseph (ioseph@postgresql.kr) updated by yoonjong.joh@gmail.com
* @brief MySQL DBMS를 이용하기 위한 class
* @version 0.1
* @version 0.2
*
* postgresql handling class
* 2009.02.10 update delete query를 실행할때 table 이름에 alias 사용하는 것을 없앰. 지원 안함
* order by clause를 실행할때 함수를 실행 하는 부분을 column alias로 대체.
* 2009.02.11 dropColumn() function이 추가
* 2009.02.13 addColumn() 함수 변경
**/
class DBPostgresql extends DB {
class DBPostgresql extends DB
{
/**
* @brief PostgreSQL DB에 접속하기 위한 정보
**/
var $hostname = '127.0.0.1'; ///< hostname
var $userid = NULL; ///< user id
var $password = NULL; ///< password
var $database = NULL; ///< database
var $userid = null; ///< user id
var $password = null; ///< password
var $database = null; ///< database
var $prefix = 'xe'; ///< XE에서 사용할 테이블들의 prefix (한 DB에서 여러개의 XE설치 가능)
/**
@ -25,20 +30,15 @@
* column_type은 schema/query xml에서 공통 선언된 type을 이용하기 때문에
* DBMS에 맞게 replace 해주어야 한다
**/
var $column_type = array(
'bignumber' => 'bigint',
'number' => 'integer',
'varchar' => 'varchar',
'char' => 'char',
'text' => 'text',
'bigtext' => 'text',
'date' => 'varchar(14)',
);
var $column_type = array('bignumber' => 'bigint', 'number' => 'integer',
'varchar' => 'varchar', 'char' => 'char', 'text' => 'text', 'bigtext' => 'text',
'date' => 'varchar(14)', );
/**
* @brief constructor
**/
function DBPostgresql() {
function DBPostgresql()
{
$this->_setDBInfo();
$this->_connect();
}
@ -46,15 +46,18 @@
/**
* @brief 설치 가능 여부를 return
**/
function isSupported() {
if(!function_exists('pg_connect')) return false;
function isSupported()
{
if (!function_exists('pg_connect'))
return false;
return true;
}
/**
* @brief DB정보 설정 connect/ close
**/
function _setDBInfo() {
function _setDBInfo()
{
$db_info = Context::getDBInfo();
$this->hostname = $db_info->db_hostname;
$this->port = $db_info->db_port;
@ -62,18 +65,21 @@
$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 .= '_';
if (!substr($this->prefix, -1) != '_')
$this->prefix .= '_';
}
/**
* @brief DB 접속
**/
function _connect() {
function _connect()
{
// pg용 connection string
$conn_string = "";
// db 정보가 없으면 무시
if(!$this->hostname || !$this->userid || !$this->database) return;
if (!$this->hostname || !$this->userid || !$this->database)
return;
// connection string 만들기
$conn_string .= ($this->hostname) ? " host=$this->hostname" : "";
@ -84,7 +90,7 @@
// 접속시도
$this->fd = @pg_connect($conn_string);
if(!$this->fd || pg_connection_status($this->fd) != PGSQL_CONNECTION_OK) {
if (!$this->fd || pg_connection_status($this->fd) != PGSQL_CONNECTION_OK) {
$this->setError(-1, "CONNECTION FAILURE");
return;
}
@ -99,44 +105,55 @@
/**
* @brief DB접속 해제
**/
function close() {
if(!$this->isConnected()) return;
function close()
{
if (!$this->isConnected())
return;
@pg_close($this->fd);
}
/**
* @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절
**/
function addQuotes($string) {
if(version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string));
if(!is_numeric($string)) $string = @pg_escape_string($string);
function addQuotes($string)
{
if (version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc())
$string = stripslashes(str_replace("\\", "\\\\", $string));
if (!is_numeric($string))
$string = @pg_escape_string($string);
return $string;
}
/**
* @brief 트랜잭션 시작
**/
function begin() {
if(!$this->isConnected() || $this->transaction_started == false) return;
if($this->_query($this->fd, 'BEGIN'))
function begin()
{
if (!$this->isConnected() || $this->transaction_started == false)
return;
if ($this->_query($this->fd, 'BEGIN'))
$this->transaction_started = true;
}
/**
* @brief 롤백
**/
function rollback() {
if(!$this->isConnected() || $this->transaction_started == false) return;
if($this->_query($this->fd, 'ROLLBACK'))
function rollback()
{
if (!$this->isConnected() || $this->transaction_started == false)
return;
if ($this->_query($this->fd, 'ROLLBACK'))
$this->transaction_started = false;
}
/**
* @brief 커밋
**/
function commit() {
if(!$this->isConnected() || $this->transaction_started == false) return;
if($this->_query($this->fd, 'COMMIT'))
function commit()
{
if (!$this->isConnected() || $this->transaction_started == false)
return;
if ($this->_query($this->fd, 'COMMIT'))
$this->transaction_started = false;
}
@ -149,17 +166,49 @@
* row이면 object\n
* return\n
**/
function _query($query) {
if(!$this->isConnected()) return;
function _query($query)
{
if (!$this->isConnected())
return;
/*
$l_query_array = explode(" ", $query);
if ($l_query_array[0] = "update")
{
if (strtolower($l_query_array[2]) == "as")
{
$l_query_array[2] = "";
$l_query_array[3] = "";
$query = implode(" ",$l_query_array);
}
}
else if ($l_query_array[0] = "delete")
{
if (strtolower($l_query_array[3]) == "as")
{
$l_query_array[3] = "";
$l_query_array[4] = "";
$query = implode(" ",$l_query_array);
}
}
*/
// 쿼리 시작을 알림
$this->actStart($query);
$arr = array('Hello', 'World!', 'Beautiful', 'Day!');
// 쿼리 문 실행
$result = @pg_query($this->fd, $query);
// 오류 체크
if(!$result) $this->setError(1, pg_last_error($this->fd));
if (!$result) {
// var_dump($l_query_array);
//var_dump($query);
//die("\nin query statement\n");
//var_dump(debug_backtrace());
$this->setError(1, pg_last_error($this->fd));
}
// 쿼리 실행 종료를 알림
$this->actFinish();
@ -171,19 +220,23 @@
/**
* @brief 결과를 fetch
**/
function _fetch($result) {
if(!$this->isConnected() || $this->isError() || !$result) return;
while($tmp = pg_fetch_object($result)) {
function _fetch($result)
{
if (!$this->isConnected() || $this->isError() || !$result)
return;
while ($tmp = pg_fetch_object($result)) {
$output[] = $tmp;
}
if(count($output)==1) return $output[0];
if (count($output) == 1)
return $output[0];
return $output;
}
/**
* @brief 1 증가되는 sequence값을 return (postgresql의 auto_increment는 sequence테이블에서만 사용)
**/
function getNextSequence() {
function getNextSequence()
{
$query = sprintf("select nextval('%ssequence') as seq", $this->prefix);
$result = $this->_query($query);
$tmp = $this->_fetch($result);
@ -193,42 +246,69 @@
/**
* @brief 테이블 기생성 여부 return
**/
function isTableExists($target_name) {
if($target_name == "sequence") return true;
$query = sprintf("SELECT tablename FROM pg_tables WHERE tablename = '%s%s' AND schemaname = current_schema()", $this->prefix, $this->addQuotes($target_name));
function isTableExists($target_name)
{
if ($target_name == "sequence")
return true;
$query = sprintf("SELECT tablename FROM pg_tables WHERE tablename = '%s%s' AND schemaname = current_schema()",
$this->prefix, $this->addQuotes($target_name));
$result = $this->_query($query);
$tmp = $this->_fetch($result);
if(!$tmp) return false;
if (!$tmp)
return false;
return true;
}
/**
* @brief 특정 테이블에 특정 column 추가
**/
function addColumn($table_name, $column_name, $type='number', $size='', $default = '', $notnull=false) {
function addColumn($table_name, $column_name, $type = 'number', $size = '', $default =
NULL, $notnull = false)
{
$type = $this->column_type[$type];
if(strtoupper($type)=='INTEGER' || strtoupper($type)=='BIGINT') $size = '';
if (strtoupper($type) == 'INTEGER' || strtoupper($type) == 'BIGINT')
$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 ";
if ($size)
$query .= sprintf(" %s(%s) ", $type, $size);
else
$query .= sprintf(" %s ", $type);
$this->_query($query);
if (isset($default)) {
$query = sprintf("alter table %s%s alter %s set default '%s' ", $this->prefix, $table_name, $column_name, $default);
$this->_query($query);
}
if ($notnull) {
$query = sprintf("update %s%s set %s = %s ", $this->prefix, $table_name, $column_name, $default);
$this->_query($query);
$query = sprintf("alter table %s%s alter %s set not null ", $this->prefix, $table_name, $column_name);
$this->_query($query);
}
}
/**
* @brief 특정 테이블의 column의 정보를 return
**/
function isColumnExists($table_name, $column_name) {
$query = sprintf("select column_name from information_schema.columns where table_schema = current_schema() and table_name = '%s%s' and column_name = '%s'", $this->prefix, $this->addQuotes($table_name), strtolower($column_name));
function isColumnExists($table_name, $column_name)
{
$query = sprintf("SELECT attname FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = '%s%s') AND attname = '%s'",
$this->prefix, strtolower($table_name), strtolower($column_name));
// $query = sprintf("select column_name from information_schema.columns where table_schema = current_schema() and table_name = '%s%s' and column_name = '%s'", $this->prefix, $this->addQuotes($table_name), strtolower($column_name));
$result = $this->_query($query);
if($this->isError()) return;
if ($this->isError()) {
return;
}
$output = $this->_fetch($result);
if($output) return true;
if ($output) {
return true;
}
return false;
}
@ -237,26 +317,41 @@
* $target_columns = array(col1, col2)
* $is_unique? unique : none
**/
function addIndex($table_name, $index_name, $target_columns, $is_unique = false) {
if(!is_array($target_columns)) $target_columns = array($target_columns);
function addIndex($table_name, $index_name, $target_columns, $is_unique = false)
{
if (!is_array($target_columns))
$target_columns = array($target_columns);
if(strpos($table_name,$this->prefix)===false) $table_name = $this->prefix.$table_name;
if (strpos($table_name, $this->prefix) === false)
$table_name = $this->prefix . $table_name;
// index_name의 경우 앞에 table이름을 붙여줘서 중복을 피함
$index_name = $table_name.$index_name;
$index_name = $table_name . $index_name;
$query = sprintf("create %s index %s on %s (%s);", $is_unique?'unique':'', $index_name, $table_name, implode(',',$target_columns));
$query = sprintf("create %s index %s on %s (%s);", $is_unique ? 'unique' : '', $index_name,
$table_name, implode(',', $target_columns));
$this->_query($query);
}
/**
* @brief 특정 테이블에 특정 column 제거
**/
function dropColumn($table_name, $column_name)
{
$query = sprintf("alter table %s%s drop %s ", $this->prefix, $table_name, $column_name);
$this->_query($query);
}
/**
* @brief 특정 테이블의 특정 인덱스 삭제
**/
function dropIndex($table_name, $index_name, $is_unique = false) {
if(strpos($table_name,$this->prefix)===false) $table_name = $this->prefix.$table_name;
function dropIndex($table_name, $index_name, $is_unique = false)
{
if (strpos($table_name, $this->prefix) === false)
$table_name = $this->prefix . $table_name;
// index_name의 경우 앞에 table이름을 붙여줘서 중복을 피함
$index_name = $table_name.$index_name;
$index_name = $table_name . $index_name;
$query = sprintf("drop index %s", $index_name);
$this->_query($query);
@ -266,34 +361,45 @@
/**
* @brief 특정 테이블의 index 정보를 return
**/
function isIndexExists($table_name, $index_name) {
if(strpos($table_name,$this->prefix)===false) $table_name = $this->prefix.$table_name;
function isIndexExists($table_name, $index_name)
{
if (strpos($table_name, $this->prefix) === false)
$table_name = $this->prefix . $table_name;
// index_name의 경우 앞에 table이름을 붙여줘서 중복을 피함
$index_name = $table_name.$index_name;
$index_name = $table_name . $index_name;
//$query = sprintf("show indexes from %s%s where key_name = '%s' ", $this->prefix, $table_name, $index_name);
$query = sprintf("select indexname from pg_indexes where schemaname = current_schema() and tablename = '%s' and indexname = '%s'", $table_name, strtolower($index_name));
$query = sprintf("select indexname from pg_indexes where schemaname = current_schema() and tablename = '%s' and indexname = '%s'",
$table_name, strtolower($index_name));
$result = $this->_query($query);
if($this->isError()) return;
if ($this->isError())
return;
$output = $this->_fetch($result);
if($output) return true;
if ($output) {
return true;
}
// var_dump($query);
// die(" no index");
return false;
}
/**
* @brief xml 받아서 테이블을 생성
**/
function createTableByXml($xml_doc) {
function createTableByXml($xml_doc)
{
return $this->_createTable($xml_doc);
}
/**
* @brief xml 받아서 테이블을 생성
**/
function createTableByXmlFile($file_name) {
if(!file_exists($file_name)) return;
function createTableByXmlFile($file_name)
{
if (!file_exists($file_name))
return;
// xml 파일을 읽음
$buff = FileHandler::readFile($file_name);
return $this->_createTable($buff);
@ -306,7 +412,8 @@
* opt : notnull, default, size\n
* index : primary key, index, unique\n
**/
function _createTable($xml_doc) {
function _createTable($xml_doc)
{
// xml parsing
$oXml = new XmlParser();
$xml_obj = $oXml->parse($xml_doc);
@ -314,18 +421,21 @@
// 테이블 생성 schema 작성
$table_name = $xml_obj->table->attrs->name;
if($table_name == 'sequence') {
$query = sprintf('create sequence %s', $this->prefix.$table_name);
if ($table_name == 'sequence') {
$query = sprintf('create sequence %s', $this->prefix . $table_name);
return $this->_query($query);
}
if($this->isTableExists($table_name)) return;
$table_name = $this->prefix.$table_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;
if (!is_array($xml_obj->table->column))
$columns[] = $xml_obj->table->column;
else
$columns = $xml_obj->table->column;
foreach($columns as $column) {
foreach ($columns as $column) {
$name = $column->attrs->name;
$type = $column->attrs->type;
$size = $column->attrs->size;
@ -336,85 +446,101 @@
$default = $column->attrs->default;
$auto_increment = $column->attrs->auto_increment;
if($type == "bignumber" || $type == "number") $size = 0;
if ($type == "bignumber" || $type == "number")
$size = 0;
$column_schema[] = sprintf('%s %s%s %s %s',
$name,
$this->column_type[$type],
$size?'('.$size.')':'',
$default?"default '".$default."'":'',
$notnull?'not null':''
);
$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;
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($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)", implode($val,','));
if (count($unique_list)) {
foreach ($unique_list as $key => $val) {
$column_schema[] = sprintf("unique (%s)", implode($val, ','));
}
}
$schema = sprintf('create table %s (%s%s);', $this->addQuotes($table_name), "\n", implode($column_schema,",\n"));
$schema = sprintf('create table %s (%s%s);', $this->addQuotes($table_name), "\n",
implode($column_schema, ",\n"));
$output = $this->_query($schema);
if(count($index_list)) {
foreach($index_list as $key => $val) {
if(!$this->isIndexExists($table_name, $key)) $this->addIndex($table_name, $key, $val);
if (count($index_list)) {
foreach ($index_list as $key => $val) {
if (!$this->isIndexExists($table_name, $key))
$this->addIndex($table_name, $key, $val);
}
}
if(!$output) return false;
if (!$output)
return false;
}
/**
* @brief 조건문 작성하여 return
**/
function getCondition($output) {
if(!$output->conditions) return;
$condition = $this->_getCondition($output->conditions,$output->column_type);
if($condition) $condition = ' where '.$condition;
function getCondition($output)
{
if (!$output->conditions)
return;
$condition = $this->_getCondition($output->conditions, $output->column_type);
if ($condition)
$condition = ' where ' . $condition;
return $condition;
}
function getLeftCondition($conditions,$column_type){
return $this->_getCondition($conditions,$column_type);
function getLeftCondition($conditions, $column_type)
{
return $this->_getCondition($conditions, $column_type);
}
function _getCondition($conditions,$column_type) {
function _getCondition($conditions, $column_type)
{
$condition = '';
foreach($conditions as $val) {
foreach ($conditions as $val) {
$sub_condition = '';
foreach($val['condition'] as $v) {
if(!isset($v['value'])) continue;
if($v['value'] === '') continue;
if(!in_array(gettype($v['value']), array('string', 'integer'))) continue;
foreach ($val['condition'] as $v) {
if (!isset($v['value']))
continue;
if ($v['value'] === '')
continue;
if (!in_array(gettype($v['value']), array('string', 'integer')))
continue;
$name = $v['column'];
$operation = $v['operation'];
$value = $v['value'];
$type = $this->getColumnType($column_type,$name);
$type = $this->getColumnType($column_type, $name);
$pipe = $v['pipe'];
$value = $this->getConditionValue($name, $value, $operation, $type, $column_type);
if(!$value) $value = $v['value'];
if (!$value)
$value = $v['value'];
$str = $this->getConditionPart($name, $value, $operation);
if($sub_condition) $sub_condition .= ' '.$pipe.' ';
if ($sub_condition)
$sub_condition .= ' ' . $pipe . ' ';
$sub_condition .= $str;
}
if($sub_condition) {
if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' ';
$condition .= '('.$sub_condition.')';
if ($sub_condition) {
if ($condition && $val['pipe'])
$condition .= ' ' . $val['pipe'] . ' ';
$condition .= '(' . $sub_condition . ')';
}
}
return $condition;
@ -424,47 +550,57 @@
/**
* @brief insertAct 처리
**/
function _executeInsertAct($output) {
function _executeInsertAct($output)
{
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = $this->prefix.$val;
foreach ($output->tables as $key => $val) {
$table_list[] = $this->prefix . $val;
}
// 컬럼 정리
foreach($output->columns as $key => $val) {
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;
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));
$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) {
function _executeUpdateAct($output)
{
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = $this->prefix.$val.' as '.$key;
foreach ($output->tables as $key => $val) {
//$table_list[] = $this->prefix.$val.' as '.$key;
$table_list[] = $this->prefix . $val;
}
// 컬럼 정리
foreach($output->columns as $key => $val) {
if(!isset($val['value'])) continue;
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;
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;
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);
}
@ -473,7 +609,8 @@
// 조건절 정리
$condition = $this->getCondition($output);
$query = sprintf("update %s set %s %s", implode(',',$table_list), implode(',',$column_list), $condition);
$query = sprintf("update %s set %s %s", implode(',', $table_list), implode(',',
$column_list), $condition);
return $this->_query($query);
}
@ -481,16 +618,17 @@
/**
* @brief deleteAct 처리
**/
function _executeDeleteAct($output) {
function _executeDeleteAct($output)
{
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = $this->prefix.$val;
foreach ($output->tables as $key => $val) {
$table_list[] = $this->prefix . $val;
}
// 조건절 정리
$condition = $this->getCondition($output);
$query = sprintf("delete from %s %s", implode(',',$table_list), $condition);
$query = sprintf("delete from %s %s", implode(',', $table_list), $condition);
return $this->_query($query);
}
@ -501,75 +639,118 @@
* select의 경우 특정 페이지의 목록을 가져오는 것을 편하게 하기 위해\n
* navigation이라는 method를 제공
**/
function _executeSelectAct($output) {
function _executeSelectAct($output)
{
// 테이블 정리
$table_list = array();
foreach($output->tables as $key => $val) {
$table_list[] = $this->prefix.$val.' as '.$key;
foreach ($output->tables as $key => $val) {
$table_list[] = $this->prefix . $val . ' as ' . $key;
}
$left_join = array();
// why???
$left_tables= (array)$output->left_tables;
$left_tables = (array )$output->left_tables;
foreach($left_tables as $key => $val) {
$condition = $this->_getCondition($output->left_conditions[$key],$output->column_type);
if($condition){
$left_join[] = $val . ' '.$this->prefix.$output->_tables[$key].' as '.$key . ' on (' . $condition . ')';
foreach ($left_tables as $key => $val) {
$condition = $this->_getCondition($output->left_conditions[$key], $output->
column_type);
if ($condition) {
$left_join[] = $val . ' ' . $this->prefix . $output->_tables[$key] . ' as ' . $key .
' on (' . $condition . ')';
}
}
if(!$output->columns) {
if (!$output->columns) {
$columns = '*';
} else {
$column_list = array();
foreach($output->columns as $key => $val) {
foreach ($output->columns as $key => $val) {
$name = $val['name'];
$alias = $val['alias'];
if(substr($name,-1) == '*') {
if (substr($name, -1) == '*') {
$column_list[] = $name;
} elseif(strpos($name,'.')===false && strpos($name,'(')===false) {
if($alias) $column_list[] = sprintf('%s as %s', $name, $alias);
else $column_list[] = sprintf('%s',$name);
} 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);
if ($alias)
$column_list[] = sprintf('%s as %s', $name, $alias);
else
$column_list[] = sprintf('%s', $name);
}
}
$columns = implode(',',$column_list);
$columns = implode(',', $column_list);
}
$condition = $this->getCondition($output);
if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output);
if ($output->list_count && $output->page)
return $this->_getNavigationData($table_list, $columns, $left_join, $condition,
$output);
// list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가
if($output->order) {
if ($output->order) {
$conditions = $this->getConditionList($output);
if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
foreach($output->order as $key => $val) {
if (!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
foreach ($output->order as $key => $val) {
$col = $val[0];
if(!in_array($col, array('list_order','update_order'))) continue;
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
else $condition = sprintf(' where %s < 2100000000 ', $col);
if (!in_array($col, array('list_order', 'update_order')))
continue;
if ($condition)
$condition .= sprintf(' and %s < 2100000000 ', $col);
else
$condition = sprintf(' where %s < 2100000000 ', $col);
}
}
}
$query = sprintf("select %s from %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition);
$query = sprintf("select %s from %s %s %s", $columns, implode(',', $table_list),
implode(' ', $left_join), $condition);
if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups));
if (count($output->groups)) {
/*
var_dump("= column output start = ");
var_dump(sizeof ($output->columns) . " = end length == ");
var_dump($output->columns);
var_dump("= column output end = " . "\n");
var_dump($output->groups);
var_dump("=== " . "\n");
var_dump(debug_backtrace());
if($output->order) {
foreach($output->order as $key => $val) {
foreach($output->columns as $key => $val) {
$name = $val['name'];
$alias = $val['alias'];
} */
$group_list = array();
foreach ($output->groups as $gkey => $gval) {
foreach ($output->columns as $key => $val) {
$name = $val['name'];
$alias = $val['alias'];
if (trim($name) == trim($gval)) {
$group_list[] = $alias;
break;
}
}
}
$query .= sprintf(' group by %s', implode(',', $group_list));
// var_dump($query);
}
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);
if (count($index_list))
$query .= ' order by ' . implode(',', $index_list);
}
$result = $this->_query($query);
if($this->isError()) return;
if ($this->isError())
return;
$data = $this->_fetch($result);
$buff = new Object();
@ -582,13 +763,15 @@
*
* 그닥 좋지는 않은 구조이지만 편리하다.. -_-;
**/
function _getNavigationData($table_list, $columns, $left_join, $condition, $output) {
require_once(_XE_PATH_.'classes/page/PageHandler.class.php');
function _getNavigationData($table_list, $columns, $left_join, $condition, $output)
{
require_once (_XE_PATH_ . 'classes/page/PageHandler.class.php');
// 전체 개수를 구함
$count_query = sprintf("select count(*) as count from %s %s %s", implode(',',$table_list),implode(' ',$left_join), $condition);
$count_query = sprintf("select count(*) as count from %s %s %s", implode(',', $table_list),
implode(' ', $left_join), $condition);
$total_count = $this->getCountCache($output->tables, $condition);
if($total_count === false) {
if ($total_count === false) {
$result = $this->_query($count_query);
$count_output = $this->_fetch($result);
$total_count = (int)$count_output->count;
@ -596,48 +779,60 @@
}
$list_count = $output->list_count['value'];
if(!$list_count) $list_count = 20;
if (!$list_count)
$list_count = 20;
$page_count = $output->page_count['value'];
if(!$page_count) $page_count = 10;
if (!$page_count)
$page_count = 10;
$page = $output->page['value'];
if(!$page) $page = 1;
if (!$page)
$page = 1;
// 전체 페이지를 구함
if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1;
else $total_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;
if ($page > $total_page)
$page = $total_page;
$start_count = ($page - 1) * $list_count;
// list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가
if($output->order) {
if ($output->order) {
$conditions = $this->getConditionList($output);
if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
foreach($output->order as $key => $val) {
if (!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
foreach ($output->order as $key => $val) {
$col = $val[0];
if(!in_array($col, array('list_order','update_order'))) continue;
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
else $condition = sprintf(' where %s < 2100000000 ', $col);
if (!in_array($col, array('list_order', 'update_order')))
continue;
if ($condition)
$condition .= sprintf(' and %s < 2100000000 ', $col);
else
$condition = sprintf(' where %s < 2100000000 ', $col);
}
}
}
$query = sprintf("select %s from %s %s %s", $columns, implode(',',$table_list), implode(' ',$left_join), $condition);
$query = sprintf("select %s from %s %s %s", $columns, implode(',', $table_list),
implode(' ', $left_join), $condition);
if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups));
if (count($output->groups))
$query .= sprintf(' group by %s', implode(',', $output->groups));
if(count($output->order)) {
foreach($output->order as $key => $val) {
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);
if (count($index_list))
$query .= ' order by ' . implode(',', $index_list);
}
$query = sprintf('%s offset %d limit %d', $query, $start_count, $list_count);
$result = $this->_query($query);
if($this->isError()) {
if ($this->isError()) {
$buff = new Object();
$buff->total_count = 0;
$buff->total_page = 0;
@ -648,8 +843,8 @@
return $buff;
}
$virtual_no = $total_count - ($page-1)*$list_count;
while($tmp = pg_fetch_object($result)) {
$virtual_no = $total_count - ($page - 1) * $list_count;
while ($tmp = pg_fetch_object($result)) {
$data[$virtual_no--] = $tmp;
}
@ -662,5 +857,5 @@
$buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count);
return $buff;
}
}
}
?>

View file

@ -209,6 +209,13 @@
return $this->_query($query);
}
/**
* @brief 특정 테이블에 특정 column 제거
**/
function dropColumn($table_name, $column_name) {
$query = sprintf("alter table %s%s drop column %s ", $this->prefix, $table_name, $column_name);
$this->_query($query);
}
/**
* @brief 특정 테이블의 column의 정보를 return

View file

@ -232,6 +232,14 @@
return $this->_execute();
}
/**
* @brief 특정 테이블에 특정 column 제거
**/
function dropColumn($table_name, $column_name) {
$query = sprintf("alter table %s%s drop column %s ", $this->prefix, $table_name, $column_name);
$this->_query($query);
}
/**
* @brief 특정 테이블의 column의 정보를 return
**/

View file

@ -34,12 +34,17 @@
// 요청방식에 따라 출력을 별도로
if(Context::getResponseMethod()=="HTML") {
// 관리자 모드일 경우 #xeAdmin id를 가지는 div 추가
if(Context::get('module')!='admin' && strpos(Context::get('act'),'Admin')>0) $content = '<div id="xeAdmin">'.$content.'</div>';
// 내용을 content라는 변수로 설정 (layout에서 {$content}에서 대체됨)
Context::set('content', $content);
// 레이아웃을 컴파일
if(__DEBUG__==3) $start = getMicroTime();
$oTemplate = &TemplateHandler::getInstance();
// layout이라는 변수가 none으로 설정되면 기본 레이아웃으로 변경
if(Context::get('layout') != 'none') {
$layout_path = $oModule->getLayoutPath();
$layout_file = $oModule->getLayoutFile();
@ -47,8 +52,30 @@
}
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);
// 현재 요청된 레이아웃 정보를 구함
$oLayoutModel = &getModel('layout');
$current_module_info = Context::get('current_module_info');
$layout_srl = $current_module_info->layout_srl;
// 생성된 레이아웃과 연결되어 있으면 처리
if($layout_srl > 0){
$layout_info = Context::get('layout_info');
// faceoff 레이아웃일 경우 별도 처리
if($layout_info && $layout_info->type == 'faceoff') {
$oLayoutModel->doActivateFaceOff($layout_info);
}
// 관리자 레이아웃 수정화면에서 변경된 CSS가 있는지 조사
$edited_layout_css = $oLayoutModel->getUserLayoutCss($layout_srl);
if(file_exists($edited_layout_css)) Context::addCSSFile($edited_layout_css,true,'all','',100);
}
Context::set('layout_info', $layout_info);
$zbxe_final_content = $oTemplate->compile($layout_path, $layout_file, $edited_layout_file);
if(__DEBUG__==3) $GLOBALS['__layout_compile_elapsed__'] = getMicroTime()-$start;
@ -62,17 +89,23 @@
// 최종 결과를 common_layout에 넣어버림
Context::set('zbxe_final_content', $zbxe_final_content);
$output = $oTemplate->compile('./common/tpl', 'common_layout');
// 사용자 정의 언어 변경
$oModuleController = &getController('module');
$oModuleController->replaceDefinedLangCode($output);
} else {
$output = $content;
}
// 애드온 실행
$called_position = 'before_display_content';
@include("./files/cache/activated_addons.cache.php");
$oAddonController = &getController('addon');
$addon_file = $oAddonController->getCacheFilePath();
if(file_exists($addon_file)) @include($addon_file);
$this->content_size = strlen($output);
@ -234,8 +267,6 @@
// 파일 및 HTML 주석으로 출력
} else {
// debug string 작성 시작
$buff = "** Debug at ".date('Y-m-d H:i:s').str_repeat('*', 60)."\n";
// 전체 실행 시간 출력, Request/Response info 출력
if(__DEBUG__ & 2) {
@ -283,22 +314,25 @@
// HTML 주석으로 출력
if(__DEBUG_OUTPUT__ == 1 && Context::getResponseMethod() == 'HTML') {
$buff = sprintf("[%s %s:%d]\n%s\n", date('Y-m-d H:i:s'), $file_name, $line_num, print_r($buff, true));
if(__DEBUG_PROTECT__ == 1 && __DEBUG_PROTECT_IP__ != $_SERVER['REMOTE_ADDR']) {
$buff = 'The IP address is not allowed. Change the value of __DEBUG_PROTECT_IP__ into your IP address in config/config.user.inc.php or config/config.inc.php';
}
return "<!--\r\n".$buff."\r\n-->";
}
// 파일에 출력
if(__DEBUG_OUTPUT__ == 0) {
$debug_file = _XE_PATH_.'files/_debug_message.php';
$debug_output = sprintf("[%s %s:%d]\n%s\n", date('Y-m-d H:i:s'), $file_name, $line_num, print_r($debug_output, true));
$buff = sprintf("[%s %s:%d]\n%s\n", date('Y-m-d H:i:s'), $file_name, $line_num, print_r($buff, true));
if($display_option === true) $debug_output = str_repeat('=', 40)."\n".$debug_output.str_repeat('-', 40);
$debug_output = "\n<?php\n/*".$debug_output."*/\n?>\n";
$buff = str_repeat('=', 40)."\n".$buff.str_repeat('-', 40);
$buff = "\n<?php\n/*".$buff."*/\n?>\n";
if(@!$fp = fopen($debug_file, 'a')) return;
fwrite($fp, $debug_output);
fwrite($fp, $buff);
fclose($fp);
}
}

View file

@ -0,0 +1,314 @@
<?php
/**
* @class ExtraVar
* @author zero (zero@nzeo.com)
* @brief 게시글, 회원등에서 사용하는 확장변수를 핸들링하는 클래스
*
* php4대비 class static 변수가 안됨으로 $GLOBALS['XE_EXTRAVARS'] 이용해서 같은 효과
**/
class ExtraVar {
var $module_srl = null;
/**
* @brief constructor
**/
function &getInstance($module_srl) {
static $oInstance = array();
if(!$oInstance[$module_srl]) $oInstance[$module_srl] = new ExtraVar($module_srl);
return $oInstance[$module_srl];
}
/**
* @brief constructor
**/
function ExtraVar($module_srl) {
$this->module_srl = $module_srl;
}
/**
* @brief 불필요한 등록을 피하기 위해서 특정 module_srl에 확장변수가 등록되었는지 확인
**/
function isSettedExtraVars() {
return isset($GLOBALS['XE_EXTRAVARS'][$this->module_srl]);
}
/**
* @brief 확장변수 키를 등록
* php4를 대비해 class static 멤버변수 대신 $GLOBAL 변수 사용
* @param module_srl, idx, name, type, default, desc, is_required, search, value
**/
function setExtraVarKeys($extra_keys) {
if(!$this->isSettedExtraVars()) {
if(!$extra_keys || !count($extra_keys)) $GLOBALS['XE_EXTRAVARS'][$this->module_srl] = array();
else {
if(!is_array($GLOBALS['XE_EXTRAVARS'][$this->module_srl])) $GLOBALS['XE_EXTRAVARS'][$this->module_srl] = array();
foreach($extra_keys as $key => $val) {
$obj = null;
$obj = new ExtraItem($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value);
$GLOBALS['XE_EXTRAVARS'][$this->module_srl][$val->idx] = $obj;
}
}
}
}
/**
* @brief 확장변수 객체 배열 return
**/
function getExtraVars() {
if(!$this->isSettedExtraVars()) return array();
return $GLOBALS['XE_EXTRAVARS'][$this->module_srl];
}
}
/**
* @class ExtraItem
* @author zero (zero@nzeo.com)
* @brief 확장변수의 개별
**/
class ExtraItem {
var $module_srl = 0;
var $idx = 0;
var $name = 0;
var $type = 'text';
var $default = null;
var $desc = '';
var $is_required = 'N';
var $search = 'N';
var $value = null;
/**
* @brief constructor
**/
function ExtraItem($module_srl, $idx, $name, $type = 'text', $default = null, $desc = '', $is_required = 'N', $search = 'N', $value = null) {
if(!$idx) return;
$this->module_srl = $module_srl;
$this->idx = $idx;
$this->name = $name;
$this->type = $type;
$this->default = $default;
$this->desc = $desc;
$this->is_required = $is_required;
$this->search = $search;
$this->value = $value;
}
/**
* @brief 지정
**/
function setValue($value) {
$this->value = $value;
}
/**
* @brief type에 따라서 주어진 값을 변형하여 원형 값을 return
**/
function _getTypeValue($type, $value) {
$value = trim($value);
if(!isset($value)) return;
switch($type) {
case 'homepage' :
if(!preg_match('/^([a-z]+):\/\//i',$value)) $value = 'http://'.$value;
return htmlspecialchars($value);
break;
case 'tel' :
if(is_array($value)) $values = $value;
elseif(strpos($value,'|@|')!==false) $values = explode('|@|', $value);
elseif(strpos($value,',')!==false) $values = explode(',', $value);
$values[0] = $values[0];
$values[1] = $values[1];
$values[2] = $values[2];
return $values;
break;
break;
case 'checkbox' :
case 'radio' :
case 'select' :
if(is_array($value)) $values = $value;
elseif(strpos($value,'|@|')!==false) $values = explode('|@|', $value);
elseif(strpos($value,',')!==false) $values = explode(',', $value);
else $values = array($value);
for($i=0;$i<count($values);$i++) $values[$i] = htmlspecialchars($values[$i]);
return $values;
break;
case 'kr_zip' :
if(is_array($value)) $values = $value;
elseif(strpos($value,'|@|')!==false) $values = explode('|@|', $value);
elseif(strpos($value,',')!==false) $values = explode(',', $value);
return $values;
break;
//case 'date' :
//case 'email_address' :
//case 'text' :
//case 'textarea' :
default :
return htmlspecialchars($value);
break;
}
}
/**
* @brief 값을 return
* 원형 값을 HTML 결과물로 return
**/
function getValueHTML() {
$value = $this->_getTypeValue($this->type, $this->value);
switch($this->type) {
case 'homepage' :
return sprintf('<a href="%s" onclick="window.open(this.href); return false;">%s</a>', $value, $value);
case 'email_address' :
return sprintf('<a href="mailto:%s">%s</a>', $value, $value);
break;
case 'tel' :
return sprintf('%s - %s - %s', $value[0],$value[1],$value[2]);
break;
case 'textarea' :
return nl2br($value);
break;
case 'checkbox' :
if(is_array($value)) return implode(', ',$value);
else return $value;
break;
case 'date' :
return zdate($value,"Y-m-d");
break;
case 'select' :
case 'radio' :
if(is_array($value)) return implode(', ',$value);
else return $value;
break;
case 'kr_zip' :
if(is_array($value)) return implode(' ',$value);
else return $value;
break;
// case 'text' :
default :
return $value;
}
}
/**
* @brief type에 따른 form을 리턴
**/
function getFormHTML() {
$type = $this->type;
$name = $this->name;
$value = $this->_getTypeValue($this->type, $this->value);
$default = $this->_getTypeValue($this->type, $this->default);
$column_name = 'extra_vars'.$this->idx;
$buff = '';
switch($type) {
// 홈페이지 주소
case 'homepage' :
$buff .= '<input type="text" name="'.$column_name.'" value="'.$value.'" class="homepage" />';
break;
// Email 주소
case 'email_address' :
$buff .= '<input type="text" name="'.$column_name.'" value="'.$value.'" class="email_address" />';
break;
// 전화번호
case 'tel' :
$buff .=
'<input type="text" name="'.$column_name.'" value="'.$value[0].'" size="4" class="tel" />'.
'<input type="text" name="'.$column_name.'" value="'.$value[1].'" size="4" class="tel" />'.
'<input type="text" name="'.$column_name.'" value="'.$value[2].'" size="4" class="tel" />';
break;
// textarea
case 'textarea' :
$buff .= '<textarea name="'.$column_name.'" class="textarea">'.$value.'</textarea>';
break;
// 다중 선택
case 'checkbox' :
$buff .= '<ul>';
foreach($default as $v) {
if($value && in_array($v, $value)) $checked = ' checked="checked"';
else $checked = '';
$buff .='<li><input type="checkbox" name="'.$column_name.'" value="'.htmlspecialchars($v).'" '.$checked.' />'.$v.'</li>';
}
$buff .= '</ul>';
break;
// 단일 선택
case 'select' :
$buff .= '<select name="'.$column_name.'" class="select">';
foreach($default as $v) {
if($value && in_array($v,$value)) $selected = ' selected="selected"';
else $selected = '';
$buff .= '<option value="'.$v.'" '.$selected.'>'.$v.'</option>';
}
$buff .= '</select>';
break;
// radio
case 'radio' :
$buff .= '<ul>';
foreach($default as $v) {
if($value && in_array($v,$value)) $checked = ' checked="checked"';
else $checked = '';
$buff .= '<li><input type="radio" name="'.$column_name.'" '.$checked.' value="'.$v.'" class="radio" />'.$v.'</li>';
}
$buff .= '</ul>';
break;
// 날짜 입력
case 'date' :
// datepicker javascript plugin load
Context::loadJavascriptPlugin('ui.datepicker');
$buff .=
'<input type="hidden" name="'.$column_name.'" value="'.$value.'" />'.
'<input type="text" id="date_'.$column_name.'" value="'.zdate($value,'Y-m-d').'" readonly="readonly" class="date" />'."\n".
'<script type="text/javascript">'."\n".
'(function($){'."\n".
' $(function(){'."\n".
' var option = { gotoCurrent: false,yearRange:\'-100:+10\', onSelect:function(){'."\n".
' $(this).prev(\'input[type="hidden"]\').val(this.value.replace(/-/g,""))}'."\n".
' };'."\n".
' $.extend(option,$.datepicker.regional[\''.Context::getLangType().'\']);'."\n".
' $("#date_'.$column_name.'").datepicker(option);'."\n".
' });'."\n".
'})(jQuery);'."\n".
'</script>';
break;
// 주소 입력
case "kr_zip" :
// krzip address javascript plugin load
Context::loadJavascriptPlugin('ui.krzip');
$buff .=
'<div id="addr_searched_'.$column_name.'" style="display:'.($value[0]?'block':'none').';">'.
'<input type="text" readonly="readonly" name="'.$column_name.'" value="'.$value[0].'" class="address" />'.
'<a href="#" onclick="doShowKrZipSearch(this, \''.$column_name.'\'); return false;" class="button red"><span>'.Context::getLang('cmd_cancel').'</span></a>'.
'</div>'.
'<div id="addr_list_'.$column_name.'" style="display:none;">'.
'<select name="addr_list_'.$column_name.'"></select>'.
'<a href="#" onclick="doSelectKrZip(this, \''.$column_name.'\'); return false;" class="button blue"><span>'.Context::getLang('cmd_select').'</span></a>'.
'<a href="#" onclick="doHideKrZipList(this, \''.$column_name.'\'); return false;" class="button red"><span>'.Context::getLang('cmd_cancel').'</span></a>'.
'</div>'.
'<div id="addr_search_'.$column_name.'" style="display:'.($value[0]?'none':'block').'">'.
'<input type="text" name="addr_search_'.$column_name.'" class="address" value="" />'.
'<a href="#" onclick="doSearchKrZip(this, \''.$column_name.'\'); return false;" class="button green"><span>'.Context::getLang('cmd_search').'</span></a>'.
'</div>'.
'<input type="text" name="'.$column_name.'" value="'.htmlspecialchars($value[1]).'" class="address" />'.
'';
break;
// 일반 text
default :
$buff .=' <input type="text" name="'.$column_name.'" value="'.$value.'" class="text" />';
break;
}
if($this->desc) $buff .= '<p>'.$this->desc.'</p>';
return $buff;
}
}
?>

View file

@ -18,8 +18,6 @@
return $source;
}
/**
* @brief 특정 디렉토리를 복사
**/
@ -50,6 +48,14 @@
}
}
function copyFile($source, $target, $force='Y'){
$source = FileHandler::getRealPath($source);
$target_dir = FileHandler::getRealPath(dirname($target));
$target = basename($target);
if(!file_exists($target_dir)) FileHandler::makeDir($target_dir);
if($force=='Y') @unlink($target_dir.'/'.$target);
@copy($source, $target_dir.'/'.$target);
}
/**
* @brief 파일의 내용을 읽어서 return
@ -255,8 +261,8 @@
**/
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);
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));
}
@ -441,5 +447,44 @@
return true;
}
/**
* @brief ini 파일을 읽는다
**/
function readIniFile($filename){
$filename = FileHandler::getRealPath($filename);
if(!file_exists($filename)) return false;
$arr = parse_ini_file($filename, true);
if(is_array($arr) && count($arr)>0) return $arr;
else return array();
}
/**
* @brief array를 ini 파일로 저장한다.
**/
function writeIniFile($filename,$arr){
if(count($arr)==0) return false;
FileHandler::writeFile($filename,FileHandler::_makeIniBuff($arr));
return true;
}
function _makeIniBuff($arr){
$return = '';
foreach($arr as $key => $val){
// section
if(is_array($val)){
$return .= sprintf("[%s]\n",$key);
foreach($val as $k => $v){
$return .= sprintf("%s=\"%s\"\n",$k,$v);
}
// value
}else if(is_string($val) || is_int($val)){
$return .= sprintf("%s=\"%s\"\n",$key,$val);
}
}
return $return;
}
}
?>

View file

@ -56,6 +56,8 @@
if(!$module_srl) $this->module_srl = (int)Context::get('module_srl');
else $this->module_srl = (int)$module_srl;
$this->entry = Context::get('entry');
// 기본 변수들의 검사 (XSS방지를 위한 기초적 검사)
if($this->module && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->module)) die(Context::getLang("msg_invalid_request"));
if($this->mid && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->mid)) die(Context::getLang("msg_invalid_request"));
@ -63,7 +65,9 @@
// 애드온 실행 (모듈 실행 전)
$called_position = 'before_module_init';
@include(_XE_PATH_."files/cache/activated_addons.cache.php");
$oAddonController = &getController('addon');
$addon_file = $oAddonController->getCacheFilePath();
if(file_exists($addon_file)) @include($addon_file);
}
/**
@ -74,42 +78,63 @@
$oModuleModel = &getModel('module');
$site_module_info = Context::get('site_module_info');
$site_srl = $site_module_info->site_srl;
// document_srl만 있을 경우 document_srl로 모듈과 모듈 정보를 구함
if($this->document_srl && !$this->mid && !$this->module_srl) {
if(!$this->document_srl && $this->mid && $this->entry) {
$oDocumentModel = &getModel('document');
$this->document_srl = $oDocumentModel->getDocumentSrlByAlias($this->mid, $this->entry);
if($this->document_srl) Context::set('document_srl', $this->document_srl);
}
// 문서번호(document_srl)가 있을 경우 모듈 정보를 구해옴
if($this->document_srl) {
$module_info = $oModuleModel->getModuleInfoByDocumentSrl($this->document_srl);
// 문서가 존재하지 않으면 문서 정보를 제거
if(!$module_info) {
unset($this->document_srl);
// 문서가 존재할 경우 모듈 정보를 바탕으로 virtual site 및 mid 비교
} else {
// mid 값이 다르면 문서의 mid로 설정
if($this->mid != $module_info->mid) {
$this->mid = $module_info->mid;
Context::set('mid', $module_info->mid, true);
}
}
// 요청된 모듈과 문서 번호가 다르면 문서 번호에 의한 모듈 정보를 제거
if($this->module && $module_info->module != $this->module) unset($module_info);
}
// 아직 모듈을 못 찾았고 $mid값이 있으면 $mid로 모듈을 구함
// 모듈정보를 구하지 못했고 mid 요청이 있으면 mid에 해당하는 모듈 정보를 구함
if(!$module_info && $this->mid) {
$module_info = $oModuleModel->getModuleInfoByMid($this->mid, $site_srl);
$module_info = $oModuleModel->getModuleInfoByMid($this->mid, $site_module_info->site_srl);
if($this->module && $module_info->module != $this->module) unset($module_info);
}
// 모듈정보와 사이트 모듈정보가 다르면(다른 사이트이면) 페이지 리다이렉트
if($module_info && $site_module_info && $module_info->site_srl != $site_module_info->site_srl) {
$site_info = $oModuleModel->getSiteInfo($module_info->site_srl);
$redirect_url = getSiteUrl($site_info->domain, 'mid',Context::get('mid'),'document_srl',Context::get('document_srl'),'module_srl',Context::get('module_srl'));
header("location:".$redirect_url);
return false;
}
// 모듈을 여전히(;;) 못 찾고 $module_srl이 있으면 해당 모듈을 구함
if(!$module_info && $this->module_srl) {
$module_info = $oModuleModel->getModuleInfoByModuleSrl($this->module_srl);
if($this->module && $module_info->module != $this->module) unset($module_info);
}
// 모듈을 여전히(;;) 못 찾고 모듈번호(module_srl)가 있으면 해당 모듈을 구함
// module_srl로 대상 모듈을 찾는 것을 주석 처리함.
//if(!$module_info && $this->module_srl) {
//$module_info = $oModuleModel->getModuleInfoByModuleSrl($this->module_srl);
//if($this->module && $module_info->module != $this->module) unset($module_info);
//}
// 역시 모듈을 못 찾았고 $module이 없다면 기본 모듈을 찾아봄
if(!$module_info && !$this->module) $module_info = $site_module_info;
if($module_info && $site_module_info && $site_module_info->site_srl != $module_info->site_srl) {
unset($site_module_info);
$site_module_info = $oModuleModel->getSiteInfo($module_info->site_srl);
// 모듈정보와 사이트 모듈정보가 다르면(다른 사이트이면) 페이지 리다이렉트
if($module_info && $module_info->site_srl != $site_module_info->site_srl) {
// 현재 요청된 모듈이 가상 사이트 모듈일 경우
if($module_info->site_srl) {
$site_info = $oModuleModel->getSiteInfo($module_info->site_srl);
$redirect_url = getSiteUrl($site_info->domain, 'mid',Context::get('mid'),'document_srl',Context::get('document_srl'),'module_srl',Context::get('module_srl'),'entry',Context::get('entry'));
// 가상 사이트 모듈이 아닌데 가상 사이트에서 호출되었을 경우
} else {
$db_info = Context::getDBInfo();
if(!$db_info->default_url) return die("기본 URL이 정해지지 않아서 동작을 중지합니다");
else $redirect_url = getSiteUrl($db_info->default_url, 'mid',Context::get('mid'),'document_srl',Context::get('document_srl'),'module_srl',Context::get('module_srl'),'entry',Context::get('entry'));
}
header("location:".$redirect_url);
return false;
}
Context::set('site_module_info', $site_module_info);
// 모듈 정보가 찾아졌을 경우 모듈 정보에서 기본 변수들을 구함, 모듈 정보에서 module 이름을 구해움
if($module_info) {
@ -117,6 +142,8 @@
$this->mid = $module_info->mid;
$this->module_info = $module_info;
Context::setBrowserTitle($module_info->browser_title);
$part_config= $oModuleModel->getModulePartConfig('layout',$module_info->layout_srl);
Context::addHtmlHeader($part_config->header_script);
}
// 모듈정보에 module과 mid를 강제로 지정
@ -146,8 +173,14 @@
* @brief 모듈과 관련된 정보를 이용하여 객체를 구하고 act 실행까지 진행시킴
**/
function procModule() {
// 에러가 있으면 return
if($this->error) return;
// 에러가 있으면 메세지 객체를 만들어서 return
if($this->error) {
$oMessageView = &getView('message');
$oMessageView->setError(-1);
$oMessageView->setMessage($this->error);
$oMessageView->dispMessage();
return $oMessageView;
}
// ModuleModel 객체 생성
$oModuleModel = &getModel('module');
@ -169,9 +202,8 @@
return;
}
// type, grant 값 구함
// type, kind 값 구함
$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';
@ -209,8 +241,8 @@
$this->error = 'msg_dbconnect_failed';
}
// XMLRPC call 이 아니면 message view 객체 이용하도록
if(Context::getRequestMethod() != 'XMLRPC' && Context::getRequestMethod() != 'JSON') {
// HTML call 이면 message view 객체 이용하도록
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
// 에러가 발생하였을시 처리
if($this->error) {
// message 모듈 객체를 생성해서 컨텐츠 생성
@ -236,16 +268,18 @@
// 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) {
if($val->type == 'image') {
if(preg_match('/^\.\/files\/attach\/images\/(.+)/i',$val->value)) $val->value = Context::getRequestUri().substr($val->value,2);
}
$layout_info->{$var_id} = $val->value;
}
}
// 레이아웃 정보중 menu를 Context::set
if($layout_info->menu_count) {
foreach($layout_info->menu as $menu_id => $menu) {
@ -254,9 +288,6 @@
}
}
// 레이아웃 정보중 header_script가 있으면 헤더 추가
if($layout_info->header_script) Context::addHtmlHeader($layout_info->header_script);
// 레이아웃 정보를 Context::set
Context::set('layout_info', $layout_info);
@ -264,7 +295,9 @@
$oModule->setLayoutFile('layout');
// 레이아웃이 수정되었을 경우 수정본을 지정
$edited_layout = sprintf('./files/cache/layout/%d.html', $layout_info->layout_srl);
$edited_layout = $oLayoutModel->getUserLayoutHtml($layout_info->layout_srl);
// $edited_layout_css = $oLayoutModel->getUserLayoutCss($layout_info->layout_srl);
// Context::addCSSFile($edited_layout_css);
if(file_exists($edited_layout)) $oModule->setEditedLayoutFile($edited_layout);
}
}
@ -379,8 +412,6 @@
if(__DEBUG__==3) $GLOBALS['__elapsed_class_load__'] += getMicroTime() - $start_time;
// init method가 있으면 실행
// 객체 리턴
return $GLOBALS['_loaded_module'][$module][$type][$kind];
}
@ -393,20 +424,7 @@
if(!Context::isInstalled()) return new Object();
$oModuleModel = &getModel('module');
$cache_dir = sprintf("%sfiles/cache/triggers/",_XE_PATH_);
if(!is_dir($cache_dir)) FileHandler::makeDir($cache_dir);
$cache_file = sprintf("%s%s.%s", $cache_dir, $trigger_name, $called_position);
if(!@file_exists($cache_file)) {
$triggers = $oModuleModel->getTriggers($trigger_name, $called_position);
FileHandler::writeFile($cache_file, serialize($triggers));
} else {
$buff = FileHandler::readFile($cache_file);
$triggers = unserialize($buff);
}
if(!$triggers || !count($triggers)) return new Object();
foreach($triggers as $item) {
@ -420,6 +438,7 @@
$output = $oModule->{$called_method}($obj);
if(!$output->toBool()) return $output;
unset($oModule);
}
return new Object();

View file

@ -82,108 +82,38 @@
// 웹서비스에서 꼭 필요한 인증 정보와 권한 설정 체크
$is_logged = Context::get('is_logged');
$logged_info = Context::get('logged_info');
$user_id = $logged_info->user_id;
$user_group = $logged_info->group_list;
$grant->is_admin = false;
// module model 객체 생성
$oModuleModel = &getModel('module');
// 로그인되어 있다면 관리자 여부를 확인
if($is_logged) {
/* 로그인 사용자에 대한 관리자 여부는 다양한 방법으로 체크가 됨 */
// 1. 최고관리자일 경우
if($logged_info->is_admin == 'Y') {
$grant->is_admin = true;
// 사이트 관리자이면 로그인 정보의 is_admin 에 'Y'로 세팅
//if($oModuleModel->isSiteAdmin($logged_info)) $logged_info->is_admin = 'Y';
// 2. 사이트 관리자일 경우 사이트 관리 권한을 줌
} elseif($oModuleModel->isSiteAdmin()) {
$grant->is_admin = true;
// XE에서 access, manager (== is_admin) 는 고정된 권한명이며 이와 관련된 권한 설정
$grant = $oModuleModel->getGrant($module_info, $logged_info, $xml_info);
// 현재 모듈의 access 권한이 없으면 권한 없음 표시
//if(!$grant->access) return $this->stop("msg_not_permitted");
// 3. 최고 관리자는 아니지만 모듈 object가 있고 admin_id 컬럼에 로그인 사용자의 아이디가 있을 경우
} elseif($this->module_info->admin_id) {
if(is_array($this->module_info->admin_id) && in_array($user_id, $this->module_info->admin_id)) $grant->is_admin = true;
// 4. 1/2/3번이 아닐 경우 그룹을 체크하고 직접 모듈에 요청을 하여 체크를 함. (모듈.class.php에 정의)
} else {
$manager_group = $this->module_info->grants['manager'];
if(count($user_group) && count($manager_group)) {
foreach($user_group as $group_srl => $group_info) {
if(in_array($group_srl, $manager_group)) $grant->is_admin = true;
}
}
if(!$grant->is_admin && $module_info->module) {
$oClass = &getClass($module_info->module);
if($oClass && method_exists($oClass, 'isAdmin')) $grant->is_admin = $oClass->isAdmin();
}
}
}
// 권한 설정
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($logged_info->is_admin == 'Y') $grant->{$grant_name} = true;
break;
default :
$grant->{$grant_name} = true;
break;
}
}
}
}
// 현재 action값에 따른 최고 관리 권한 부여
if($this->act && $xml_info->permission) {
// 관리 권한이 없으면 permision, action 확인
if(!$grant->manager) {
// 현재 요청된 action의 퍼미션 type(guest, member, manager, root)를 구함
$permission_target = $xml_info->permission->{$this->act};
if($permission_target && $grant->{$permission_target}) {
foreach($grant as $key => $val) $grant->{$key} = true;
}
}
// act값에 admin이 들어 있는데 관리자가 아닌 경우 해당 모듈의 관리자 체크
if(substr_count($this->act, 'Admin')) {
if(!$is_logged) $this->setAct("dispMemberLoginForm");
else if($logged_info->is_admin != 'Y' && (!method_exists($this, 'checkAdminActionGrant') || !$this->checkAdminActionGrant())) {
// module.xml에 명시된 퍼미션이 없을때 ation명에 Admin이 있으면 manager로 체크
if(!$permission_target && substr_count($this->act, 'Admin')) $permission_target = 'manager';
// 권한 체크
switch($permission_target) {
case 'root' :
$this->stop('msg_not_permitted_act');
break;
case 'manager' :
if(!$grant->manager) $this->stop('msg_not_permitted_act');
break;
case 'member' :
if(!$is_logged) $this->stop('msg_not_permitted_act');
break;
}
}
@ -301,55 +231,90 @@
**/
function proc() {
// stop_proc==true이면 그냥 패스
if($this->stop_proc==true) return false;
if($this->stop_proc) return false;
// addon 실행(called_position 를 before_module_proc로 하여 호출)
$called_position = 'before_module_proc';
@include(_XE_PATH_."files/cache/activated_addons.cache.php");
$oAddonController = &getController('addon');
$addon_file = $oAddonController->getCacheFilePath();
if(file_exists($addon_file)) @include($addon_file);
// 지금까지 이상이 없었다면 action 실행
if(!$this->stop_proc) {
// 현재 모듈에 act값이 있으면 해당 act를 실행
// action 실행
if(method_exists($this, $this->act)) {
// 권한 체크
if(!$this->grant->access) return $this->stop("msg_not_permitted_act");
// 모듈의 스킨 정보를 연동 (스킨 정보의 테이블 분리로 동작대상 모듈에만 스킨 정보를 싱크시키도록 변경)
$oModuleModel = &getModel('module');
$oModuleModel->syncSkinInfoToModuleInfo($this->module_info);
Context::set('module_info', $this->module_info);
// 실행
$output = $this->{$this->act}();
// act가 없으면 action_forward에서 해당하는 act가 있는지 찾아서 대신 실행
// act이 없으면 action_forward에서 해당하는 act가 있는지 찾아서 대신 실행
} else if(Context::isInstalled()) {
$oModuleModel = &getModel('module');
$forward = $oModuleModel->getActionForward($this->act);
$forward = null;
// 현재 요청된 action의 대상 모듈을 찾음
// 1. action이름으로 검색 (DB검색 없이 하기 위함)
if(preg_match('/^([a-z]+)([A-Z])([a-z0-9\_]+)(.*)$/', $this->act, $matches)) {
$module = strtolower($matches[2].$matches[3]);
$xml_info = $oModuleModel->getModuleActionXml($module);
if($xml_info->action->{$this->act}) {
$forward->module = $module;
$forward->type = $xml_info->action->{$this->act}->type;
$forward->act = $this->act;
}
}
// 2. 1번에서 찾지 못하면 action forward를 검색
if(!$forward) $forward = $oModuleModel->getActionForward($this->act);
// 찾아진 forward 모듈이 있으면 실행
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();
if($oModule->stop_proc) return $this->stop($oModule->getMessage());
$oModule->setModuleInfo($this->module_info, $xml_info);
if(method_exists($oModule, $forward->act)) {
$output = $oModule->{$forward->act}();
} else {
return $this->stop("msg_module_is_not_exists");
}
// forward 모듈의 실행 결과 검사
if($oModule->stop_proc) return $this->stop($oModule->getMessage());
$this->setTemplatePath($oModule->getTemplatePath());
$this->setTemplateFile($oModule->getTemplateFile());
} else {
if($this->xml_info->default_index_act) {
if(method_exists($this, $this->xml_info->default_index_act)) {
// forward 모듈을 찾지 못했다면 원 모듈의 default index action을 실행
} else if($this->xml_info->default_index_act && 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(_XE_PATH_."files/cache/activated_addons.cache.php");
$oAddonController = &getController('addon');
$addon_file = $oAddonController->getCacheFilePath();
if(file_exists($addon_file)) @include($addon_file);
if(is_a($output, 'Object') || is_subclass_of($output, 'Object')) {
$this->setError($output->getError());
@ -357,7 +322,7 @@
return false;
}
// view action이고 결과 출력이 XMLRPC일 경우 해당 모듈의 api method를 실행
// view action이고 결과 출력이 XMLRPC 또는 JSON일 경우 해당 모듈의 api method를 실행
if($this->module_info->module_type == 'view'){
if(Context::getResponseMethod() == 'XMLRPC' || Context::getResponseMethod() == 'JSON') {
$oAPI = getAPI($this->module_info->module, 'api');
@ -365,11 +330,6 @@
$oAPI->{$this->act}($this);
}
}
}else if($this->module_info->module_type == 'controller'){
if(Context::getResponseMethod() == 'JSON'){
}
}
return true;

View file

@ -100,9 +100,6 @@
// include 변경 <!--#include($filename)-->
$buff = preg_replace_callback('!<\!--#include\(([^\)]*?)\)-->!is', array($this, '_compileIncludeToCode'), $buff);
// include 변경 <!--#include($filename)-->
//$buff = preg_replace_callback('!<\!--#include\(([^\)]*?)\)-->!is', array($this, '_compileIncludeToCode'), $buff);
// 이미지 태그 img의 src의 값이 http:// 나 / 로 시작하지 않으면 root경로부터 시작하도록 변경
$buff = preg_replace_callback('/<(img|input)([^>]*)src=[\'"]{1}(?!http)(.*?)[\'"]{1}/is', array($this, '_compileImgPath'), $buff);

View file

@ -24,7 +24,7 @@
$object_vars = get_object_vars($args);
if(count($object_vars)) {
foreach($object_vars as $key => $val) {
if(in_array($key, array('body','class','style','widget_sequence','widget','widget_padding_left','widget_padding_top','widget_padding_bottom','widget_padding_right'))) continue;
if(in_array($key, array('body','class','style','widget_sequence','widget','widget_padding_left','widget_padding_top','widget_padding_bottom','widget_padding_right','document_srl'))) continue;
$args->{$key} = utf8RawUrlDecode($val);
}
}
@ -68,7 +68,7 @@
// 캐시 파일을 갱신하여야 할 경우 lock파일을 만들고 캐시 생성
$oWidget = WidgetHandler::getObject($widget);
if(!$oWidget) return;
if(!$oWidget || !method_exists($oWidget,'proc')) return;
$widget_content = $oWidget->proc($args);
FileHandler::writeFile($cache_file, $widget_content);
@ -93,11 +93,12 @@
$object_vars = get_object_vars($args);
if(count($object_vars)) {
foreach($object_vars as $key => $val) {
if(in_array($key, array('body','class','style','widget_sequence','widget','widget_padding_left','widget_padding_top','widget_padding_bottom','widget_padding_right'))) continue;
if(in_array($key, array('body','class','style','widget_sequence','widget','widget_padding_left','widget_padding_top','widget_padding_bottom','widget_padding_right','widgetstyle','document_srl'))) continue;
$args->{$key} = utf8RawUrlDecode($val);
}
}
/**
* 위젯이 widgetContent/ widgetBox가 아니라면 내용을 구함
**/
@ -122,11 +123,19 @@
$inner_style = sprintf("padding:%dpx %dpx %dpx %dpx !important; padding:none !important;", $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left);
$oDocumentModel = &getModel('document');
/**
* 위젯 출력물을 구함
**/
$widget_content_header = '';
$widget_content_body = '';
$widget_content_footer = '';
// 일반 페이지 호출일 경우 지정된 스타일만 꾸면서 바로 return 함
if(!$include_info) {
if($args->id) $args->id = ' id="'.$args->id.'" ';
switch($widget) {
// 내용 직접 추가일 경우
case 'widgetContent' :
@ -136,17 +145,23 @@
} else {
$body = base64_decode($args->body);
}
$output = sprintf('<div style="overflow:hidden;%s"><div style="%s">%s</div></div>', $style, $inner_style, $body);
$widget_content_header = sprintf('<div %sstyle="overflow:hidden;%s"><div style="%s">', $args->id, $style, $inner_style);
$widget_content_body = $body;
$widget_content_footer = '</div></div>';
break;
// 위젯 박스일 경우
case 'widgetBox' :
$output = sprintf('<div style="overflow:hidden;%s;"><div style="%s"><div>', $style, $inner_style);
$widget_content_header = sprintf('<div %sstyle="overflow:hidden;%s;"><div style="%s"><div>', $args->id, $style, $inner_style);
break;
// 일반 위젯일 경우
default :
$output = sprintf('<div style="overflow:hidden;%s;"><div style="%s">%s</div></div>', $style, $inner_style, $widget_content);
$widget_content_header = sprintf('<div %sstyle="overflow:hidden;%s">',$args->id,$style);
$widget_content_body = sprintf('<div style="%s">%s</div>', $inner_style,$widget_content);
$widget_content_footer = '</div>';
break;
}
@ -161,37 +176,49 @@
} else {
$body = base64_decode($args->body);
}
// args 정리
$attribute = array();
if($args) {
foreach($args as $key => $val) {
if(in_array($key, array('class','style','widget_padding_top','widget_padding_right','widget_padding_bottom','widget_padding_left','widget','widgetstyle','document_srl'))) continue;
if(strpos($val,'|@|')>0) $val = str_replace('|@|',',',$val);
$attribute[] = sprintf('%s="%s"', $key, str_replace('"','\"',$val));
}
}
$oWidgetController = &getController('widget');
$output = sprintf(
'<div class="widgetOutput" style="%s" widget_padding_left="%s" widget_padding_right="%s" widget_padding_top="%s" widget_padding_bottom="%s" widget="widgetContent" document_srl="%d">'.
$widget_content_header = sprintf(
'<div class="widgetOutput" widgetstyle="%s" style="%s" widget_padding_left="%s" widget_padding_right="%s" widget_padding_top="%s" widget_padding_bottom="%s" widget="widgetContent" document_srl="%d" %s>'.
'<div class="widgetResize"></div>'.
'<div class="widgetResizeLeft"></div>'.
'<div class="widgetBorder">'.
'<div style="%s">'.
'%s'.
'</div><div class="clear"></div>'.
'</div>'.
'<div class="widgetContent" style="display:none;width:1px;height:1px;overflow:hidden;">%s</div>'.
'</div>',
'<div style="%s">',$args->widgetstyle,
$style,
$args->widget_padding_left, $args->widget_padding_right, $args->widget_padding_top, $args->widget_padding_bottom,
$args->document_srl,
$inner_style,
$body,
base64_encode($body)
);
implode(' ',$attribute),
$inner_style);
$widget_content_body = $body;
$widget_content_footer = sprintf('</div><div class="clear"></div>'.
'</div>'.
'<div class="widgetContent" style="display:none;width:1px;height:1px;overflow:hidden;">%s</div>'.
'</div>',base64_encode($body));
break;
// 위젯 박스일 경우
case 'widgetBox' :
$output = sprintf(
'<div class="widgetOutput" widget="widgetBox" style="%s;" widget_padding_top="%s" widget_padding_right="%s" widget_padding_bottom="%s" widget_padding_left="%s">'.
$widget_content_header = sprintf(
'<div class="widgetOutput" widgetstyle="%s" widget="widgetBox" style="%s;" widget_padding_top="%s" widget_padding_right="%s" widget_padding_bottom="%s" widget_padding_left="%s">'.
'<div class="widgetBoxResize"></div>'.
'<div class="widgetBoxResizeLeft"></div>'.
'<div class="widgetBoxBorder">'.
'<div class="nullWidget" style="%s">',
$style, $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left, $inner_style);
'<div class="widgetBoxBorder"><div class="nullWidget" style="%s">',$args->widgetstyle,$style, $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left,$inner_style);
break;
// 일반 위젯일 경우
@ -206,29 +233,31 @@
}
}
$output = sprintf(
'<div class="widgetOutput" style="%s" widget_padding_top="%s" widget_padding_right="%s" widget_padding_bottom="%s" widget_padding_left="%s" widget="%s" %s >'.
$widget_content_header = sprintf('<div class="widgetOutput" widgetstyle="%s" style="%s" widget_padding_top="%s" widget_padding_right="%s" widget_padding_bottom="%s" widget_padding_left="%s" widget="%s" %s >'.
'<div class="widgetResize"></div>'.
'<div class="widgetResizeLeft"></div>'.
'<div class="widgetBorder">'.
'<div style="%s">'.
'%s'.
'</div><div class="clear"></div>'.
'</div>'.
'</div>',
$style,
'<div class="widgetBorder">',$args->widgetstyle,$style,
$widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left,
$widget, implode(' ',$attribute),
$inner_style,
$widget_content
);
$widget, implode(' ',$attribute));
$widget_content_body = sprintf('<div style="%s">%s</div></div><div class="clear"></div>',$inner_style, $widget_content);
$widget_content_footer = '</div>';
break;
}
}
// 위젯 스타일을 컴파일 한다.
if($args->widgetstyle){
$widget_content_body = WidgetHandler::complieWidgetStyle($args->widgetstyle, $widget_content_body, $args);
}
$output = $widget_content_header . $widget_content_body . $widget_content_footer;
// 위젯 결과물 생성 시간을 debug 정보에 추가
if(__DEBUG__==3) $GLOBALS['__widget_excute_elapsed__'] += getMicroTime() - $start;
// 결과 return
return $output;
}
@ -263,5 +292,31 @@
return $GLOBALS['_xe_loaded_widgets_'][$widget];
}
function complieWidgetStyle($widgetStyle,$widget_content_body, $args){
if(!$widgetStyle) return $widget_content_body;
$oWidgetModel = &getModel('widget');
// 위젯 스타일의 extra_var를 가져와 묶는다
$widgetstyle_info = $oWidgetModel->getWidgetStyleInfo($widgetStyle);
if(!$widgetstyle_info) return $widget_content_body;
$widgetstyle_extar_var_key = get_object_vars($widgetstyle_info);
if(count($widgetstyle_extar_var_key['extra_var'])){
foreach($widgetstyle_extar_var_key['extra_var'] as $key => $val){
$widgetstyle_extar_var->{$key} = $args->{$key};
}
}
Context::set('widgetstyle_extar_var', $widgetstyle_extar_var);
Context::set('widget_content', $widget_content_body);
// 컴파일
$widgetstyle_path = $oWidgetModel->getWidgetStylePath($widgetStyle);
$oTemplate = &TemplateHandler::getInstance();
$tpl = $oTemplate->compile($widgetstyle_path, 'widgetstyle');
return $tpl;
}
}
?>

View file

@ -47,6 +47,7 @@
* @brief constructor
**/
function XmlJsFilter($path, $xml_file) {
if(substr($path,-1)!=='/') $path .= '/';
$this->xml_file = sprintf("%s%s",$path, $xml_file);
$this->js_file = $this->_getCompiledFileName($this->xml_file);
}

View file

@ -89,3 +89,24 @@ span.button.blue input { background-image:url(../tpl/images/buttonBlue.gif); col
/* Offset Debug */
a.button,
span.button{ margin-right:2px;}
/* Button Set */
.buttonSet{ width:16px; height:16px; background-image:url(../tpl/images/buttonSet.gif); background-repeat:no-repeat; border:0; background-color:transparent; vertical-align:middle; display:inline-block; text-decoration:none;}
.buttonSet span{ z-index:-1; font-size:0; line-height:0; visibility:hidden;}
.buttonSet.buttonUp{ background-position:0 0;}
.buttonSet.buttonDown{ background-position:0 -16px;}
.buttonSet.buttonLeft{ background-position:0 -32px;}
.buttonSet.buttonRight{ background-position:0 -48px;}
.buttonSet.buttonInfo{ background-position:0 -64px;}
.buttonSet.buttonCopy{ background-position:0 -80px;}
.buttonSet.buttonSetting{ background-position:0 -96px;}
.buttonSet.buttonActive{ background-position:0 -112px;}
.buttonSet.buttonDisable{ background-position:0 -128px;}
.buttonSet.buttonDelete{ background-position:0 -144px;}
.buttonSet.buttonHomepage{ background-position:0 -160px;}
.buttonSet.buttonBlog{ background-position:0 -176px;}
.buttonSet.buttonCalendar{ background-position:0 -192px;}
.buttonSet.buttonLayoutEditor{ background-position:0 -208px;}
.buttonSet.buttonAddWidget{ background-position:0 -224px;}
.buttonSet.buttonAddContent{ background-position:0 -240px;}

View file

@ -88,3 +88,6 @@ a.bold { font-weight:bold; }
#popup_menu_area li a:hover,
#popup_menu_area li a:active,
#popup_menu_area li a:focus{ font-weight:bold; letter-spacing:-1px;}
/* xe faceoff */
.faceOffManager { position:fixed; _position:absolute; right:3px; top:3px; height:23px; }

View file

@ -7,7 +7,20 @@
/* jQuery 참조변수($) 제거 */
if(jQuery) jQuery.noConflict();
;(function($) {
(function($) {
/* OS check */
var UA = navigator.userAgent.toLowerCase();
$.os = {
Linux: /linux/.test(UA),
Unix: /x11/.test(UA),
Mac: /mac/.test(UA),
Windows: /win/.test(UA)
};
$.os.name = ($.os.Windows) ? 'Windows' :
($.os.Linux) ? 'Linux' :
($.os.Unix) ? 'Unix' :
($.os.Mac) ? 'Mac' : '';
/**
* @brief XE 공용 유틸리티 함수
* @namespace XE
@ -109,49 +122,46 @@ if(jQuery) jQuery.noConflict();
/* 레이어 출력 */
if(html) {
var area = jQuery("#popup_menu_area").html('<ul>'+html+'</ul>');
var area = $('#popup_menu_area').html('<ul>'+html+'</ul>');
var areaOffset = {top:params['page_y'], left:params['page_x']};
if(area.outerHeight()+areaOffset.top > jQuery(window).height()+jQuery(window).scrollTop())
areaOffset.top = jQuery(window).height() - area.outerHeight() + jQuery(window).scrollTop();
if(area.outerWidth()+areaOffset.left > jQuery(window).width()+jQuery(window).scrollLeft())
areaOffset.left = jQuery(window).width() - area.outerWidth() + jQuery(window).scrollLeft();
if(area.outerHeight()+areaOffset.top > $(window).height()+$(window).scrollTop())
areaOffset.top = $(window).height() - area.outerHeight() + $(window).scrollTop();
if(area.outerWidth()+areaOffset.left > $(window).width()+$(window).scrollLeft())
areaOffset.left = $(window).width() - area.outerWidth() + $(window).scrollLeft();
if($.browser.safari) {
areaOffset.top -= 16;
areaOffset.left -= 16;
}
area.css({ visibility:"visible", top:areaOffset.top, left:areaOffset.left });
area.css({ top:areaOffset.top, left:areaOffset.left }).show();
}
}
}
}) (jQuery);
/* jQuery(document).ready() */
jQuery(function($) {
/* 팝업메뉴 레이어 생성 */
if(!$('#popup_menu_area').length) {
var menuObj = $('<div>')
.attr('id', 'popup_menu_area')
.css({visibility:'hidden', zIndex:9999});
.css({display:'none', zIndex:9999});
$(document.body).append(menuObj);
}
$(document).click(function(evt) {
var area = jQuery("#popup_menu_area");
var area = $('#popup_menu_area');
if(!area.length) return;
// 이전에 호출되었을지 모르는 팝업메뉴 숨김
area.css('visibility', 'hidden');
area.hide();
var targetObj = $(evt.target);
if(!targetObj.length) return;
// obj의 nodeName이 div나 span이 아니면 나올대까지 상위를 찾음
if(targetObj.length && jQuery.inArray(targetObj.attr('nodeName'), ['DIV', 'SPAN', 'A']) == -1) targetObj = targetObj.parent();
if(!targetObj.length || jQuery.inArray(targetObj.attr('nodeName'), ['DIV', 'SPAN', 'A']) == -1) return;
if(targetObj.length && $.inArray(targetObj.attr('nodeName'), ['DIV', 'SPAN', 'A']) == -1) targetObj = targetObj.parent();
if(!targetObj.length || $.inArray(targetObj.attr('nodeName'), ['DIV', 'SPAN', 'A']) == -1) return;
// 객체의 className값을 구함
var class_name = targetObj.attr('className');
@ -239,38 +249,6 @@ jQuery(function($) {
}
});
/*
* jQuery 1.2.6
* Opera 브라우저에서 $(window).height() / width() 값을 잘못 가져오는 문제 수정
* jQuery 1.3에서 수정되었음
* @link http://dev.jquery.com/changeset/5938
*/
if(jQuery.fn.jquery == '1.2.6') {
jQuery.each([ "Height", "Width" ], function(i, name){
var type = name.toLowerCase();
jQuery.fn[ type ] = function( size ) {
return this[0] == window ?
// Opera 브라우저에서 $(window).height() / width() 값을 잘못 가져오는 문제 수정
jQuery.browser.opera && document.body.parentNode[ "client" + name ] ||
jQuery.browser.safari && window[ "inner" + name ] ||
document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] :
this[0] == document ?
Math.max(
Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),
Math.max(document.body["offset" + name], document.documentElement["offset" + name])
) :
size == undefined ?
(this.length ? jQuery.css( this[0], type ) : null) :
this.css( type, size.constructor == String ? size : size + "px" );
};
});
}
/**
* @brief location.href에서 특정 key의 값을 return
@ -454,6 +432,10 @@ function move_url(url, open_wnidow) {
* @brief 멀티미디어 출력용 (IE에서 플래쉬/동영상 주변에 점선 생김 방지용)
**/
function displayMultimedia(src, width, height, options) {
var html = _displayMultimedia(src, width, height, options);
if(html) document.writeln(html);
}
function _displayMultimedia(src, width, height, options) {
if(src.indexOf('files') == 0) src = request_uri + src;
var defaults = {
@ -472,7 +454,9 @@ function displayMultimedia(src, width, height, options) {
var codebase = "";
var html = "";
if(/\.swf$/i.test(src)) {
if(/\.(gif|jpg|jpeg|bmp|png)$/i.test(src)){
html = '<img src="'+src+'" width="'+width+'" height="'+height+'" />';
} else if(/\.swf$/i.test(src)) {
clsid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
codebase = "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0";
html = '<object classid="'+clsid+'" codebase="'+codebase+'" width="'+width+'" height="'+height+'" flashvars="'+params.flashvars+'">';
@ -494,7 +478,7 @@ function displayMultimedia(src, width, height, options) {
}
html += '></embed>';
}
document.writeln(html);
return html;
}
/**
@ -516,37 +500,54 @@ function zbxe_folder_close(id) {
* 팝업의 내용에 맞게 크기를 늘리는 것은... 쉽게 되지는 않음.. .
* popup_layout 에서 window.onload 자동 요청됨.
**/
var _popupHeight = 0;
function setFixedPopupSize() {
var bodyObj = jQuery('#popBody');
if(bodyObj.length) {
if(bodyObj.height() > 500) {
bodyObj.css({ overflowY:'scroll', overflowX:'hidden', height:500 });
if(bodyObj.height() > 400) {
bodyObj.css({ overflowY:'scroll', overflowX:'hidden', height:400 });
}
}
var w = jQuery("#popup_content").width();
w = w< 400 ? 400 : w;
var h = jQuery("#popup_content").height();
jQuery('div').each(function() {
var ww = jQuery(this).width();
if(jQuery.inArray(this.id, ['waitingforserverresponse', 'fororiginalimagearea', 'fororiginalimageareabg']) == -1) {
if(ww > w) w = ww;
}
});
if(h != _popupHeight) {
_popupHeight = h;
jQuery('div').each(function() { var ww = jQuery(this).width(); if(jQuery.inArray(this.id, ['waitingforserverresponse', 'fororiginalimagearea', 'fororiginalimageareabg']) == -1) { if(ww > w) w = ww; } });
jQuery('table').each(function() { var ww = jQuery(this).width(); if(ww > w) w = ww; });
jQuery('form').each(function() { var ww = jQuery(this).width(); if(ww > w) w = ww; });
jQuery("#popup_content").width(w-4);
jQuery("#popHeader").width(w-4);
jQuery("#popFooter").width(w-4);
// 윈도우에서는 브라우저 상관없이 가로 픽셀이 조금 더 늘어나야 한다.
if(navigator.userAgent.toLowerCase().indexOf('windows') > 0) {
if(jQuery.browser.opera) w += 10;
else if(jQuery.browser.msie) w += 10;
else w += 6;
}
window.resizeTo(w, h);
// 윈도우 OS에서는 브라우저별로 미세 조절이 필요
var moreW = 0;
if(navigator.userAgent.toLowerCase().indexOf('windows') > 0) {
if(jQuery.browser.opera) moreW += 9;
else if(jQuery.browser.msie) moreW += 10;
else if(jQuery.browser.mozilla) moreW += 8;
else if(jQuery.browser.safari) {
moreW += 4;
h -= 12;
}
}
var h1 = jQuery(window).height();
window.resizeBy(0, h-h1);
if(!/chrome/.test(navigator.userAgent.toLowerCase())) {
window.resizeBy(moreW, h-h1+5);
} else {
window.resizeBy(10,60);
}
window.scrollTo(0,0);
}
setTimeout(setFixedPopupSize, 300);
}
/**
@ -584,7 +585,7 @@ function doChangeLangType(obj) {
function setLangType(lang_type) {
var expire = new Date();
expire.setTime(expire.getTime()+ (7000 * 24 * 3600000));
xSetCookie('lang_type', lang_type, expire);
xSetCookie('lang_type', lang_type, expire, '/');
}
/* 미리보기 */
@ -683,7 +684,7 @@ function callAddDocumentCart(document_length) {
if(addedDocument.length<1 || document_length != addedDocument.length) return;
var params = new Array();
params["srls"] = addedDocument.join(",");
exec_xml("document","procDocumentAdminAddCart", params, null);
exec_xml("document","procDocumentAddCart", params, null);
addedDocument = new Array();
}

43
common/js/jquery.js vendored

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,82 @@
;(function($) {
var defaults = {
};
var filebox = {
selected : null,
/**
* 파일 박스 팝업
*/
open : function(input_obj, filter) {
this.selected = input_obj;
var url = request_uri
.setQuery('module', 'module')
.setQuery('act', 'dispModuleFileBox')
.setQuery('input', this.selected.name)
.setQuery('filter', filter);
popopen(url, 'filebox');
},
/**
* 파일 선택
*/
selectFile : function(file_url, module_filebox_srl){
var target = $(opener.XE.filebox.selected);
var target_name = target.attr('name');
target.val(file_url);
var html = _displayMultimedia(file_url, '100%', '100%');
$('#filebox_preview_' + target_name, opener.document).html(html).show();
$('#filebox_cancel_' + target_name, opener.document).show();
window.close();
},
/**
* 파일 선택 취소
*/
cancel : function(name) {
$('[name=' + name + ']').val('');
$('#filebox_preview_' + name).hide().html('');
$('#filebox_cancel_' + name).hide();
},
/**
* 파일 삭제
*/
deleteFile : function(module_filebox_srl){
var params = {
'module_filebox_srl' : module_filebox_srl
};
$.exec_json('module.procModuleFileBoxDelete', params, function() { document.location.reload(); });
},
/**
* 초기화
*/
init : function(name) {
var file;
if(opener && opener.selectedWidget && opener.selectedWidget.getAttribute("widget")) {
file = opener.selectedWidget.getAttribute(name);
} else if($('[name=' + name + ']').val()) {
file = $('[name=' + name + ']').val();
}
if(file) {
var html = _displayMultimedia(file, '100%', '100%');
$('#filebox_preview_' + name).html(html).show();
$('#filebox_cancel_' + name).show();
}
}
};
// XE에 담기
$.extend(window.XE, {'filebox' : filebox});
}) (jQuery);

View file

@ -0,0 +1 @@
filebox.js

View file

@ -0,0 +1 @@
(function(B){B.fn.__bind__=B.fn.bind;B.fn.__unbind__=B.fn.unbind;B.fn.__find__=B.fn.find;var A={version:"0.7.8",override:/keydown|keypress|keyup/g,triggersMap:{},specialKeys:{27:"esc",9:"tab",32:"space",13:"return",8:"backspace",145:"scroll",20:"capslock",144:"numlock",19:"pause",45:"insert",36:"home",46:"del",35:"end",33:"pageup",34:"pagedown",37:"left",38:"up",39:"right",40:"down",112:"f1",113:"f2",114:"f3",115:"f4",116:"f5",117:"f6",118:"f7",119:"f8",120:"f9",121:"f10",122:"f11",123:"f12"},shiftNums:{"`":"~","1":"!","2":"@","3":"#","4":"$","5":"%","6":"^","7":"&","8":"*","9":"(","0":")","-":"_","=":"+",";":":","'":'"',",":"<",".":">","/":"?","\\":"|"},newTrigger:function(E,D,F){var C={};C[E]={};C[E][D]={cb:F,disableInInput:false};return C}};if(B.browser.mozilla){A.specialKeys=B.extend(A.specialKeys,{96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9"})}B.fn.find=function(C){this.query=C;return B.fn.__find__.apply(this,arguments)};B.fn.unbind=function(H,E,G){if(B.isFunction(E)){G=E;E=null}if(E&&typeof E==="string"){var F=((this.prevObject&&this.prevObject.query)||(this[0].id&&this[0].id)||this[0]).toString();var D=H.split(" ");for(var C=0;C<D.length;C++){delete A.triggersMap[F][D[C]][E]}}return this.__unbind__(H,G)};B.fn.bind=function(J,F,K){var H=J.match(A.override);if(B.isFunction(F)||!H){return this.__bind__(J,F,K)}else{var N=null,I=B.trim(J.replace(A.override,""));if(I){N=this.__bind__(I,F,K)}if(typeof F==="string"){F={combi:F}}if(F.combi){for(var M=0;M<H.length;M++){var D=H[M];var G=F.combi.toLowerCase(),E=A.newTrigger(D,G,K),L=((this.prevObject&&this.prevObject.query)||(this[0].id&&this[0].id)||this[0]).toString();E[D][G].disableInInput=F.disableInInput;if(!A.triggersMap[L]){A.triggersMap[L]=E}else{if(!A.triggersMap[L][D]){A.triggersMap[L][D]=E[D]}}var C=A.triggersMap[L][D][G];if(!C){A.triggersMap[L][D][G]=[E[D][G]]}else{if(C.constructor!==Array){A.triggersMap[L][D][G]=[C]}else{A.triggersMap[L][D][G][C.length]=E[D][G]}}this.each(function(){var O=B(this);if(O.attr("hkId")&&O.attr("hkId")!==L){L=O.attr("hkId")+";"+L}O.attr("hkId",L)});N=this.__bind__(H.join(" "),F,A.handler)}}return N}};A.findElement=function(C){if(!B(C).attr("hkId")){if(B.browser.opera||B.browser.safari){while(!B(C).attr("hkId")&&C.parentNode){C=C.parentNode}}}return C};A.handler=function(E){var O=A.findElement(E.currentTarget),I=B(O),D=I.attr("hkId");if(D){D=D.split(";");var G=E.which,Q=E.type,P=A.specialKeys[G],N=!P&&String.fromCharCode(G).toLowerCase(),H=E.shiftKey,C=E.ctrlKey,M=E.altKey||E.originalEvent.altKey,F=null;for(var R=0;R<D.length;R++){if(A.triggersMap[D[R]][Q]){F=A.triggersMap[D[R]][Q];break}}if(F){var J;if(!H&&!C&&!M){J=F[P]||(N&&F[N])}else{var L="";if(M){L+="alt+"}if(C){L+="ctrl+"}if(H){L+="shift+"}J=F[L+P];if(!J){if(N){J=F[L+N]||F[L+A.shiftNums[N]]||(L==="shift+"&&F[A.shiftNums[N]])}}}if(J){var S=false;for(var R=0;R<J.length;R++){if(J[R].disableInInput){var K=B(E.target);if(I.is("input")||I.is("textarea")||K.is("input")||K.is("textarea")){return true}}S=S||J[R].cb.apply(this,[E])}return S}}}};window.hotkeys=A;return B})(jQuery);

View file

@ -0,0 +1 @@
jquery.hotkeys-packed.js

View file

@ -0,0 +1,103 @@
<public:component>
<public:attach event="onpropertychange" onevent="iePNGFix(0)" />
<script type="text/javascript">
// IE5.5+ PNG Alpha Fix v1.0
// (c) 2004-2008 Angus Turnbull http://www.twinhelix.com
// This is licensed under the GNU LGPL, version 2.1 or later.
// For details, see: http://creativecommons.org/licenses/LGPL/2.1/
// This must be a path to a blank image, relative to the HTML document(s).
// In production use I suggest '/images/blank.gif' or similar. That's all!
if (typeof blankImg == 'undefined') var blankImg = 'blank.gif';
function filt(s, b)
{
var f = 'DXImageTransform.Microsoft.AlphaImageLoader';
var sM = (currentStyle.backgroundRepeat == 'no-repeat') ? 'crop' : 'scale';
s = (s || '').replace(/\(/g, '%28').replace(/\)/g, '%29');
if (s && !(/IMG|INPUT/.test(nodeName) && !b) &&
currentStyle.width == 'auto' && currentStyle.height == 'auto')
{
style.width = offsetWidth + 'px';
style.height = clientHeight + 'px';
if (currentStyle.display == 'inline') style.display = 'inline-block';
}
if (filters[f])
{
filters[f].enabled = s ? true : false;
if (s) with (filters[f]) { src = s }
}
else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="' + sM + '")';
}
function iePNGFix(init)
{
if (!/MSIE (5\.5|6)/.test(navigator.userAgent) || typeof filters == 'unknown') return;
var evt = init ? { propertyName: 'src,background' } : event;
var isSrc = /src/.test(evt.propertyName);
var isBg = /background/.test(evt.propertyName);
var isClass = !init &&
((this.className != this._png_class) && (this.className || this._png_class));
if (!(isSrc || isBg || isClass)) return;
this._png_class = this.className;
var blank = blankImg.match(/([^\/]+)$/)[1];
// Required for Whatever:hover support - erase any set BG if className changes.
if (isClass && ((style.backgroundImage.indexOf('url(') == -1) ||
(style.backgroundImage.indexOf(blank) > -1)))
{
setTimeout(function() { this.style.backgroundImage = '' }, 0);
return;
}
if (isSrc && this.src && /IMG|INPUT/.test(nodeName))
{
if ((/\.png/i).test(src))
{
filt(src, 1);
src = blankImg;
}
else if (src.indexOf(blank) == -1) filt();
}
var bgSrc = currentStyle.backgroundImage || style.backgroundImage;
if ((bgSrc + this.src).indexOf(blank) == -1)
{
var bgPNG = bgSrc.match(/^url[("']+(.*\.png[^\)"']*)[\)"']+[^\)]*$/i);
if (bgPNG)
{
style.backgroundImage = 'url("' + blankImg + '")';
filt(bgPNG[1], 0);
// Unclickable elements inside PNG backgrounds.
var tags = ['a', 'input', 'select', 'textarea', 'iframe', 'object'],
t = tags.length, tFix = [];
while (t--)
{
var elms = all.tags(tags[t]), e = elms.length;
while (e--) tFix.push(elms[e]);
}
var t = tFix.length;
if (t && (/relative|absolute/i).test(currentStyle.position))
alert('IEPNGFix: Children of positioned element are unclickable:\n\n<' +
nodeName + (id && ' id=' + id) + '>');
while (t--)
if (!(/relative|absolute/i).test(tFix[t].currentStyle.position))
tFix[t].style.position = 'relative';
}
else filt();
}
}
iePNGFix(1);
</script>
</public:component>

View file

@ -0,0 +1,79 @@
.colorpicker img, .colorpicker div {
behavior: url(iepngfix.htc);
}
.xe_colorpicker {
position:absolute;
width:194px;
height:183px;
overflow:hidden;
z-index:100;
}
.xe_colorpicker .colorpicker {
position:relative;
width:192px;
height:160px;
background-color:white;
border:1px solid silver;
}
.xe_colorpicker .colortable {
position:absolute;
left : 4px;
top : 4px;
border:1px solid #909090;
}
.xe_colorpicker .colortable .background {
position:relative;
width:150px;
height:150px;
background:url(../images/colorpicker_overlay.png) no-repeat;
overflow:hidden;
}
.xe_colorpicker .colortable .indicator {
position:absolute;
width:11px;
height:11px;
background:url(../images/colorpicker_select.gif) no-repeat;
}
.xe_colorpicker .huebar {
position:absolute;
right : 4px;
top : 4px;
border:1px solid #909090;
}
.xe_colorpicker .huebar .background {
width:20px;
height:150px;
background:url(../images/colorpicker_huebg.png) repeat-x;
}
.xe_colorpicker .huebar .indicator {
position:absolute;
width:35px;
height:9px;
left:-3px;
background:transparent url(../images/colorpicker_indic.gif) no-repeat;
}
.xe_colorpicker .buttons {
position:absolute;
width:194px;
background-color:black;
}
.xe_colorpicker .buttons button {
width:33%;
color:white;
height:22px;
border:0;
background-color:transparent;
padding:0;
margin:0;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 B

View file

@ -0,0 +1,2 @@
css/xe_colorpicker.css
xe_colorpicker.js

View file

@ -0,0 +1,366 @@
/**
* @brief XE Colorpicker
* @author mygony (http://mygony.com)
**/
jQuery(function($){
var ready = false;
var tmp = $('<span>').hide();
// var panel = null;
$.fn.xe_colorpicker = function(settings){
var selection = this;
if (!ready) {
ColorPicker.init(settings);
ready = true;
}
this.each(function(){
var col = color($(this).val());
$(this).val( col ).css('background-color', col );
setTextColor( $(this) );
}).focus(function(event){
var t = this;
$(this).select();
// show color picker
ColorPicker.show(this);
}).keypress(function(event){
if (!ColorPicker.is(':visible')) return;
if (/^#?[0-9a-f]{6}$/i.test( event.target.value )) {
ColorPicker.color( event.target.value );
}
});
$(document).mousedown(function(event){
var target = event.target;
if (selection.index(target) > -1) return;
if ($(target).parents().add(target).index(ColorPicker.element) > -1) return;
if ($(target).parents().add(target).index(ColorPicker.buttons) > -1) return;
ColorPicker.hide();
});
return this;
};
var ColorPicker = {
element : null,
picker : null,
colpane: null,
buttons : null,
_target : null,
_backup : null,
_hsv : null,
_mode : 'none',
init : function() {
var cp = this;
this.element = $('<div class="xe_colorpicker"><div class="colorpicker"><div class="colortable"><div class="background"><div class="indicator"></div></div></div><div class="huebar"><div class="background"><div class="indicator"></div></div></div></div><div class="buttons"><button type="button" class="ok">OK</button><button type="button" class="cancel">Cancel</button><button type="button" class="none">None</button></div></div>');
this.picker = this.element.find('> div.colorpicker');
this.colpane = this.picker.find('div.colortable > div.background');
this.colpoint = this.colpane.find('> .indicator');
this.buttons = this.element.find('> div.buttons');
this.huepane = this.element.find('div.huebar > .background');
this.huepoint = this.huepane.find('> .indicator');
this._mousedown = method(this.onmousedown, this);
this._mousemove = method(this.onmousemove, this);
this._mouseup = method(this.onmouseup, this);
this.picker.find('.background').mousedown(this._mousedown);
this.buttons.find('button.ok').click(method(this.ok,this));
this.buttons.find('button.cancel').click(method(this.cancel,this));
this.buttons.find('button.none').click(method(this.none,this));
// only for IE6
if ($.browser.msie && parseInt($.browser.version) < 7) {
this.element.append( $('<iframe>').css({position:'absolute','z-index':-1,left:0,top:0,width:9999,height:9999}) );
}
},
show : function(input) {
var pos = (input=$(input)).offset(), pos_panel;
//var par = input.get(0).offsetParent;
var par = $("body").get(0);
var btn = this.buttons.hide();
var col = color(input.val());
this._target = input;
this._backup = col;
this.color(col);
this._target.val(col);
pos_panel = this.element.hide().css({'z-index':99999,left:0,top:0}).appendTo( par ).show(300,function(){btn.slideDown(150)}).offset();
this.element.css({left:pos.left-pos_panel.left,top:pos.top-pos_panel.top+input.get(0).offsetHeight});
},
hide : function() {
var e = this.element;
this._target = null;
this.buttons.slideUp(100, function(){e.hide(200)});
},
visible : function() {
return this.element.is(':visible');
},
color : function(sColor) {
if (typeof sColor == 'string') {
var col = color(sColor);
var hsv = _hsv(rgb2hsv(hex2rgb(col)));
this.hsv(hsv.h, hsv.s, hsv.v);
} else if (this._target) {
return color(this._target.val());
}
},
hsv : function(h, s, v) {
var col = rgb2hex(hsv2rgb(h, s, v));
this._hsv = _hsv(h, s, v);
// background color and text color
this._target.val(col).css('background-color', col);
setTextColor(this._target);
// hue bar indicator
if (this._hue_h) this.huepoint.css('top', limit(0, Math.round((360-this._hsv.h)/360*this._hue_h), this._hue_h-1) - 3 );
// color - background
this.colpane.css('background-color', rgb2hex(hsv2rgb(h, 100, 100)) );
// color - indicator
if (this._col_h && this._col_w) {
this.colpoint.css({
top : limit(0, Math.round((100-this._hsv.v)/100*this._col_h), this._col_h-1) - 5,
left : limit(0, Math.round(this._hsv.s/100*this._col_w), this._col_w-1 ) - 5
});
}
},
onmousedown : function(event) {
var cur = $(event.target);
var par = cur.parent();
var pos = cur.offset();
var hue, sat, val; // hue, saturation, value
this._height = cur.height();
this._width = cur.width();
this._top = pos.top;
this._left = pos.left;
this._col_w = this.colpane.width();
this._col_h = this.colpane.width();
this._hue_h = this.huepane.height();
if (par.is('.colortable')) {
this._mode = 'color';
hue = this._hsv.h;
sat = ( limit(0, (event.pageX - this._left), this._width ) / this._width * 100);
val = ( limit(0, (this._height - event.pageY + this._top), this._height ) / this._height * 100);
} else if (par.is('.huebar')) {
this._mode = 'hue';
hue = limit(0, (this._height - event.pageY + this._top), this._height) / this._height * 360;
sat = this._hsv.s;
val = this._hsv.v;
}
this.hsv( hue, sat, val );
$(document).bind('mousemove', this._mousemove).bind('mouseup', this._mouseup);
},
onmousemove : function(event) {
var hue, sat, val; // hue, saturation, value
switch(this._mode) {
case 'color':
hue = this._hsv.h;
sat = ( limit(0, (event.pageX - this._left), this._width ) / this._width * 100);
val = ( limit(0, (this._height - event.pageY + this._top), this._height ) / this._height * 100);
break;
case 'hue':
hue = limit(0, (this._height - event.pageY + this._top), this._height) / this._height * 360;
sat = this._hsv.s;
val = this._hsv.v;
break;
}
this.hsv( hue, sat, val );
},
onmouseup : function(event) {
this._mode = 'none';
$(document).unbind('mousemove', this._mousemove).unbind('mouseup', this._mouseup);
},
ok : function() {
this.hide();
},
cancel : function() {
this.color(this._backup);
this.hide();
},
none : function() {
this._target.attr('value','transparent');
this.hide();
}
};
function setTextColor(input) {
var hex = input.css('color', '').val(), hsv, rgb;
if (hex == 'transparent' || hex == '') return;
rgb = hex2rgb(hex);
hsv = rgb2hsv(255-rgb.r, 255-rgb.g, 255-rgb.b); // 보색을 구한 뒤
hex = rgb2hex(hsv2rgb(0, 0, hsv.v>50?100:0)); // 보색에 해당하는 흑백으로 결정
input.css('color', hex);
}
function method(func, thisObj) {
return function() { return func.apply(thisObj, arguments) }
}
function color(str) {
var col = $.trim(str);
var regHex1 = /^#[0-9a-f]{6}$/i;
var regHex2 = /^#?([0-9a-f])([0-9a-f])([0-9a-f])$/i; // short hex
if (regHex1.test(col)) return col.toUpperCase();
if (regHex2.test(col)) return col.replace(regHex2, '#$1$1$2$2$3$3').toUpperCase();
try {
col = tmp.appendTo($('<body>')).css('background-color', col).css('background-color');
} catch(e) {
col = '#FFFFFF';
} finally {
tmp.css('background-color','').remove();
}
if (/^rgb\(([0-9, ]+)\)$/i.test(col)) col = rgb2hex(RegExp.$1.split(/,\s*/));
if (!/#[0-9a-f]{6}/i.test(col)) col = '#FFFFFF';
return col;
}
function _rgb(rgb, _g, _b) {
var r, g, b;
if (typeof arguments[2] == "number") {
r = rgb;
g = _g;
b = _b;
} else if (typeof rgb == "object") {
if (rgb.constructor == Array) {
r = rgb[0] || 0; g = rgb[1] || 0; b = rgb[2] || 0;
} else {
r = rgb.r || 0; g = rgb.g || 0; b = rgb.b || 0;
}
}
rgb = [];
rgb.r = rgb[0] = r = parseInt(r, 10);
rgb.g = rgb[1] = g = parseInt(g, 10);
rgb.b = rgb[2] = b = parseInt(b, 10);
return rgb;
}
function _hsv(hsv, _s, _v) {
var h, s, v;
if (typeof arguments[2] == "number") {
h = hsv; s = _s; v = _v;
} else if (typeof hsv == "object") {
if (hsv.constructor == Array) {
h = hsv[0] || 0; s = hsv[1] || 0; v = hsv[2] || 0;
} else {
h = hsv.h || 0; s = hsv.s || 0; v = hsv.v || 0;
}
}
hsv = [];
hsv.h = hsv[0] = h = parseInt(h, 10);
hsv.s = hsv[1] = s = parseInt(s, 10);
hsv.v = hsv[2] = v = parseInt(v, 10);
return hsv;
}
function rgb2hex(rgb, _g, _b) {
var rgb = _rgb(rgb, _g, _b);
for(var i=0; i < rgb.length; i++) {
(rgb[i] = Number(rgb[i]).toString(16)).length<2?rgb[i]='0'+rgb[i]:0;
}
return '#'+rgb.join('').toUpperCase();
}
function hex2rgb(hex) {
var r=0, g=0, b=0;
if (/^#?([0-9a-f]{1,2})([0-9a-f]{1,2})([0-9a-f]{1,2})$/i.test(hex)) {
r = parseInt(RegExp.$1, 16);
g = parseInt(RegExp.$2, 16);
b = parseInt(RegExp.$3, 16);
}
return _rgb(r, g, b);
}
function hsv2rgb(hsv, _s, _v) {
var r=0, g=0, b=0;
var h=0, s=0, v=0;
var i, f, p, q, t;
hsv = _hsv(hsv, _s, _v);
h = (hsv[0] % 360) / 60; s = hsv[1] / 100; v = hsv[2] / 100;
i = Math.floor(h);
f = h-i;
p = v*(1-s);
q = v*(1-s*f);
t = v*(1-s*(1-f));
switch (i) {
case 0: r=v; g=t; b=p; break;
case 1: r=q; g=v; b=p; break;
case 2: r=p; g=v; b=t; break;
case 3: r=p; g=q; b=v; break;
case 4: r=t; g=p; b=v; break;
case 5: r=v; g=p; b=q; break;
case 6: break;
}
return _rgb(Math.floor(r*255), Math.floor(g*255), Math.floor(b*255));
}
function rgb2hsv(rgb, _g, _b) {
var rgb = _rgb(rgb, _g, _b);
var r = rgb[0], g = rgb[1], b = rgb[2];
var h = 0, s = 0, v = Math.max(r,g,b), min = Math.min(r,g,b), delta = v - min;
if (s = v?delta/v:0) {
if (r == v) h = 60 * (g - b) / delta;
else if (g == v) h = 120 + 60 * (b - r) / delta;
else if (b == v) h = 240 + 60 * (r - g) / delta;
if (h < 0) h += 360;
}
return _hsv(Math.floor(h), Math.floor(s*100), Math.floor(v/255*100));
}
function limit(min, val, max){
return Math.min(Math.max(min, val), max);
}
$('input.color-indicator').xe_colorpicker();
});

View file

@ -0,0 +1,119 @@
function doSearchKrZip(obj, column_name) {
var fo_obj = obj;
while(fo_obj) {
if(fo_obj.nodeName == 'FORM') break;
fo_obj = fo_obj.parentNode;
}
if(fo_obj.nodeName != 'FORM') return;
var field_obj = fo_obj['addr_search_'+column_name];
if(!field_obj) return;
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, fo_obj);
}
function completeSearchKrZip(ret_obj, response_tags, callback_args, fo_obj) {
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('addr_list_'+column_name);
if(!zone_list_obj) return;
var zone_search_obj = xGetElementById('addr_search_'+column_name);
if(!zone_search_obj) return;
var sel_obj = fo_obj['addr_list_'+column_name];
if(!sel_obj) return;
for(var i=0;i<sel_obj.length;i++) {
sel_obj.remove(0);
}
for(var i=0;i<address_list.length;i++) {
if(!address_list[i]) continue;
var opt = new Option(address_list[i],address_list[i],false,false);
sel_obj.options[sel_obj.options.length] = opt;
}
sel_obj.selectedIndex = 0;
zone_search_obj.style.display = 'none';
zone_list_obj.style.display = 'block';
}
function doHideKrZipList(obj, column_name) {
var fo_obj = obj;
while(fo_obj) {
if(fo_obj.nodeName == 'FORM') break;
fo_obj = fo_obj.parentNode;
}
if(fo_obj.nodeName != 'FORM') return;
var zone_list_obj = xGetElementById('addr_list_'+column_name);
if(!zone_list_obj) return;
var zone_search_obj = xGetElementById('addr_search_'+column_name);
if(!zone_search_obj) return;
zone_list_obj.style.display = 'none';
zone_search_obj.style.display = 'block';
fo_obj['addr_search_'+column_name].focus();
}
function doSelectKrZip(obj, column_name) {
var fo_obj = obj;
while(fo_obj) {
if(fo_obj.nodeName == 'FORM') break;
fo_obj = fo_obj.parentNode;
}
if(fo_obj.nodeName != 'FORM') return;
var zone_list_obj = xGetElementById('addr_list_'+column_name);
if(!zone_list_obj) return;
var zone_search_obj = xGetElementById('addr_search_'+column_name);
if(!zone_search_obj) return;
var zone_searched_obj = xGetElementById('addr_searched_'+column_name);
if(!zone_searched_obj) return;
var sel_obj = fo_obj['addr_list_'+column_name];
if(!sel_obj) return;
var address = sel_obj.options[sel_obj.selectedIndex].value;
fo_obj[column_name][0].value = address;
zone_searched_obj.style.display = 'block';
zone_list_obj.style.display = 'none';
zone_search_obj.style.display = 'none';
fo_obj[column_name][1].focus();
}
function doShowKrZipSearch(obj, column_name) {
var zone_list_obj = xGetElementById('addr_list_'+column_name);
if(!zone_list_obj) return;
var zone_search_obj = xGetElementById('addr_search_'+column_name);
if(!zone_search_obj) return;
var zone_searched_obj = xGetElementById('addr_searched_'+column_name);
if(!zone_searched_obj) return;
zone_searched_obj.style.display = 'none';
zone_list_obj.style.display = 'none';
zone_search_obj.style.display = 'block';
}

View file

@ -0,0 +1 @@
krzip_search.js

View file

@ -26,6 +26,14 @@ function exec_xml(module, act, params, callback_func, response_tags, callback_fu
// 결과 처리 후 callback_func에 넘겨줌
function xml_response_filter(oXml, callback_func, response_tags, callback_func_arg, fo_obj) {
var text = oXml.getResponseText();
if(text && !/^<response>/i.test(text)) {
var waiting_obj = xGetElementById("waitingforserverresponse");
if(waiting_obj) waiting_obj.style.visibility = "hidden";
alert(text);
return null;
}
var xmlDoc = oXml.getResponseXml();
if(!xmlDoc) return null;
@ -64,6 +72,7 @@ function xml_handler() {
this.setPath = xml_handlerSetPath;
this.addParam = xml_handlerAddParam;
this.getResponseXml = xml_handlerGetResponseXML;
this.getResponseText = xml_handlerGetResponseText;
this.toZMsgObject = xml_handlerToZMsgObject;
this.parseXMLDoc = xml_parseXmlDoc;
@ -160,6 +169,13 @@ function xml_handlerGetResponseXML() {
return null;
}
function xml_handlerGetResponseText() {
if(this.objXmlHttp && this.objXmlHttp.readyState == 4 && isDef(this.objXmlHttp.responseText)) {
return this.objXmlHttp.responseText;
}
return null;
}
function xml_parseXmlDoc(dom) {
@ -217,6 +233,17 @@ function xml_handlerToZMsgObject(xmlDoc, tags) {
var parsed_array = this.parseXMLDoc(xmlDoc.getElementsByTagName('response')[0]);
if(typeof(parsed_array)=='undefined') {
var ret = new Array();
ret['error'] = -1;
ret['message'] = "Unexpected error occured.";
try{
if(typeof(xmlDoc.childNodes[0].firstChild.data)!='undefined') ret['message']+="\r\n"+xmlDoc.childNodes[0].firstChild.data;
} catch(e) {
}
return ret;
}
var obj_ret = new Array();
for(var i=0; i<tags.length; i++) {
var key = tags[i];
@ -417,7 +444,7 @@ $.exec_json = function(action,data,func){
}
};
$.fn.exec_html = function(action,data,type){
$.fn.exec_html = function(action,data,type,func,args){
if(typeof(data) == 'undefined') data = {};
if(!$.inArray(type, ['html','append','prepend'])) type = 'html';
@ -437,6 +464,7 @@ $.fn.exec_html = function(action,data,type){
,success : function(html){
$("#waitingforserverresponse").css('visibility','hidden');
self[type](html);
if($.isFunction(func)) func(args);
}
});
}

View file

@ -75,6 +75,7 @@
$lang->secret = 'Secret';
$lang->category = $lang->category_srl = 'Category';
$lang->none_category = 'None category';
$lang->none_image = '이미지 없음';
$lang->document_srl = 'Doc. No.';
$lang->user_id = 'User ID';
$lang->author = 'Developer';
@ -117,6 +118,7 @@
$lang->order_type = 'Sorting Type';
$lang->order_asc = 'ascend';
$lang->order_desc = 'descend';
$lang->file = 'file';
$lang->mid = 'Module Name';
$lang->layout = 'Layout';
@ -256,6 +258,7 @@
$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['radio'] = 'radio button (radio)';
$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)';

View file

@ -74,6 +74,7 @@
$lang->secret = 'Secreto';
$lang->category = $lang->category_srl = 'Categoría';
$lang->none_category = 'Sin categoría';
$lang->none_image = '이미지 없음';
$lang->document_srl = 'Número del documento';
$lang->user_id = 'ID de Usuario';
$lang->author = 'Autor';
@ -116,6 +117,7 @@
$lang->order_type = 'Tipo de Ordenación';
$lang->order_asc = 'ascendente';
$lang->order_desc = 'descendente';
$lang->file = 'file';
$lang->mid = 'ID del Módulo';
$lang->layout = 'Composición';
@ -262,6 +264,7 @@
$lang->column_type_list['textarea'] = 'Texto multi-linea';
$lang->column_type_list['checkbox'] = 'Caja de chequeo (selección múltiple)';
$lang->column_type_list['select'] = 'Selección (selección individual)';
$lang->column_type_list['radio'] = 'radio button (radio)';
//$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)';

View file

@ -75,6 +75,7 @@
$lang->secret = 'Secret';
$lang->category = $lang->category_srl = 'Catégorie';
$lang->none_category = 'None category';
$lang->none_image = '이미지 없음';
$lang->document_srl = 'Numéro de série du Document';
$lang->user_id = 'Compte';
$lang->author = 'Auteur';
@ -117,6 +118,7 @@
$lang->order_type = 'Sorting Type';
$lang->order_asc = 'Ascend';
$lang->order_desc = 'Descendre';
$lang->file = 'file';
$lang->mid = 'Nom';
$lang->layout = 'Mise en Page';
@ -256,6 +258,7 @@
$lang->column_type_list['textarea'] = 'Texte en plusieurs lignes';
$lang->column_type_list['checkbox'] = 'Case à cocher (multichoix)';
$lang->column_type_list['select'] = 'Case d\'option (seul choix)';
$lang->column_type_list['radio'] = 'radio button (radio)';
$lang->column_type_list['kr_zip'] = 'Code postal (coréen)';
$lang->column_type_list['date'] = 'Jour (yyyy/mm/dd)';
//$lang->column_type_list['jp_zip'] = 'code postal (japonais)';

View file

@ -75,6 +75,7 @@
$lang->secret = 'Geheim';
$lang->category = $lang->category_srl = 'Kategorie';
$lang->none_category = '분류없음';
$lang->none_image = '이미지 없음';
$lang->document_srl = 'Doc. No ';
$lang->user_id = 'User-ID';
$lang->author = 'Entwickler';
@ -117,6 +118,7 @@
$lang->order_type = 'Sortieren Typ';
$lang->order_asc = 'Aufstieg';
$lang->order_desc = 'Abstieg';
$lang->file = 'file';
$lang->mid = 'Module Name';
$lang->layout = 'Layout';
@ -256,6 +258,7 @@
$lang->column_type_list['textarea'] = 'Multi-line textarea';
$lang->column_type_list['checkbox'] = 'Checkbox (multiple Auswahl)';
$lang->column_type_list['select'] = 'select box (Einzel-Auswahl) ';
$lang->column_type_list['radio'] = 'radio button (radio)';
$lang->column_type_list['kr_zip'] = 'Postleitzahl (Koreanisch) ';
$lang->column_type_list['date'] = 'Datum (jjjj / mm / dd)';
// $lang->column_type_list [ 'jp_zip'] = 'Postleitzahl (Japanisch)';

View file

@ -69,12 +69,13 @@
$lang->disable = '不可';
// 基本用語
$lang->menu = 'Menu';
$lang->menu = 'メニュー';
$lang->no = '番号';
$lang->notice = 'お知らせ';
$lang->secret = '非公開';
$lang->category = $lang->category_srl = 'カテゴリ';
$lang->none_category = 'カテゴリ無し';
$lang->none_image = 'イメージなし';
$lang->document_srl = '書き込み番号';
$lang->user_id = 'ユーザーID';
$lang->author = '作成者';
@ -117,6 +118,7 @@
$lang->order_type = 'ソート方法';
$lang->order_asc = '昇る';
$lang->order_desc = '降下';
$lang->file = 'ファイル';
$lang->mid = 'モジュール名';
$lang->layout = 'レイアウト';
@ -256,6 +258,7 @@
$lang->column_type_list['textarea'] = 'テキストエリア(textarea)';
$lang->column_type_list['checkbox'] = 'チェックボックス(checkbox)';
$lang->column_type_list['select'] = '選択(select)';
$lang->column_type_list['radio'] = 'radio button (radio)';
$lang->column_type_list['kr_zip'] = '韓国住所(zip)';
$lang->column_type_list['date'] = '日付(年月日)';
//$lang->column_type_list['jp_zip'] = '日本住所(zip)';

View file

@ -42,7 +42,7 @@
$lang->cmd_select = '선택';
$lang->cmd_select_all = '모두선택';
$lang->cmd_unselect_all = '모두해제';
$lang->cmd_reverse_all = "선택반전";
$lang->cmd_reverse_all = '선택반전';
$lang->cmd_close_all = '모두닫기';
$lang->cmd_open_all = '모두열기';
$lang->cmd_reload = '다시읽기';
@ -58,8 +58,8 @@
$lang->cmd_scrap = '스크랩';
$lang->cmd_preview = '미리 보기';
$lang->cmd_reset = '초기화';
$lang->cmd_remake_cache = "캐시파일 재생성";
$lang->cmd_publish = "발행";
$lang->cmd_remake_cache = '캐시파일 재생성';
$lang->cmd_publish = '발행';
$lang->cmd_layout_setup = '레이아웃 설정';
$lang->cmd_layout_edit = '레이아웃 편집';
$lang->cmd_search_by_ipaddress = 'IP주소로 검색';
@ -75,6 +75,7 @@
$lang->secret = '비밀';
$lang->category = $lang->category_srl = '분류';
$lang->none_category = '분류 없음';
$lang->none_image = '이미지 없음';
$lang->document_srl = '문서번호';
$lang->user_id = '아이디';
$lang->author = '작성자';
@ -95,7 +96,7 @@
$lang->topic = '주제';
$lang->replies = '댓글';
$lang->content = '내용';
$lang->document = '게시물';
$lang->document = '문서';
$lang->comment = '댓글';
$lang->description = '설명';
$lang->trackback = '엮인글';
@ -117,6 +118,7 @@
$lang->order_type = '정렬방법';
$lang->order_asc = '올림차순';
$lang->order_desc = '내림차순';
$lang->file = '파일';
$lang->mid = '모듈이름';
$lang->layout = '레이아웃';
@ -126,8 +128,8 @@
$lang->colorset = '컬러셋';
$lang->extra_vars = '확장변수';
$lang->domain = "도메인";
$lang->url = "URL";
$lang->domain = '도메인';
$lang->url = 'URL';
$lang->document_url = '게시글 주소';
$lang->trackback_url = '엮인글 주소';
$lang->blog_name = '블로그이름';
@ -216,7 +218,7 @@
$lang->msg_not_founded = '대상을 찾을 수 없습니다';
$lang->msg_no_result = '검색 결과가 없습니다';
$lang->msg_not_permitted_act = '요청하신 action을 실행할 수 있는 권한이 없습니다';
$lang->msg_not_permitted_act = '요청하신 기능을 실행할 수 있는 권한이 없습니다';
$lang->msg_module_is_not_exists = '요청하신 모듈을 찾을 수 없습니다';
$lang->msg_module_is_not_standalone = '요청하신 모듈은 독립적으로 동작할 수가 없습니다';
@ -250,12 +252,13 @@
$lang->column_type = '형식';
$lang->column_type_list['text'] = '한줄 입력칸 (text)';
$lang->column_type_list['homepage'] = '홈페이지 형식 (url)';
$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['radio'] = '라디오 버튼 (radio)';
$lang->column_type_list['kr_zip'] = '한국주소 (zip)';
$lang->column_type_list['date'] = '일자 (년월일)';
//$lang->column_type_list['jp_zip'] = '일본주소 (zip)';
@ -278,12 +281,12 @@
그리고 설치 관리자 페이지에서 FTP 정보를 변경하거나 제거할 있습니다.<br />
";
$lang->msg_safe_mode_ftp_needed = "PHP의 safe_mode가 On일 경우 FTP 정보를 꼭 입력해주셔야 XE의 설치 및 사용이 가능합니다";
$lang->msg_ftp_not_connected = "localhost로의 FTP 접속 오류가 발생하였습니다. ftp 포트 번호를 확인해주시거나 ftp 서비스가 가능한지 확인해주세요";
$lang->msg_ftp_invalid_auth_info = "입력하신 FTP 정보로 로그인을 하지 못했습니다. FTP정보를 확인해주세요";
$lang->msg_ftp_mkdir_fail = "FTP를 이용한 디렉토리 생성 명령을 실패하였습니다. FTP 서버의 설정을 확인해주세요";
$lang->msg_ftp_chmod_fail = "FTP를 이용한 디렉토리의 속성 변경을 실패하였습니다. FTP 서버의 설정을 확인해주세요";
$lang->msg_ftp_connect_success = "FTP 접속 및 인증 성공하였습니다";
$lang->msg_safe_mode_ftp_needed = 'PHP의 safe_mode가 On일 경우 FTP 정보를 꼭 입력해주셔야 XE의 설치 및 사용이 가능합니다';
$lang->msg_ftp_not_connected = 'localhost로의 FTP 접속 오류가 발생하였습니다. ftp 포트 번호를 확인해주시거나 ftp 서비스가 가능한지 확인해주세요';
$lang->msg_ftp_invalid_auth_info = '입력하신 FTP 정보로 로그인을 하지 못했습니다. FTP정보를 확인해주세요';
$lang->msg_ftp_mkdir_fail = 'FTP를 이용한 디렉토리 생성 명령을 실패하였습니다. FTP 서버의 설정을 확인해주세요';
$lang->msg_ftp_chmod_fail = 'FTP를 이용한 디렉토리의 속성 변경을 실패하였습니다. FTP 서버의 설정을 확인해주세요';
$lang->msg_ftp_connect_success = 'FTP 접속 및 인증 성공하였습니다';
// xml filter에서 사용되는 javascript용 alert msg
$lang->filter->isnull = '%s의 값을 입력해주세요';

View file

@ -1,8 +1,8 @@
ko,한국어
en,English
zh-CN,简体中文
zh-CN,中文(中国)
jp,日本語
es,Español
ru,Русский
fr,Français
zh-TW,正體中文
zh-TW,中文(臺灣)

View file

@ -256,6 +256,7 @@
$lang->column_type_list['textarea'] = 'многолетних-лайн textarea';
$lang->column_type_list['checkbox'] = 'флажок (несколько отбор)';
$lang->column_type_list['select'] = 'выберите поле (один отбор)';
$lang->column_type_list['radio'] = 'radio button (radio)';
$lang->column_type_list['kr_zip'] = 'почтовый индекс (корейский)';
$lang->column_type_list['date'] = 'Дата (гггг / мм / дд)';
//$lang->column_type_list['jp_zip'] = 'почтовый индекс (японский)';

View file

@ -49,7 +49,7 @@
$lang->cmd_close = '关闭';
$lang->cmd_open = '打开';
$lang->cmd_setup = '设置';
$lang->cmd_addition_setup = '扩展设置';
$lang->cmd_addition_setup = '高级选项';
$lang->cmd_option = '选项';
$lang->cmd_apply = '应用';
$lang->cmd_open_calendar = '选择日期';
@ -58,7 +58,7 @@
$lang->cmd_scrap = '收藏';
$lang->cmd_preview = '预览';
$lang->cmd_reset = '初始化';
$lang->cmd_remake_cache = "重新生成缓冲文件";
$lang->cmd_remake_cache = "更新缓冲";
$lang->cmd_publish = "发表";
$lang->cmd_layout_setup = '布局设置';
$lang->cmd_layout_edit = '编辑布局';
@ -75,6 +75,7 @@
$lang->secret = '密帖';
$lang->category = $lang->category_srl = '分类';
$lang->none_category = '无分类';
$lang->none_image = '无图';
$lang->document_srl = '文章编号';
$lang->user_id = '用户名';
$lang->author = '制作';
@ -117,6 +118,7 @@
$lang->order_type = '排序方式';
$lang->order_asc = '升序';
$lang->order_desc = '倒序';
$lang->file = '文件';
$lang->mid = '模块名称';
$lang->layout = '布局';
@ -124,7 +126,7 @@
$lang->module = '模块';
$lang->skin = '皮肤';
$lang->colorset = '颜色设定';
$lang->extra_vars = '扩展变';
$lang->extra_vars = '扩展变';
$lang->domain = "域名";
$lang->url = "URL";
@ -256,6 +258,7 @@
$lang->column_type_list['textarea'] = '多行文本框 (textarea)';
$lang->column_type_list['checkbox'] = '复选框 (checkbox)';
$lang->column_type_list['select'] = '下拉列表框 (select)';
$lang->column_type_list['radio'] = '单选框 (radio)';
$lang->column_type_list['kr_zip'] = '韩国邮编(zip)';
$lang->column_type_list['date'] = '日期 (年月日)';
//$lang->column_type_list['jp_zip'] = '日本地址 (zip)';

View file

@ -62,19 +62,20 @@
$lang->cmd_publish = "發表";
$lang->cmd_layout_setup = '版面設置';
$lang->cmd_layout_edit = '版面編輯';
$lang->cmd_search_by_ipaddress = '以 IP位址搜尋';
$lang->cmd_add_ip_to_spamfilter = '新增 IP至垃圾過濾器';
$lang->cmd_search_by_ipaddress = '以IP位址搜尋';
$lang->cmd_add_ip_to_spamfilter = '封鎖此IP位址';
$lang->enable = '可用';
$lang->disable = '禁用';
// 基本詞語
$lang->menu = 'Menu';
$lang->menu = '選單';
$lang->no = '編號';
$lang->notice = '公告';
$lang->secret = '秘密';
$lang->category = $lang->category_srl = '分類';
$lang->none_category = '無分類';
$lang->none_image = '無圖片';
$lang->document_srl = '文章編號';
$lang->user_id = '帳號';
$lang->author = '作者';
@ -117,6 +118,7 @@
$lang->order_type = '排列方式';
$lang->order_asc = '升冪';
$lang->order_desc = '降冪';
$lang->file = '檔案';
$lang->mid = '模組名稱';
$lang->layout = '版面';
@ -133,7 +135,7 @@
$lang->blog_name = '部落格名稱';
$lang->excerpt = '轉載自';
$lang->document_count = '文章數';
$lang->document_count = '文章數';
$lang->page_count = '頁數';
$lang->list_count = '列表數';
$lang->search_list_count = '搜尋列表數';
@ -250,12 +252,13 @@
$lang->column_type = '格式';
$lang->column_type_list['text'] = '文字輸入(text)';
$lang->column_type_list['homepage'] = '網址格式 (url)';
$lang->column_type_list['homepage'] = '網址格式';
$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['textarea'] = '文字區域 (textarea)';
$lang->column_type_list['checkbox'] = '核取方塊 (checkbox)';
$lang->column_type_list['select'] = '下拉式選單 (select)';
$lang->column_type_list['radio'] = '選項按紐 (radio)';
$lang->column_type_list['kr_zip'] = '韓國郵編(zip)';
$lang->column_type_list['date'] = '日期 (年月日)';
//$lang->column_type_list['jp_zip'] = '日本郵編 (zip)';
@ -265,33 +268,33 @@
$lang->is_active = '啟動';
$lang->is_required = '必填';
// 關於 FTP
$lang->ftp_form_title = '輸入 FTP資訊';
// 關於FTP
$lang->ftp_form_title = '輸入FTP資訊';
$lang->ftp = 'FTP';
$lang->ftp_port = 'FTP Port';
$lang->cmd_check_ftp_connect = '確認 FTP連線';
$lang->ftp_port = 'FTP埠口';
$lang->cmd_check_ftp_connect = '檢查FTP連線';
$lang->about_ftp_info = "
FTP資訊可應用至以下情形<br/>
1. PHP的安全模式(safe_mode)開啟時,可使程式正常運作。<br/>
1. PHP的安全模式(safe_mode)開啟時,可使程式正常運作。<br/>
2. 可用於自動更新。<br/>
這個 FTP資訊會儲存在檔案 files/config/ftp.config.php裡面。<br/>
安裝程式後,可以在管理頁面中針對 FTP資訊進行修改或刪除。<br />
此FTP資訊會儲存在檔案『files/config/ftp.config.php裡面。<br/>
安裝程式後,可以在管理頁面中針對FTP資訊進行修改或刪除。<br />
";
$lang->msg_safe_mode_ftp_needed = "PHP的安全模式(safe_mode)開啟時,請輸入相關 FTP資訊否則無法正常安裝或使用程式。";
$lang->msg_ftp_not_connected = "本地(localhost)FTP連線錯誤。請確認 FTP Prot或確認是否支援 FTP功能。";
$lang->msg_ftp_invalid_auth_info = "FTP登入失敗。請確認輸入的 FTP資訊。";
$lang->msg_ftp_mkdir_fail = "新增資料夾失敗。請確認 FTP主機設置。";
$lang->msg_ftp_chmod_fail = "修改資料夾權限失敗。請確認 FTP主機設置。";
$lang->msg_ftp_connect_success = "FTP連線成功。";
$lang->msg_safe_mode_ftp_needed = '當PHP的安全模式(safe_mode)開啟時請輸入相關FTP資訊否則無法正常安裝或使用程式。';
$lang->msg_ftp_not_connected = '本地(localhost)FTP連線錯誤。請檢查FTP埠口並確認是否支援FTP功能。';
$lang->msg_ftp_invalid_auth_info = 'FTP登入失敗。請確認輸入的FTP資訊。';
$lang->msg_ftp_mkdir_fail = '新增資料夾失敗。請確認FTP主機設置。';
$lang->msg_ftp_chmod_fail = '修改資料夾權限失敗。請確認FTP主機設置。';
$lang->msg_ftp_connect_success = 'FTP連線成功。';
// 在 xml filter使用的 javascript用 alert msg
// 在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_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_homepage = '%s格式有誤。(例: http://www.zeroboard.com)';
$lang->filter->invalid_korean = '%s只能輸入中文';
$lang->filter->invalid_korean_number = '%s只能輸入中文或數字';
$lang->filter->invalid_alpha = '%s只能輸入英文字母';

View file

@ -1,268 +0,0 @@
<?php
####################
## 연도 범위 설정 ##
// 최대
$max_year = 2900;//년 (우주가 사라지는 날 까지)
// 최소
$min_year = 1900;//년 (0년 부터)
####################
$year = htmlspecialchars($_REQUEST['year']);
$month = htmlspecialchars($_REQUEST['month']);
$method = htmlspecialchars($_REQUEST['method']);
$fo_id = htmlspecialchars($_REQUEST['fo_id']);
$callback_func = htmlspecialchars($_REQUEST['callback_func']);
$day_str = htmlspecialchars($_REQUEST['day_str']); // 날짜 (ex. 20080101)
if($day_str && strlen($day_str)) {
$year = substr($day_str, 0, 4);
$month = substr($day_str, 4, 2);
}
if($year < $min_year || $year > $max_year) $year = date("Y");
if(!(int)$month || $month < 1 || $month > 12) $month = date("n");
switch($method) {
case 'prev_year' :
$year --;
break;
case 'prev_month' :
$month --;
if($month < 1) {
$month = 12;
$year --;
}
break;
case 'next_month' :
$month ++;
if($month > 12) {
$month = 1;
$year ++;
}
break;
case 'next_year' :
$year ++;
break;
}
// 긴 이름
$monthLongName = array(1 => "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
// 짧은 이름
$monthShortName = array(1 => "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
// 요일 이름
$dayName = array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
/*
* @brief 윤년 검사
*/
function isLeapYear($year) {
if ($year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0) return true;
else return false;
}
/*
* @brief 날짜 계산
*/
function convertDatetoDay($year, $month, $day = 0) {
$numOfLeapYear = 0; // 윤년의 수
// 전년도까지의 윤년의 수를 구한다.
for($i = 0; $i < $year; $i++) {
if(isLeapYear($i)) $numOfLeapYear++;
}
// 전년도까지의 일 수를 구한다.
$toLastYearDaySum = ($year-1) * 365 + $numOfLeapYear;
// 올해의 현재 월까지의 일수 계산
$thisYearDaySum = 0;
// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
$endOfMonth = array(1 => 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
for($i = 1; $i < $month; $i++) {
$thisYearDaySum += $endOfMonth[$i];
}
// 윤년이고, 2월이 포함되어 있으면 1일을 증가시킨다.
if ($month > 2 && isLeapYear($year)) $thisYearDaySum++;
if(isLeapYear($year)) $endOfMonth[2] = 29;
if($day) {
$thisYearDaySum += $day;
return $toLastYearDaySum + $thisYearDaySum - 1;
} else {
return $endOfMonth[$month];
}
}
/*
* @brief 요일 구하기
*/
function getDayOfWeek($year, $month, $day) {
// 0~6의 값을 반환한다. 결과가 0이면 일요일이다.
return convertDatetoDay($year, $month, $day) % 7;
}
$start_week = getDayOfWeek($year, $month, 1);
$month_day = convertDatetoDay($year, $month);
$before_month_month_day = convertDatetoDay( $month == 1 ? $year - 1 : $year, $month == 1 ? 12 : $month - 1);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="ko" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="imagetoolbar" content="no" />
<title>Calendar</title>
<script type="text/javascript" src="../js/x.js"></script>
<script type="text/javascript" src="../js/common.js"></script>
<script type="text/javascript" src="../js/xml_handler.js"></script>
<link rel="stylesheet" href="../css/default.css" type="text/css" />
<link rel="stylesheet" href="../css/button.css" type="text/css" />
<link rel="stylesheet" href="../../modules/admin/tpl/css/admin.css" type="text/css" />
<link rel="stylesheet" href="./css/calendar.css" type="text/css" />
<script type="text/javascript">
function selectDate(date_str, date_val, callback_func) {
if(!opener) {
window.close();
return;
}
var date_obj = opener.xGetElementById("date_<?php echo $fo_id?>");
var str_obj = opener.xGetElementById("str_<?php echo $fo_id?>");
if(date_obj) date_obj.value = date_val;
if(str_obj) xInnerHtml(str_obj, date_str);
if(callback_func) eval('opener.'+callback_func+'('+date_val+')');
window.close();
}
</script>
</head>
<body>
<div id="popup_content" >
<div id="popHeadder">
<h3>Calendar</h3>
</div>
<form action="./calendar.php" method="get">
<input type="hidden" name="fo_id" value="<?php echo $fo_id?>"/>
<input type="hidden" name="callback_func" value="<?php echo $callback_func?>"/>
<div id="popBody">
<div class="calendar">
<div class="yymm">
<div class="yy">
<a href="./calendar.php?fo_id=<?php echo $fo_id?>&year=<?php echo $year?>&month=<?php echo $month?>&method=prev_year&callback_func=<?php echo $callback_func?>" class="left"><img src="./images/buttonLeft2.gif" alt="<?php echo $year - 1?>" width="11" height="11" /></a><?php echo $year?><a href="./calendar.php?fo_id=<?php echo $fo_id?>&year=<?php echo $year?>&month=<?php echo $month?>&method=next_year&callback_func=<?php echo $callback_func?>" class="right"><img src="./images/buttonRight2.gif" alt="<?php echo $year + 1?>" width="11" height="11" /></a>
</div>
<div class="mm">
<p><?php echo $monthLongName[$month]?></p>
<a href="./calendar.php?fo_id=<?php echo $fo_id?>&year=<?php echo $year?>&month=<?php echo $month?>&method=prev_month&callback_func=<?php echo $callback_func?>" class="left"><img src="./images/buttonLeft2.gif" alt="prev" width="11" height="11" /></a><span><?php echo $month?></span><a href="./calendar.php?fo_id=<?php echo $fo_id?>&year=<?php echo $year?>&month=<?php echo $month?>&method=next_month&callback_func=<?php echo $callback_func?>" class="right"><img src="./images/buttonRight2.gif" alt="next" width="11" height="11" /></a>
</div>
<div class="go">
<select name="year" class="selectTypeY" onchange="submit()">
<?php for($i = $max_year; $i >= $min_year; $i--):?>
<option value="<?php echo $i?>" <?php echo $year == $i? "selected":""?> class="<?php echo $i%10?($i%2?"select_color1":"select_color2"):"select_color10"?>"><?php echo $i?></option>
<?php endfor?>
</select>
<select name="month" class="selectTypeM" onchange="submit()">
<?php for($i = 1; $i <= 12; $i++):?>
<option value="<?php echo $i?>" <?php echo $month == $i? "selected":""?> class="<?php echo $i%2?"select_color1":"select_color2"?>"><?php echo sprintf("%02d",$i)?></option>
<?php endfor?>
</select>
</div>
<br /><br />
<center><a href="./calendar.php?fo_id=<?php echo $fo_id?>&callback_func=<?php echo $callback_func?>" class="button"><span>Go Today</span></a></center>
</div>
<table cellspacing="0" class="dd">
<tr>
<?php for($y = 0; $y < 7; $y++) {?>
<td class="<?php echo $y==0?"sun":($y==6?"sat":"")?>"><?php echo $dayName[$y]?></td>
<?php }?>
</tr>
<?php
//1주~6주
for($i = 0; $i < 6; $i++) {
?>
<tr class="<?php if($i == 0){?>first<?php }elseif($i == 5){?>last<?php }?>">
<?php
//요일
for($j = 0; $j < 7; $j++) {
$m = $month;
$y = $year;
$cell_no = $i * 7 + $j;
if($cell_no < $start_week) {
$day = $before_month_month_day + $cell_no - $start_week + 1;
$m = $month - 1;
if($m < 1) {
$m = 12;
$y = $year - 1;
}
} else {
$day = $cell_no - $start_week + 1;
$m = $month;
if($day > $month_day) {
$day = $day - $month_day;
$m = $month + 1;
if($m >12 ) {
$m = 1;
$y = $year - 1;
}
}
}
if($j == 0) $class_name = "sun";
elseif($j == 6) $class_name = "sat";
else $class_name= "";
$date = $y.". ".sprintf("%02d", $m).". ".sprintf("%02d", $day);
$date_str = $y.sprintf("%02d", $m).sprintf("%02d", $day);
?>
<td class="<?php echo $class_name?>" <?php if($day){?> onclick="selectDate('<?php echo $date?>','<?php echo $date_str?>','<?php echo $callback_func?>')"<?php }?>>
<?php if($m == $month){?><?php if(date("Ymd")==$date_str){?><strong><?php }?>
<?php if($day){?><?php echo $day?><?php }else{?>&nbsp;<?php }?>
<?php if(date("Ymd")==$date_str){?></strong><?php }?>
<?php }else{?>
<span class="disable"><?php if($day){?><?php echo $day?><?php }else{?>&nbsp;<?php }?></span>
<?php }?>
</td>
<?php
}
?>
</tr>
<?php
}
?>
</table>
</div>
</div>
</form>
<div id="popFooter" class="tCenter">
<a href="#" onclick="window.close();" class="button"><span>close</span></a>
</div>
</div>
<script type="text/javascript">
xAddEventListener(window,'load', setFixedPopupSize);
var _isPoped = true;
</script>
</body>
</html>

View file

@ -64,8 +64,13 @@
</head>
<body>
{$zbxe_final_content}
{Context::getHtmlFooter()}
<div id="waitingforserverresponse"></div>
{Context::getBodyHeader()}
{$zbxe_final_content}
{Context::getHtmlFooter()}
<div id="waitingforserverresponse"></div>
</body>
</html>

View file

@ -1,38 +0,0 @@
@charset "utf-8";
body { margin:0; padding:0; }
#popup_content { width:500px; overflow:hidden;}
#popHeadder { width:500px; }
#popBody { width:480px; }
#popFooter { width:500px; }
#popBody .calendar { width:480px; 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.5em 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:0px 15px; text-align:center; border-top:1px solid #ffffff; display:inline;}
#popBody .calendar .yymm .go * { vertical-align:middle;}
#popBody .calendar .yymm .go .selectTypeY { width:60px;}
#popBody .calendar .yymm .go .selectTypeM { width:45px;}
#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:337px; background:#ffffff; border-left:10px solid #ffffff;}
#popBody .calendar .dd td { border-bottom:1px solid #ededed; height:40px; text-align:center; color:#636363; font:1em Tahoma; cursor:pointer; width:14%;}
#popBody .calendar .dd td:hover { background:#eeeeee;}
#popBody .calendar .dd td strong { text-decoration:underline;}
#popBody .calendar .dd td.sun { color:#c95b53;}
#popBody .calendar .dd td.sat { color:#5378C9;}
#popBody .calendar .dd .first { height:35px;}
#popBody .calendar .dd .last td { height:35px; border-bottom:none;}
#popBody .calendar .dd td .disable { color:#CCCCCC; }
#popBody .calendar .select_color1 {background:#ffffff;color:#000000;}
#popBody .calendar .select_color2 {background:#eeeeee;color:#000000;}
#popBody .calendar .select_color10 {background:#ffff00;color:#000000;}

BIN
common/tpl/images/buttonSet.gif Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View file

@ -1,7 +1,11 @@
<!--%import("css/popup.css")-->
<!--%import("../../modules/admin/tpl/css/admin.css")-->
<div id="popup_content">{$content}</div>
<!--%import("../../modules/admin/tpl/css/pagination.css")-->
<div id="xeAdmin">
<div id="popup_content">
{$content}
<button class="xButton" type="button" onclick="window.close();return false;"><span>{$lang->cmd_close}</span></button>
</div>
</div>
<script type="text/javascript">
xAddEventListener(window, 'load', setFixedPopupSize);
var _isPoped = true;

View file

@ -22,6 +22,16 @@
/**
* @brief 기본 설정에 우선하는 사용자 설정 파일
* config/config.user.inc.php 파일에 아래 내용을 저장하면
* <?php
* define('__DEBUG__', 0);
* define('__DEBUG_OUTPUT__', 0);
* define('__DEBUG_PROTECT__', 1);
* define('__DEBUG_PROTECT_IP__', '127.0.0.1');
* define('__DEBUG_DB_OUTPUT__', 0);
* define('__LOG_SLOW_QUERY__', 0);
* define('__OB_GZHANDLER_ENABLE__', 1);
* ?>
*/
if(file_exists(_XE_PATH_.'config/config.user.inc.php')) {
require _XE_PATH_.'config/config.user.inc.php';
@ -75,8 +85,6 @@
**/
if(!defined('__OB_GZHANDLER_ENABLE__')) define('__OB_GZHANDLER_ENABLE__', 1);
/**
* @brief Firebug 콘솔 출력 사용시 관련 파일 require
**/
@ -98,8 +106,10 @@
**/
if(__DEBUG__) define('__ClassLoadStartTime__', getMicroTime());
require_once(_XE_PATH_.'classes/object/Object.class.php');
require_once(_XE_PATH_.'classes/extravar/Extravar.class.php');
require_once(_XE_PATH_.'classes/handler/Handler.class.php');
require_once(_XE_PATH_.'classes/xml/XmlParser.class.php');
require_once(_XE_PATH_.'classes/xml/XmlJsFilter.class.php');
require_once(_XE_PATH_.'classes/context/Context.class.php');
require_once(_XE_PATH_.'classes/db/DB.class.php');
require_once(_XE_PATH_.'classes/file/FileHandler.class.php');
@ -110,5 +120,6 @@
require_once(_XE_PATH_.'classes/display/DisplayHandler.class.php');
require_once(_XE_PATH_.'classes/template/TemplateHandler.class.php');
require_once(_XE_PATH_.'classes/mail/Mail.class.php');
require_once(_XE_PATH_.'classes/page/PageHandler.class.php');
if(__DEBUG__) $GLOBALS['__elapsed_class_load__'] = getMicroTime() - __ClassLoadStartTime__;
?>

View file

@ -262,7 +262,12 @@
if($c<128) {
$char_width += (int)$chars[$c-32];
$idx++;
} else {
}
else if (191<$c && $c < 224) {
$char_width += $chars[4];
$idx += 2;
}
else {
$char_width += $chars[0];
$idx += 3;
}
@ -533,6 +538,9 @@
if(preg_match('/(src|href|lowsrc|dynsrc)=("|\'?)([\r\n]*)(vbscript|javascript)/is', $matches[2])) {
$attrs = preg_replace('/(src|href|lowsrc|dynsrc)=("|\'?)([\r\n]*)(vbscript|javascript)/is','$1=$2_$4', $attrs);
}
if(preg_match('/(url)[ \n]*\(("|\'?)([\r\n]*)(vbscript|javascript)/is', $matches[2])) {
$attrs = preg_replace('/(url)[ \n]*\(("|\'?)([\r\n]*)(vbscript|javascript)/is','$1($2_$4', $attrs);
}
// 이벤트 제거
// 전제 : 1. 이벤트명 앞에는 개행(r, n, rn)문자와 공백 문자만 올 수 있음

View file

@ -11,12 +11,8 @@
* @section intro 소개
* XE 오픈 프로젝트로 개발되는 오픈 소스입니다.\n
* 자세한 내용은 아래 링크를 참조하세요.
* - 공식홈페이지 : http://www.zeroboard.com
* - XE 포럼 : http://www.zeroboard.com/forum_main
* - 이슈트래킹 : http://trac.zeroboard.com
* - SVN Repository : http://svn.zeroboard.com/zeroboard_xe/trunk
* - document : http://doc.zeroboard.com
* - pdf 문서 : http://doc.zeroboard.com/zeroboard_xe.pdf
* - 공식홈페이지 : http://www.xpressengine.com
* - SVN Repository : http://svn.xpressengine.com/trunk
* \n
* "XpressEngine (XE)" 자유 소프트웨어입니다. \n
* 소프트웨어의 피양도자는 자유 소프트웨어 재단이 공표한 GNU 일반 공중 사용 허가서 2 또는 \n
@ -48,6 +44,11 @@
$oContext = &Context::getInstance();
$oContext->init();
/**
* @brief SSO 인증 확인이 불필요할때 모듈 동작
**/
if($oContext->checkSSO()) {
/**
* @brief ModuleHandler 객체를 생성/ 실행
*
@ -63,5 +64,7 @@
$oModuleHandler->displayContent($oModule);
}
}
$oContext->close();
?>

View file

@ -0,0 +1,121 @@
<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.2">
<title xml:lang="ko">XE Cafe 공식 레이아웃</title>
<title xml:lang="zh-CN">官方站点模块布局</title>
<title xml:lang="zh-TW">虛擬網站官網版面</title>
<description xml:lang="ko">
XE Cafe 공식 레이아웃입니다.
</description>
<description xml:lang="zh-CN">
官方站点模块布局。
</description>
<description xml:lang="zh-TW">
虛擬網站官網版面。
</description>
<version>0.1</version>
<date>2009-02-09</date>
<link>http://www.xpressengine.com</link>
<author email_address="webmaster@xpressengine.com" link="http://www.xpressengine.com">
<name xml:lang="ko">XpressEngine</name>
<name xml:lang="zh-CN">XpressEngine</name>
<name xml:lang="zh-TW">XpressEngine</name>
</author>
<extra_vars>
<group>
<title xml:lang="ko">기본 설정</title>
<title xml:lang="zh-CN">常规选项</title>
<title xml:lang="zh-TW">預設</title>
<var name="colorset" type="select">
<title xml:lang="ko">컬러셋</title>
<title xml:lang="zh-CN">颜色</title>
<title xml:lang="zh-TW">顏色設定</title>
<description xml:lang="ko">원하시는 컬러셋을 선택해주세요.</description>
<description xml:lang="zh-CN">请选择颜色。</description>
<description xml:lang="zh-TW">請選擇顏色。</description>
<options value="white">
<title xml:lang="ko">하얀색</title>
<title xml:lang="zh-CN">白色</title>
<title xml:lang="zh-TW">白色</title>
</options>
<options value="black">
<title xml:lang="ko">검은색</title>
<title xml:lang="zh-CN">黑色</title>
<title xml:lang="zh-TW">黑色</title>
</options>
</var>
<var name="index_url" type="text">
<title xml:lang="ko">홈 페이지 URL</title>
<title xml:lang="zh-CN">站点地址</title>
<title xml:lang="zh-TW">主頁網址</title>
<description xml:lang="ko">로고를 클릭시에 이동할 홈 페이지 URL을 입력해 주세요.</description>
<description xml:lang="zh-CN">点击LOGO时要移动的页面地址。</description>
<description xml:lang="zh-TW">請輸入當用戶按了網站Logo後要前往的頁面網址。</description>
</var>
<var name="logo_text" type="text">
<title xml:lang="ko">로고 글자</title>
<title xml:lang="zh-CN">站点标题</title>
<title xml:lang="zh-TW">Logo文字</title>
<description xml:lang="ko">좌측 상단의 로고 부분에 글자를 지정할 수 있습니다. 로고 이미지가 있으면 로고 이미지의 caption으로 표시됩니다.</description>
<description xml:lang="zh-CN">将显示在您的站点左侧头部如你已上传lOGO图片此标题将变成LOGO图片的caption。</description>
<description xml:lang="zh-TW">將顯示在虛擬網站的左上方如果有上傳過Logo圖片將會以圖片顯示。</description>
</var>
<var name="logo_image" type="image">
<title xml:lang="ko">로고이미지</title>
<title xml:lang="zh-CN">LOGO图片</title>
<title xml:lang="zh-TW">Logo圖片</title>
<description xml:lang="ko">레이아웃의 상단에 표시될 로고이미지를 입력하세요.</description>
<description xml:lang="zh-CN">上传LOGO图片。</description>
<description xml:lang="zh-TW">請輸入要顯示在版面上端的Logo圖片。(適當高度為23px的透明圖片。)</description>
</var>
<var name="logo_background_image" type="image">
<title xml:lang="ko">로고 배경 이미지</title>
<title xml:lang="zh-CN">布局头部背景图片</title>
<title xml:lang="zh-TW">Logo背景圖片</title>
<description xml:lang="ko">로고가 있는 상단 영역의 배경 이미지를 적용하시려면 이미지를 등록해주세요.</description>
<description xml:lang="zh-CN">上传LOGO所在位头部背景图片。</description>
<description xml:lang="zh-TW">請在這裡上傳想要使用的背景圖片。</description>
</var>
<var name="content_background_image" type="image">
<title xml:lang="ko">내용 배경 이미지</title>
<title xml:lang="zh-CN">内容区背景图片</title>
<title xml:lang="zh-TW">內容背景圖片</title>
<description xml:lang="ko">내용이 있는 영역의 배경 이미지를 사용하시려면 이미지를 등록해주세요.</description>
<description xml:lang="zh-CN">上传内容区背景图片。</description>
<description xml:lang="zh-TW">請在這裡上傳想要使用的背景圖片。</description>
</var>
</group>
<group>
<title xml:lang="ko">모양 설정</title>
<title xml:lang="zh-CN">样式设置</title>
<title xml:lang="zh-TW">外觀設定</title>
<var name="content_position" type="select">
<title xml:lang="ko">본문 위치</title>
<title xml:lang="zh-CN">内容区位置</title>
<title xml:lang="zh-TW">選擇位置</title>
<description xml:lang="ko">본문의 위치를 좌/우중 선택할 수 있습니다.</description>
<description xml:lang="zh-CN">可以设置内容区的位置(左侧/右侧)。</description>
<description xml:lang="zh-TW">內容區域可選擇靠左側或右側。</description>
<options value="left">
<title xml:lang="ko">왼쪽</title>
<title xml:lang="zh-CN">左侧</title>
<title xml:lang="zh-TW">左側</title>
</options>
<options value="right">
<title xml:lang="ko">오른쪽</title>
<title xml:lang="zh-CN">右侧</title>
<title xml:lang="zh-TW">右側</title>
</options>
</var>
</group>
</extra_vars>
<menus>
<menu name="main_menu" maxdepth="5" default="true">
<title xml:lang="ko">메인 메뉴</title>
<title xml:lang="zh-CN">主菜单</title>
<title xml:lang="zh-TW">主選單</title>
</menu>
</menus>
</layout>

182
layouts/cafeXE/css/layout.css Executable file
View file

@ -0,0 +1,182 @@
@charset "utf-8";
/* NHN > UIT Center > Open UI Technology Team > Jeong Chan Myeong(dece24@nhncorp.com) */
/* You'd better not fix : 이 파일 수정을 권장 안함 */
/* Skip To Content */
a.skipToContent{ display:block; position:relative; top:0; clear:both; overflow:hidden; height:0; text-decoration:none;}
a.skipToContent:hover,
a.skipToContent:active,
a.skipToContent:focus{ height:auto; margin:0 0 10px 0; padding:5px;}
/* Hr */
hr.cafeXeHr{ display:none; position:absolute;}
/* Container + Header + Body + Footer */
#cafeXeContainer{ position:relative; margin:0 20px; *zoom:1;}
#cafeXeHeader{ position:relative; padding:20px 0 10px; border-bottom:3px solid; *zoom:1; z-index:100;}
#cafeXeHeader:after{ content:""; display:block; clear:both;}
#cafeXeBody{ position:relative; padding-top:20px; padding-bottom:20px; *zoom:1;}
#cafeXeBody:after{ content:""; display:block; clear:both;}
#cafeXeContent{ position:relative; margin-bottom:20px; text-align:justify;}
#cafeXeFooter{ position:relative; padding:10px 0; border-top:1px solid; *zoom:1; z-index:100;}
#cafeXeFooter address{ text-align:center;}
/* Layout Width */
.cafeXeFixed #cafeXeContainer{ width:960px; margin-left:auto; margin-right:auto;}
.cafeXeLiquid #cafeXeContainer{ width:80%; margin-left:auto; margin-right:auto;}
.cafeXeHybrid #cafeXeContainer{ width:80%; margin-left:auto; margin-right:auto;}
/* Align Layout */
.aLeft #cafeXeContainer{ margin-left:0;}
.aRight #cafeXeContainer{ margin-right:0;}
/* Top Navigation */
#cafeXeHeader .cafeXeNavigation{ position:relative; padding:15px 0 0 0; margin:0; overflow:hidden; float:right;}
#cafeXeHeader .cafeXeNavigation:after{ content:""; display:block; clear:both;}
#cafeXeHeader .cafeXeNavigation *{ margin:0; padding:0;}
#cafeXeHeader .cafeXeNavigation h2{ display:none;}
#cafeXeHeader .cafeXeNavigation li{ position:relative; float:left; list-style:none; padding:0 5px;}
/* Footer Navigation */
#cafeXeFooter .cafeXeNavigation{ position:relative; padding:0; margin:0 0 10px 0;}
#cafeXeFooter .cafeXeNavigation:after{ content:""; display:block; clear:both;}
#cafeXeFooter .cafeXeNavigation *{ margin:0; padding:0;}
#cafeXeFooter .cafeXeNavigation h2{ display:none;}
#cafeXeFooter .cafeXeNavigation .cafeXeSection{ text-align:center;}
#cafeXeFooter .cafeXeNavigation ul{ position:relative; overflow:hidden;}
#cafeXeFooter .cafeXeNavigation li{ display:inline; position:relative; list-style:none; padding:0 5px;}
/* Neck */
#neck{ position:relative; clear:both; *zoom:1;}
#neck .cafeXeExtension{ margin-right:-30px; *zoom:1;}
#neck .cafeXeExtension:after{ content:""; display:block; clear:both;}
#neck .cafeXeExtension .cafeXeSection{ position:relative; float:left; width:300px; margin-right:30px;}
.cafeXeLiquid #neck .cafeXeExtension .cafeXeSection{ width:30%; margin-right:3.3%;}
/* Knee */
#cafeXeKnee{ position:relative; clear:both; *zoom:1;}
#cafeXeKnee{ padding-top:30px; border-top:1px solid;}
#cafeXeKnee .cafeXeExtension{ margin-right:-30px; *zoom:1;}
#cafeXeKnee .cafeXeExtension:after{ content:""; display:block; clear:both;}
#cafeXeKnee .cafeXeExtension .cafeXeSection{ position:relative; float:left; width:300px; margin-right:30px;}
.cafeXeLiquid #cafeXeKnee .cafeXeExtension .cafeXeSection{ width:30%; margin-right:3.3%;}
/* Extension */
.cafeXeExtension,
.cafeXeSection{position:relative; *zoom:1;}
#cafeXeBody .cafeXeExtension{ position:relative; display:none; margin-bottom:20px;}
.cafeXeExtension .cafeXeSection{ margin-bottom:20px;}
/* ----- Fixed 2 Column Layout ----- */
.cafeXeFixed .cafeXeCE #cafeXeBody .cafeXeE1,
.cafeXeFixed .cafeXeEC #cafeXeBody .cafeXeE1{ width:220px;}
.cafeXeFixed .cafeXeCE #cafeXeBody #cafeXeContent,
.cafeXeFixed .cafeXeEC #cafeXeBody #cafeXeContent{ width:720px;}
.cafeXeFixed .cafeXeCE #cafeXeBody #cafeXeContent{ float:left;}
.cafeXeFixed .cafeXeEC #cafeXeBody #cafeXeContent{ float:right;}
.cafeXeFixed .cafeXeCE #cafeXeBody .cafeXeE1,
.cafeXeFixed .cafeXeEC #cafeXeBody .cafeXeE1{ display:block;}
.cafeXeFixed .cafeXeCE #cafeXeBody .cafeXeE1{ float:right; clear:right;}
.cafeXeFixed .cafeXeEC #cafeXeBody .cafeXeE1{ float:left; clear:left;}
/* ----- Liquid 2 Column Layout ----- */
.cafeXeLiquid .cafeXeCE #cafeXeBody .cafeXeE1,
.cafeXeLiquid .cafeXeEC #cafeXeBody .cafeXeE1{ width:23%;}
.cafeXeLiquid .cafeXeCE #cafeXeBody #cafeXeContent,
.cafeXeLiquid .cafeXeEC #cafeXeBody #cafeXeContent{ width:75%;}
.cafeXeLiquid .cafeXeCE #cafeXeBody #cafeXeContent{ float:left;}
.cafeXeLiquid .cafeXeEC #cafeXeBody #cafeXeContent{ float:right;}
.cafeXeLiquid .cafeXeCE #cafeXeBody .cafeXeE1,
.cafeXeLiquid .cafeXeEC #cafeXeBody .cafeXeE1{ display:block;}
.cafeXeLiquid .cafeXeCE #cafeXeBody .cafeXeE1{ float:right; clear:right;}
.cafeXeLiquid .cafeXeEC #cafeXeBody .cafeXeE1{ float:left; clear:left;}
/* ----- Hybrid 2 Column Layout ----- */
.cafeXeHybrid .cafeXeCE #cafeXeBody{ padding-right:280px;}
.cafeXeHybrid .cafeXeEC #cafeXeBody{ padding-left:280px;}
.cafeXeHybrid .cafeXeCE #cafeXeBody .cafeXeE1,
.cafeXeHybrid .cafeXeEC #cafeXeBody .cafeXeE1{ width:260px;}
.cafeXeHybrid .cafeXeCE #cafeXeBody #cafeXeContent{ float:left; width:100%;}
.cafeXeHybrid .cafeXeEC #cafeXeBody #cafeXeContent{ float:right; width:100%;}
.cafeXeHybrid .cafeXeCE #cafeXeBody .cafeXeE1,
.cafeXeHybrid .cafeXeEC #cafeXeBody .cafeXeE1{ display:block;}
.cafeXeHybrid .cafeXeCE #cafeXeBody .cafeXeE1{ float:right; clear:right; margin-left:-260px; right:-280px;}
.cafeXeHybrid .cafeXeEC #cafeXeBody .cafeXeE1{ float:left; clear:left; margin-right:-260px; left:-280px;}
/* ----- Fixed 3 Column Layout ----- */
.cafeXeFixed .cafeXeCEE #cafeXeBody .cafeXeE1,
.cafeXeFixed .cafeXeCEE #cafeXeBody .cafeXeE2,
.cafeXeFixed .cafeXeECE #cafeXeBody .cafeXeE1,
.cafeXeFixed .cafeXeECE #cafeXeBody .cafeXeE2,
.cafeXeFixed .cafeXeEEC #cafeXeBody .cafeXeE1,
.cafeXeFixed .cafeXeEEC #cafeXeBody .cafeXeE2{ display:block; width:200px;}
.cafeXeFixed .cafeXeCEE #cafeXeBody #cafeXeContent,
.cafeXeFixed .cafeXeECE #cafeXeBody #cafeXeContent,
.cafeXeFixed .cafeXeEEC #cafeXeBody #cafeXeContent{ width:520px;}
.cafeXeFixed .cafeXeCEE #cafeXeBody #cafeXeContent{ float:left; margin-right:20px;}
.cafeXeFixed .cafeXeECE #cafeXeBody #cafeXeContent{ float:left; margin-right:-100%; left:220px;}
.cafeXeFixed .cafeXeEEC #cafeXeBody #cafeXeContent{ float:right;}
.cafeXeFixed .cafeXeECE #cafeXeBody .cafeXeE1,
.cafeXeFixed .cafeXeEEC #cafeXeBody .cafeXeE1{ float:left; margin-right:20px;}
.cafeXeFixed .cafeXeCEE #cafeXeBody .cafeXeE1,
.cafeXeFixed .cafeXeEEC #cafeXeBody .cafeXeE2{ float:left;}
.cafeXeFixed .cafeXeCEE #cafeXeBody .cafeXeE2,
.cafeXeFixed .cafeXeECE #cafeXeBody .cafeXeE2{ float:right;}
/* ----- Liquid 3 Column Layout ----- */
.cafeXeLiquid .cafeXeCEE #cafeXeBody .cafeXeE1,
.cafeXeLiquid .cafeXeCEE #cafeXeBody .cafeXeE2,
.cafeXeLiquid .cafeXeECE #cafeXeBody .cafeXeE1,
.cafeXeLiquid .cafeXeECE #cafeXeBody .cafeXeE2,
.cafeXeLiquid .cafeXeEEC #cafeXeBody .cafeXeE1,
.cafeXeLiquid .cafeXeEEC #cafeXeBody .cafeXeE2{ display:block; width:20%;}
.cafeXeLiquid .cafeXeCEE #cafeXeBody #cafeXeContent,
.cafeXeLiquid .cafeXeECE #cafeXeBody #cafeXeContent,
.cafeXeLiquid .cafeXeEEC #cafeXeBody #cafeXeContent{ width:56%;}
.cafeXeLiquid .cafeXeCEE #cafeXeBody #cafeXeContent{ float:left; margin-right:2%;}
.cafeXeLiquid .cafeXeECE #cafeXeBody #cafeXeContent{ float:left; margin-right:-100%; left:22%;}
.cafeXeLiquid .cafeXeEEC #cafeXeBody #cafeXeContent{ float:right;}
.cafeXeLiquid .cafeXeECE #cafeXeBody .cafeXeE1,
.cafeXeLiquid .cafeXeEEC #cafeXeBody .cafeXeE1{ float:left; margin-right:2%;}
.cafeXeLiquid .cafeXeCEE #cafeXeBody .cafeXeE1,
.cafeXeLiquid .cafeXeEEC #cafeXeBody .cafeXeE2{ float:left;}
.cafeXeLiquid .cafeXeCEE #cafeXeBody .cafeXeE2,
.cafeXeLiquid .cafeXeECE #cafeXeBody .cafeXeE2{ float:right;}
/* ----- Hybrid 3 Column Layout ----- */
.cafeXeHybrid .cafeXeCEE #cafeXeBody .cafeXeE1,
.cafeXeHybrid .cafeXeCEE #cafeXeBody .cafeXeE2,
.cafeXeHybrid .cafeXeECE #cafeXeBody .cafeXeE1,
.cafeXeHybrid .cafeXeECE #cafeXeBody .cafeXeE2,
.cafeXeHybrid .cafeXeEEC #cafeXeBody .cafeXeE1,
.cafeXeHybrid .cafeXeEEC #cafeXeBody .cafeXeE2{ display:block; width:220px;}
.cafeXeHybrid .cafeXeCEE #cafeXeBody{ padding-right:480px;}
.cafeXeHybrid .cafeXeECE #cafeXeBody{ padding-left:240px; padding-right:240px;}
.cafeXeHybrid .cafeXeEEC #cafeXeBody{ padding-left:480px;}
.cafeXeHybrid .cafeXeCEE #cafeXeBody #cafeXeContent,
.cafeXeHybrid .cafeXeECE #cafeXeBody #cafeXeContent,
.cafeXeHybrid .cafeXeEEC #cafeXeBody #cafeXeContent{ width:100%;}
.cafeXeHybrid .cafeXeCEE #cafeXeBody #cafeXeContent,
.cafeXeHybrid .cafeXeECE #cafeXeBody #cafeXeContent{ float:left; margin-right:-100%;}
.cafeXeHybrid .cafeXeEEC #cafeXeBody #cafeXeContent{ float:right;}
.cafeXeHybrid .cafeXeECE #cafeXeBody .cafeXeE1,
.cafeXeHybrid .cafeXeEEC #cafeXeBody .cafeXeE2{ float:left; left:-240px; margin-right:-220px;}
.cafeXeHybrid .cafeXeEEC #cafeXeBody .cafeXeE1{ float:left; left:-480px; margin-right:-220px;}
.cafeXeHybrid .cafeXeCEE #cafeXeBody .cafeXeE1,
.cafeXeHybrid .cafeXeECE #cafeXeBody .cafeXeE2{ float:right; left:240px; margin-left:-220px;}
.cafeXeHybrid .cafeXeCEE #cafeXeBody .cafeXeE2{ float:right; left:480px; margin-left:-220px;}

View file

@ -0,0 +1,20 @@
@charset "utf-8";
/* NHN > UIT Center > Open UI Technology Team > Jeong Chan Myeong(dece24@nhncorp.com) */
/* Body */
.cafeXe{ background:#000;}
/* Heading */
#cafeXeHeader a{ color:#999;}
#cafeXeHeader h1.cafeXeH1 a{ color:#fff;}
#cafeXeBody h2.cafeXeBodyH2{ color:#999; border-color:#999;}
#cafeXeBody h2.cafeXeExtensionH2{ color:#999; border-color:#999;}
#cafeXeKnee h2.cafeXeExtensionH2{ color:#ccc; border-color:#434343;}
/* Layout */
#cafeXeHeader,
#cafeXeKnee,
#cafeXeFooter{ background:#333; color:#666;}
/* Footer */
.cafeXeAddress abbr{ color:#fff;}

View file

@ -0,0 +1,70 @@
@charset "utf-8";
/* NHN > UIT Center > Open UI Technology Team > Jeong Chan Myeong(dece24@nhncorp.com) */
/* Common */
.cafeXe{ margin:0; font-family:AppleGothic, Sans-serif;}
.cafeXe a{ text-decoration:none;}
.cafeXe a:hover,
.cafeXe a:active,
.cafeXe a:focus{ text-decoration:underline;}
.cafeXe img{ border:0;}
.cafeXe sup,
.cafeXe sub{ line-height:1;}
.cafeXeAddress{ font-style:normal;}
/* Heading */
#cafeXeBody h2.cafeXeBodyH2{ margin:0; padding-bottom:5px; font-size:16px; border-bottom:2px solid;}
#cafeXeBody h2.cafeXeExtensionH2{ margin:0; padding-bottom:5px; font-size:16px; border-bottom:2px solid;}
#cafeXeKnee h2.cafeXeExtensionH2{ position:relative; margin:0; font-size:12px; padding-bottom:5px; border-bottom:2px solid;}
/* Container */
.cafeXeFixed #cafeXeContainer{ width:auto;}
/* Header */
.cafeXeFixed .cafeXeEC #cafeXeHeader,
.cafeXeFixed .cafeXeCE #cafeXeHeader{ border:0; padding:20px 0 0 0;}
.cafeXeFixed .cafeXeEC #cafeXeHeader .cafeXeHeader,
.cafeXeFixed .cafeXeCE #cafeXeHeader .cafeXeHeader{ position:relative; width:960px; margin:0 auto; padding-bottom:30px;}
.cafeXeFixed .cafeXeEC #cafeXeHeader h1.cafeXeH1,
.cafeXeFixed .cafeXeCE #cafeXeHeader h1.cafeXeH1{ margin:0;}
.cafeXeFixed .cafeXeEC #cafeXeHeader h1.cafeXeH1 a,
.cafeXeFixed .cafeXeCE #cafeXeHeader h1.cafeXeH1 a{ text-decoration:none;}
.cafeXeFixed .cafeXeEC #cafeXeHeader .cafeXeUrl,
.cafeXeFixed .cafeXeCE #cafeXeHeader .cafeXeUrl{ margin:0;}
.cafeXeFixed .cafeXeEC #cafeXeHeader .cafeXeUrl a,
.cafeXeFixed .cafeXeCE #cafeXeHeader .cafeXeUrl a{ font:10px Tahoma;}
/* Body */
.cafeXeFixed .cafeXeEC #cafeXeBody,
.cafeXeFixed .cafeXeCE #cafeXeBody{ width:740px; margin:0 auto; padding-top:40px;}
.cafeXeFixed .cafeXeEC #cafeXeBody{ padding-left:220px;}
.cafeXeFixed .cafeXeCE #cafeXeBody{ padding-right:220px;}
.cafeXeFixed .cafeXeEC #cafeXeBody .cafeXeE1,
.cafeXeFixed .cafeXeCE #cafeXeBody .cafeXeE1{ width:180px;}
.cafeXeFixed .cafeXeEC #cafeXeBody .cafeXeE1{ left:-220px; margin-right:-180px;}
.cafeXeFixed .cafeXeCE #cafeXeBody .cafeXeE1{ right:-220px; margin-left:-180px;}
.cafeXeFixed .cafeXeEC #cafeXeBody #cafeXeContent,
.cafeXeFixed .cafeXeCE #cafeXeBody #cafeXeContent{ width:100%;}
.cafeXeFixed .cafeXeEC #cafeXeBody #cafeXeContent .cafeXeSection,
.cafeXeFixed .cafeXeCE #cafeXeBody #cafeXeContent .cafeXeSection{ margin-bottom:40px; *zoom:1;}
/* Knee */
.cafeXeFixed .cafeXeEC #cafeXeKnee,
.cafeXeFixed .cafeXeCE #cafeXeKnee{ padding:30px 0; border:0;}
.cafeXeFixed .cafeXeEC #cafeXeKnee .cafeXeExtension,
.cafeXeFixed .cafeXeCE #cafeXeKnee .cafeXeExtension{ left:14px; _left:28px; width:988px; margin:0 auto;}
.cafeXeFixed .cafeXeEC #cafeXeKnee .cafeXeExtension .cafeXeSection,
.cafeXeFixed .cafeXeCE #cafeXeKnee .cafeXeExtension .cafeXeSection{ width:219px; margin-right:28px;}
/* Footer */
.cafeXeFixed .cafeXeEC #cafeXeFooter,
.cafeXeFixed .cafeXeCE #cafeXeFooter{ padding:30px 0; border:0;}
.cafeXeFixed .cafeXeEC #cafeXeFooter .cafeXeFooter,
.cafeXeFixed .cafeXeCE #cafeXeFooter .cafeXeFooter{ position:relative; width:960px; margin:0 auto; *zoom:1; font:10px Tahoma;}
.cafeXeFixed .cafeXeEC #cafeXeFooter .cafeXeFooter a,
.cafeXeFixed .cafeXeCE #cafeXeFooter .cafeXeFooter a{ text-decoration:none;}
.cafeXeFixed .cafeXeEC #cafeXeFooter .cafeXeFooter:after,
.cafeXeFixed .cafeXeCE #cafeXeFooter .cafeXeFooter:after{ content:""; display:block; clear:both;}
.cafeXeFixed .cafeXeEC #cafeXeFooter .cafeXeFooter address,
.cafeXeFixed .cafeXeCE #cafeXeFooter .cafeXeFooter address{ float:left;}

View file

@ -0,0 +1,20 @@
@charset "utf-8";
/* NHN > UIT Center > Open UI Technology Team > Jeong Chan Myeong(dece24@nhncorp.com) */
/* Body */
.cafeXe{ background:#fff;}
/* Heading */
#cafeXeHeader a{ color:#999;}
#cafeXeHeader h1.cafeXeH1 a{ color:#fff;}
#cafeXeBody h2.cafeXeBodyH2{ color:#333; border-color:#666;}
#cafeXeBody h2.cafeXeExtensionH2{ color:#333; border-color:#666;}
#cafeXeKnee h2.cafeXeExtensionH2{ color:#ccc; border-color:#434343;}
/* Layout */
#cafeXeHeader,
#cafeXeKnee,
#cafeXeFooter{ background:#333; color:#666;}
/* Footer */
.cafeXeAddress abbr{ color:#fff;}

368
layouts/cafeXE/css/widget.css Executable file
View file

@ -0,0 +1,368 @@
@charset "utf-8";
/* NHN > UIT Center > Open UI Technology Team > Jeong Chan Myeong(dece24@nhncorp.com) */
/* common */
.open{ display:block !important;}
.floatLeft{ float:left;}
.floatRight{ float:right;}
.clearLeft{ clear:left;}
.clearRight{ clear:right;}
.widgetXeInputText{ border:1px solid; padding:2px 5px; font-size:12px;}
.widgetXeInputCheck{ margin:0; width:13px; height:13px; vertical-align:middle;}
.widgetXeInputSubmit{ padding:0;}
.widgetXeAddress{ font-style:normal;}
/* widgetContainer */
.widgetContainer a{ text-decoration:none;}
.widgetContainer a:hover,
.widgetContainer a:active,
.widgetContainer a:focus{ text-decoration:underline;}
.widgetContainer img{ border:0;}
.widgetContainer sup{ position:relative; line-height:1; display:inline-block; margin:-5px 0; *padding:0 1px;}
.widgetContainer form{ margin:0; padding:0;}
.widgetContainer fieldset{ border:0; margin:0; padding:0;}
/* widgetDivider */
dl.widgetDivider{ margin:0;}
dl.widgetDivider dt{ position:absolute; width:0; height:0; overflow:hidden; font-size:0; line-height:0;}
dl.widgetDivider dd{ display:none; margin:0;}
/* widgetTableA */
.widgetTableA { width:100%; font-size:12px; position:relative; border:0;}
.widgetTableA td{ border:0; line-height:1.5; white-space:nowrap; vertical-align:top; padding:1px 5px 1px 5px;}
.widgetTableA td.title{ width:100%; white-space:normal;}
.widgetTableA td .board{ padding-right:5px;}
.widgetTableA td .notice{ padding-right:5px;}
.widgetTableA td .category{ padding-right:5px; font-weight:normal;}
.widgetTableA td .replyNum a{ font:10px Tahoma;}
.widgetTableA td .trackbackNum a{ font:10px Tahoma;}
.widgetTableA td.author{}
.widgetTableA td.time{ font-size:11px; font-family:Tahoma;}
/* widgetTableB */
.widgetTableB { width:100%; font-size:12px; position:relative; border:0; border-top:1px solid;}
.widgetTableB td{ border:0; line-height:1.5; white-space:nowrap; vertical-align:top; padding:8px 5px 6px 5px; border-bottom:1px solid;}
.widgetTableB td.title{ width:100%; white-space:normal;}
.widgetTableB td .board{ padding-right:5px;}
.widgetTableB td .notice{ padding-right:5px;}
.widgetTableB td .category{ padding-right:5px; font-weight:normal;}
.widgetTableB td .replyNum a{ font:10px Tahoma;}
.widgetTableB td .trackbackNum a{ font:10px Tahoma;}
.widgetTableB td.author{}
.widgetTableB td.time{ font-size:11px; font-family:Tahoma;}
/* widgetTableC */
.widgetTableC { width:100%; font-size:12px; position:relative; border:0; border-top:1px solid;}
.widgetTableC td{ border:0; line-height:1.5; white-space:nowrap; vertical-align:top; padding:10px; border-bottom:1px solid;}
.widgetTableC td.title,
.widgetTableC td.lastDoc{ width:100%; white-space:nowrap;}
.widgetTableC td.docNum{}
.widgetTableC td.docNum em{ display:block; padding:12px 0 0 5px; width:50px; height:21px; font-size:11px; font-weight:bold; font-style:normal; font-family:Tahoma; color:#fff; background:url(../img/white/iconForumNum.gif) no-repeat 0 0;}
.widgetTableC td.title a{ font-weight:bold; text-decoration:underline !important;}
.widgetTableC td.title dl{ margin:0;}
.widgetTableC td.title dd{ margin:0;}
.widgetTableC td.lastDoc p{ margin:0;}
.widgetTableC td .author{ margin-right:5px;}
.widgetTableC td .time{ font-size:11px; font-family:Tahoma;}
.widgetTableC td .time .date{ margin-right:5px;}
/* widgetUlistA */
.widgetUlistA { margin:0; padding:0; font-size:12px; line-height:1.5;}
.widgetUlistA li{ list-style:none;}
/* widgetUlistB */
.widgetUlistB{ margin:0; padding:0; font-size:12px; line-height:1.5; *zoom:1;}
.widgetUlistB:after{ content:""; display:block; clear:both;}
.widgetUlistB li{ position:relative; list-style:none; margin-bottom:10px; *zoom:1;}
.widgetUlistB li .author{ float:left; margin-right:-42px;}
.widgetUlistB li .author img{ border:1px solid;}
.widgetUlistB li .title{ position:relative; margin:0 0 0 60px; border:2px solid; padding:10px 15px; _zoom:1;}
.widgetUlistB li .title a{ text-decoration:underline;}
.widgetUlistB li .title .arrow{ position:absolute; top:16px; left:-6px; display:block; overflow:hidden; width:6px; height:7px; font-size:0; line-height:0;}
.widgetUlistB li .title .deco{ position:absolute; display:block; overflow:hidden; width:1px; height:1px; font-size:0; line-height:0;}
.widgetUlistB li .title .deco .topLeft{}
.widgetUlistB li .title .date{ font-size:11px; font-family:Tahoma;}
.widgetUlistB li .title .hour{ font-size:11px; font-family:Tahoma;}
/* widgetOlistA */
.widgetOlistA { margin:0; padding:0; font-size:12px; line-height:1.5;}
.widgetOlistA li{ margin-left:25px;}
.widgetOlistA li sup{ font-size:9px; font-family:tahoma; padding-left:10px; }
/* widgetDlistA */
.widgetDlistA{ margin:0; padding:0; font-size:12px; line-height:1.5; zoom:1;}
.widgetDlistA:after{ content:""; display:block; clear:both;}
.widgetDlistA dt{ float:left; clear:left; margin-right:5px; white-space:nowrap;}
.widgetDlistA dd{ clear:right; white-space:nowrap; font-family:Tahoma;}
/* widgetGalleryA */
.widgetGalleryA{ position:relative; margin:0; padding:0; font-size:12px; line-height:1.5; *zoom:1;}
.widgetGalleryA:after{ content:""; display:block; clear:both;}
.widgetGalleryA li { float:left; overflow:hidden; width:100px; margin-right:28px; margin-bottom:15px; padding-bottom:15px; white-space:nowrap; list-style:none;}
.widgetGalleryA li.clearRight{ margin-right:0;}
.widgetGalleryA li .thumb{ display:block; position:relative; width:100px; height:75px; margin-bottom:10px; overflow:hidden; text-decoration:none;}
.widgetGalleryA li .thumb img{ display:block; position:relative; width:100%;}
.widgetGalleryA li .thumb .imgNone{ display:block; position:relative; width:100%; height:70%; padding-top:30%; background:#eee; text-align:center; cursor:pointer; color:#000;}
.widgetGalleryA li .thumb .board{ display:block; position:absolute; width:100%; top:0; left:0; padding:2px 0 0 0 !important; cursor:pointer; text-align:center; background:#000; color:#fff; opacity:0.6; filter:alpha(opacity=60); -ms-filter:alpha('opacity=60'); }
.widgetGalleryA li .thumb .category{ display:block; position:absolute; width:100%; bottom:0; left:0; padding:2px 0 0 0 !important; cursor:pointer; text-align:center; font-weight:normal; background:#000; color:#fff; opacity:0.6; filter:alpha(opacity=60); -ms-filter:alpha('opacity=60'); }
.widgetGalleryA li .author{ display:block;}
.widgetGalleryA li .replyNum a{ font:10px Tahoma; margin:0 -1px;}
.widgetGalleryA li .trackbackNum a{ font:10px Tahoma; margin:0 -1px;}
.widgetGalleryA li .date{ font:11px Tahoma;}
.widgetGalleryA li .hour{ font:11px Tahoma;}
/* widgetGalleryB */
.widgetGalleryB{ position:relative; margin:0; padding:0; font-size:12px; line-height:1.5; *zoom:1;}
.widgetGalleryB:after{ content:""; display:block; clear:both;}
.widgetGalleryB li { float:left; overflow:hidden; width:100px; margin-right:28px; margin-bottom:15px; padding-bottom:15px; white-space:nowrap; list-style:none; border-bottom:1px solid;}
.widgetGalleryB li.clearRight{ margin-right:0;}
.widgetGalleryB li .thumb{ display:block; position:relative; width:100px; height:75px; margin-bottom:10px; overflow:hidden; text-decoration:none;}
.widgetGalleryB li .thumb img{ display:block; position:relative; width:100%;}
.widgetGalleryB li .thumb .imgNone{ display:block; position:relative; width:100%; height:70%; padding-top:30%; background:#eee; text-align:center; cursor:pointer; color:#000;}
.widgetGalleryB li .thumb .board{ display:block; position:absolute; width:100%; top:0; left:0; padding:2px 0 0 0 !important; cursor:pointer; text-align:center; background:#000; color:#fff; opacity:0.6; filter:alpha(opacity=60); -ms-filter:alpha('opacity=60'); }
.widgetGalleryB li .thumb .category{ display:block; position:absolute; width:100%; bottom:0; left:0; padding:2px 0 0 0 !important; cursor:pointer; text-align:center; font-weight:normal; background:#000; color:#fff; opacity:0.6; filter:alpha(opacity=60); -ms-filter:alpha('opacity=60'); }
.widgetGalleryB li .author{ display:block;}
.widgetGalleryB li .replyNum a{ font:10px Tahoma; margin:0 -1px;}
.widgetGalleryB li .trackbackNum a{ font:10px Tahoma; margin:0 -1px;}
.widgetGalleryB li .date{ font:11px Tahoma;}
.widgetGalleryB li .hour{ font:11px Tahoma;}
/* widgetZineA */
.widgetZineA{ position:relative; margin:0; padding:0; font-size:12px; line-height:1.5; *zoom:1;}
.widgetZineA:after{ content:""; display:block; clear:both;}
.widgetZineA li { list-style:none; clear:both; margin-bottom:10px; padding-bottom:10px; overflow:hidden; *zoom:1;}
.widgetZineA li p{ margin:0;}
.widgetZineA li p.thumbArea{ position:relative; float:left; width:100px; margin-right:-100px; overflow:hidden;}
.widgetZineA li p.titleArea{ margin-left:120px; margin-bottom:4px;}
.widgetZineA li p.titleArea .board{ padding-right:5px;}
.widgetZineA li p.text{ margin-left:120px; margin-bottom:4px;}
.widgetZineA li p.authorArea{ margin-left:120px;}
.widgetZineA li .thumb{ display:block; position:relative; width:100px; height:75px; text-decoration:none; overflow:hidden;}
.widgetZineA li .thumb img{ position:relative; width:100%;}
.widgetZineA li .thumb .imgNone{ display:block; position:relative; width:100%; height:80%; padding-top:20%; background:#eee; text-align:center; cursor:pointer; color:#000;}
.widgetZineA li .thumb .category{ display:block; position:absolute; width:100%; bottom:0; left:0; padding:2px 0 0 0 !important; cursor:pointer; text-align:center; font-weight:normal; background:#000; color:#fff; opacity:0.6; filter:alpha(opacity=60); -ms-filter:alpha('opacity=60'); }
.widgetZineA li .title{ font-weight:bold;}
.widgetZineA li .replyNum a{ font:10px Tahoma; margin:0 -1px;}
.widgetZineA li .trackbackNum a{ font:10px Tahoma; margin:0 -1px;}
.widgetZineA li .author{ margin-right:10px;}
.widgetZineA li .date{ font:11px Tahoma;}
.widgetZineA li .hour{ font:11px Tahoma;}
/* widgetZineB */
.widgetZineB{ position:relative; margin:0; padding:0; font-size:12px; line-height:1.5; *zoom:1;}
.widgetZineB:after{ content:""; display:block; clear:both;}
.widgetZineB li { list-style:none; clear:both; margin-bottom:10px; padding-bottom:10px; border-bottom:1px solid;}
.widgetZineB li p{ margin:0;}
.widgetZineB li p.thumbArea{ position:relative; float:left; width:100px; margin-right:-100px; overflow:hidden;}
.widgetZineB li p.titleArea{ margin-left:120px; margin-bottom:4px;}
.widgetZineB li p.titleArea .board{ padding-right:5px;}
.widgetZineB li p.text{ margin-left:120px; margin-bottom:4px;}
.widgetZineB li p.authorArea{ margin-left:120px;}
.widgetZineB li .thumb{ display:block; position:relative; width:100px; height:75px; text-decoration:none; overflow:hidden;}
.widgetZineB li .thumb img{ position:relative; width:100%;}
.widgetZineB li .thumb .imgNone{ display:block; position:relative; width:100%; height:80%; padding-top:20%; background:#eee; text-align:center; cursor:pointer; color:#000;}
.widgetZineB li .thumb .category{ display:block; position:absolute; width:100%; bottom:0; left:0; padding:2px 0 0 0 !important; cursor:pointer; text-align:center; font-weight:normal; background:#000; color:#fff; opacity:0.6; filter:alpha(opacity=60); -ms-filter:alpha('opacity=60'); }
.widgetZineB li .title{ font-weight:bold;}
.widgetZineB li .replyNum a{ font:10px Tahoma; margin:0 -1px;}
.widgetZineB li .trackbackNum a{ font:10px Tahoma; margin:0 -1px;}
.widgetZineB li .author{ margin-right:10px;}
.widgetZineB li .date{ font:11px Tahoma;}
.widgetZineB li .hour{ font:11px Tahoma;}
/* WidgetTree */
.widgetTree *{ margin:0; padding:0; font-size:12px;}
.widgetTree a strong{ letter-spacing:-1px; cursor:pointer; _cursor /**/:hand;}
.widgetTree ul{ position:relative; display:block; padding:3px 0 0 0 !important; zoom:1;}
.widgetTree ul li{ list-style:none; position:relative; padding:3px 0 2px 8px; white-space:nowrap;}
.widgetTree ul li a,
.widgetTree ul li span.nav_tree_label{ position:relative; left:16px; _left /**/:0; top:0;}
.widgetTree ul li a.selected {font-weight:bold;}
.widgetTree ul li button{ display:inline-block; position:relative; _left /**/:-16px; *top:-2px; width:13px; height:13px; *width:17px; *height:17px; margin:0 -13px 0 0; *margin:0 -17px -1px -2px; text-indent:-10000px; *text-indent:0; *font:0/0 Sans-serif; border:none; cursor:pointer; _cursor /**/:hand;}
.widgetTree ul li ul{ display:none; padding:2px 0 0 0 !important; margin:0 0 -2px 6px; background-position:left top;}
.widgetTree ul li ul li{ display:none;}
.widgetTree ul li.nav_tree_on button{ background-position:0 -13px; *background-position:2px -11px;}
.widgetTree ul li.nav_tree_off button{ background-position:0 0; *background-position:2px 2px;}
.widgetTree ul li.nav_tree_on ul{ display:block;}
.widgetTree ul li.nav_tree_on ul li{ display:block;}
.widgetTree ul li.nav_tree_off ul{ display:none;}
.widgetTree ul li.nav_tree_off ul li{ display:none;}
.widgetTree .icon{ position:relative; left:16px;}
/* widgetLogin */
.widgetLogin{ font-size:12px;}
.widgetLogin fieldset{ border:0; margin:0; padding:0;}
.widgetLogin dl{ margin:0;}
.widgetLogin dt{ display:none;}
.widgetLogin dd{ margin:0 0 5px 0;}
.widgetLogin dd .widgetXeInputText{ width:90%; height:16px;}
.widgetLogin p{ margin:5px 0;}
.widgetLogin p .widgetXeInputCheck{ margin-right:5px;}
.widgetLogin .help{ position:relative; width:100%; overflow:hidden; margin:10px 0 0 0; padding:0;}
.widgetLogin .help li{ position:relative; left:-5px; padding-left:5px; list-style:none; display:inline; letter-spacing:-1px;}
/* widgetLastLogin */
.widgetLastLogin{ margin:10px 0; font-size:12px;}
.widgetLastLogin dt,
.widgetLastLogin dd{ display:inline; margin:0;}
.widgetLastLogin dd{ font-size:11px; font-family:Tahoma;}
/* widgetMyInfo */
.widgetMyInfo{ margin:0; padding:0; font-size:12px;}
.widgetMyInfo:after{ content:""; display:block; clear:both; *zoom:1;}
.widgetMyInfo li{ margin-bottom:5px; padding:0; text-indent:12px; list-style:none;}
/* widgetLevel */
.widgetLevel{ padding-left:30px; background-repeat:no-repeat; background-position:left 30%;}
.widgetLevel em{ display:block; width:0; height:0; overflow:hidden; font-size:0; line-height:0; position:absolute;}
/* widgetCounter */
.widgetCounter{ font-size:12px; margin:0;}
.widgetCounter dt,
.widgetCounter dd{ height:18px;}
.widgetCounter dt{ float:left; clear:left;}
.widgetCounter dd{ font-size:11px; font-family:Tahoma;}
/* widgetLanguage */
.widgetLanguage p{ float:right; margin:0;}
.widgetLanguage .langList{ display:none; position:absolute; margin:0; padding:0; z-index:999;}
.widgetLanguage .langList li{ list-style:none;}
.widgetLanguage .langList li a{ font-size:12px; display:block; padding:2px 5px;}
/* widgetTabA */
.widgetTabA{ position:relative; margin:0; padding:0; *zoom:1; border-bottom:2px solid;}
.widgetTabA:after{ content:""; display:block; clear:both;}
.widgetTabA li{ float:left; margin-right:1px; list-style:none; background-repeat:no-repeat; background-position:0 0;}
.widgetTabA li.active{ background-position:0 -30px;}
.widgetTabA li a{ position:relative; left:2px; float:left; height:20px; padding:8px 15px 0 15px; text-decoration:none; font-size:12px; background-repeat:no-repeat; background-position:right 0;}
.widgetTabA li.active a{ background-position:right -30px; font-weight:bold; letter-spacing:-1px;}
/* widgetTabB */
.widgetTabB{ margin:0; position:absolute; top:1px; right:0; white-space:nowrap; font-size:12px;}
.widgetTabB li{ display:inline;}
.widgetTabB li.active a{ font-weight:bold;}
/* widgetTabC */
.widgetTabC{ margin:0; padding:0; font-size:12px; border-top:1px solid;}
.widgetTabC li{ list-style:none; border-bottom:1px solid; *zoom:1; margin-bottom:1px;}
.widgetTabC li a{ display:block; padding:7px 0 6px 10px; text-decoration:none; *zoom:1;}
/* widgetThumb */
.widgetThumb{ position:relative; margin:0; text-align:center; font-size:12px; line-height:1.5;}
.widgetThumb .thumb{ display:block; margin-bottom:5px; position:relative; *zoom:1; text-decoration:none;}
.widgetThumb .thumb img{ display:block; width:100%;}
.widgetThumb .thumb .imgNone{ display:block; position:relative; width:100%; padding-top:30px; padding-bottom:50px; background:#eee; text-align:center; cursor:pointer; color:#000;}
.widgetThumb .thumb .category{ display:block; position:absolute; width:100%; bottom:0; left:0; padding:2px 0 0 0 !important; cursor:pointer; text-align:center; font-weight:normal; background:#000; color:#fff; opacity:0.6; filter:alpha(opacity=60); -ms-filter:alpha('opacity=60'); }
.widgetThumb .title{ display:block;}
.widgetThumb .author{ display:block;}
.widgetThumb .date{ font-size:11px; font-family:Tahoma;}
.widgetThumb .hour{ font-size:11px; font-family:Tahoma;}
/* widgetContainer */
.widgetContainer{ *zoom:1;}
.widgetContainer:after{ content:""; display:block; clear:both;}
/* widgetNavigator */
.widgetNavigator{ margin:0; padding:0; text-align:right; clear:both;}
.widgetNavigator li{ list-style:none; display:inline;}
.widgetNavigator li button{ width:16px; height:16px; padding:0; background-color:transparent; background-image:url(../img/white/buttonWidgetNavigation.gif); border:1px solid #999; cursor:pointer;}
.widgetNavigator li button.prev{ background-position:left center; *background-position:-1px center;}
.widgetNavigator li button.next{ background-position:right center; *background-position:13px center;}
.widgetNavigator li button span{ position:absolute; display:block; width:0; height:0; overflow:hidden; visibility:hidden;}
/* widgetTagCloud */
.widgetTagCloud { text-align:justify; font-size:12px; line-height:1.5; margin:0; padding:0;}
.widgetTagCloud li{ display:inline; white-space:nowrap; list-style:none;}
.widgetTagCloud li.level1 a{ font-size:11px;}
.widgetTagCloud li.level2 a{ font-size:12px;}
.widgetTagCloud li.level3 a{ font-size:14px; font-weight:bold;}
.widgetTagCloud li.level4 a{ font-size:18px; font-weight:bold;}
/* widgetCalendar */
.widgetCalendarNavigation{ position:relative; height:15px; margin-bottom:-15px; z-index:10;}
.widgetCalendarNavigation button{ position:absolute; top:0; font-size:10px; font-family:Tahoma; background:none; border:0; padding:0; cursor:pointer;}
.widgetCalendarNavigation button.prevYear{ left:0;}
.widgetCalendarNavigation button.prevMonth{ left:25px;}
.widgetCalendarNavigation button.nextYear{ right:0;}
.widgetCalendarNavigation button.nextMonth{ right:25px;}
.widgetCalendar{ position:relative; border:0; width:100%;}
.widgetCalendar caption { position:relative; padding-bottom:5px; text-align:center; font-size:12px; font-weight:bold; font-family:Tahoma;}
.widgetCalendar th,
.widgetCalendar td{ border:0; text-align:center; padding:5px 0;}
.widgetCalendar th{ font-size:10px; font-family:Tahoma; font-weight:normal;}
.widgetCalendar td,
.widgetCalendar td a{ font-size:11px; font-family:Tahoma;}
.widgetCalendar td em{ font-style:normal;}
/* widgetPoint */
.widgetPoint{ margin:0; *zoom:1; clear:both;}
.widgetPoint:after{ content:""; display:block; clear:both;}
.widgetPoint dt{ font-size:12px; font-family:Tahoma; font-weight:bold;}
.widgetPoint dd{ margin:0;}
.widgetPoint dd.graph{ height:5px; overflow:hidden; background:#e5e5e5; font-size:0; line-height:0;}
.widgetPoint dd.graph img{ width:0%;}
.widgetPoint dd.point{ font-size:10px; font-family:Tahoma; float:left; color:#888;}
.widgetPoint dd.percentage{ font-size:10px; font-family:Tahoma; float:right; color:#888;}
/* widgetMenuA */
.widgetMenuA{ position:relative; margin:0; padding:0; font-size:12px; line-height:1.2; border-top:1px solid;}
.widgetMenuA li{ position:relative; list-style:none; border-bottom:1px solid; *zoom:1;}
.widgetMenuA li sup{ font-size:10px; font-family:Tahoma; line-height:1; color:#888; font-weight:normal;}
.widgetMenuA li li.active sup{ color:#ff1a1a;}
.widgetMenuA li li{ padding:0; border:0;}
.widgetMenuA li ul{ display:none; margin:0 0 10px 20px; padding:0;}
.widgetMenuA li.active ul{ display:block;}
.widgetMenuA li a{ position:relative; display:block; padding:7px 0 7px 10px; background-repeat:no-repeat; background-position:0 center; text-decoration:none !important;}
.widgetMenuA li.active a{ font-weight:bold;}
.widgetMenuA li.active li a{ font-weight:normal; padding:1px 0; background:none !important;}
.widgetMenuA li li.active a{ color:#ff1a1a;}
.widgetMenuA li.active li a:hover,
.widgetMenuA li.active li a:active,
.widgetMenuA li.active li a:focus{ text-decoration:underline !important;}
/* widgetMenuB */
.widgetMenuB{ margin:0; padding:0; font-size:12px; line-height:1.3; border-top:1px solid;}
.widgetMenuB li{ position:relative; list-style:none; border-bottom:1px solid; white-space:nowrap; *zoom:1;}
.widgetMenuB li sup{ font-size:10px; font-family:Tahoma; line-height:1; color:#888; font-weight:normal;}
.widgetMenuB li li{ padding:2px 10px; border:none;}
.widgetMenuB li li.first{ left:-4px; padding-left:14px; background-repeat:no-repeat; background-position:0 center;}
.widgetMenuB li li.active sup{ color:#ff1a1a;}
.widgetMenuB li ul{ position:absolute; display:none; top:-1px; left:100%; margin:0 0 0 5px; padding:5px 0 10px 0; border:1px solid}
.widgetMenuB li.active{ z-index:100;}
.widgetMenuB li.active ul{ display:block;}
.widgetMenuB li a{ position:relative; display:block; padding:7px 0 7px 10px; background-repeat:no-repeat; background-position:0 center; text-decoration:none !important; *zoom:1;}
.widgetMenuB li.active a{ font-weight:bold;}
.widgetMenuB li.active li a{ font-weight:normal; padding:0; background:none !important;}
.widgetMenuB li li.active a{ color:#ff1a1a;}
.widgetMenuB li.active li a:hover,
.widgetMenuB li.active li a:active,
.widgetMenuB li.active li a:focus{ text-decoration:underline !important;}
.widgetMenuC{ margin:0; padding:0; font-size:12px; line-height:1.2; background-repeat:repeat-x;background-position:0 0;}
.widgetMenuC ul{ margin:0; padding:0; height:35px;}
.widgetMenuC ul li ul{ display:none; position:absolute; top:40px; left:20px; height:auto; padding-bottom:7px; background:#35ad06; border:1px solid #027a00;}
.widgetMenuC ul li.active ul{ display:block;}
.widgetMenuC ul.aCenter{ margin-left:auto; margin-right:auto;}
.widgetMenuC ul.aLeft{ margin-right:auto;}
.widgetMenuC ul.aRight{ margin-left:auto;}
.widgetMenuC li{ position:relative; padding-right:3px; float:left; list-style:none; background-repeat:no-repeat;background-position:right -40px; white-space:nowrap;}
.widgetMenuC li a{ position:relative; float:left; padding:12px 22px 0 25px; height:23px; color:#fff !important; text-decoration:none !important;}
.widgetMenuC li.first a{ background-repeat:no-repeat;background-position:left -40px;}
.widgetMenuC li.active{ margin-left:-2px; background-repeat:no-repeat;background-position:right -80px;}
.widgetMenuC li.active a{ font-weight:bold; color:#ff0 !important; background-repeat:no-repeat; background-position:left -80px;}
.widgetMenuC li.active li{ padding:2px 15px; float:none; background:none;}
.widgetMenuC li.active li.active{ margin:0;}
.widgetMenuC li.active li.first{ margin-top:-4px; padding-top:14px; background-repeat:no-repeat; background-position:30px top;}
.widgetMenuC li.active li a{ display:block; _display:inline-block; padding:0; float:none; height:auto; font-weight:normal; color:#fff !important; background:none;}
.widgetMenuC li.active li.active a{ color:#ff0 !important;}
.widgetMenuC li.active li a:hover,
.widgetMenuC li.active li a:active,
.widgetMenuC li.active li a:focus{ text-decoration:underline !important;}
/* widgetSearch */
.widgetSearch{ position:absolute; bottom:30px; right:0;}
.widgetSearch fieldset{ border:0; margin:0; padding:0; position:absolute; bottom:0; right:0;}
.widgetSearch .widgetXeInputText{ width:153px; height:16px; padding:2px 20px 2px 5px; vertical-align:middle; border:1px solid #666; border-top-color:#555; border-left-color:#555; background:#444; color:#fff;}
.widgetSearch .widgetXeInputText:focus{ background:#494949;}
.widgetSearch .widgetSearch{ position:absolute; top:3px; right:4px; vertical-align:middle;}
address.period { font-style:normal; font-size:10px; font-family:tahoma; text-align:right;}

View file

@ -0,0 +1,278 @@
@charset "utf-8";
/* NHN > UIT Center > Open UI Technology Team > Jeong Chan Myeong(dece24@nhncorp.com) */
/* Common Class */
.widgetXeInputText{ border-color:#666; background:#333; color:#ccc;}
/* widgetTableA */
.widgetTableA td.title a{ color:#999;}
.widgetTableA td .board{ color:#999; background:url(../img/black/lineTextDiv.gif) no-repeat right center;}
.widgetTableA td .notice{ color:#ff1a1a; background:url(../img/black/lineTextDiv.gif) no-repeat right center;}
.widgetTableA td .category{ color:#666; background:url(../img/black/lineTextDiv.gif) no-repeat right center;}
.widgetTableA td .replyNum{ color:#ff1a1a;}
.widgetTableA td .trackbackNum{ color:#66c;}
.widgetTableA td .author { color:#999;}
.widgetTableA td .date{ color:#999;}
.widgetTableA td .hour{ color:#888;}
/* widgetTableB */
.widgetTableB,
.widgetTableB td{ border-color:#7f7f7f;}
.widgetTableB td.title a{ color:#999;}
.widgetTableB td .board{ color:#999; background:url(../img/black/lineTextDiv.gif) no-repeat right center;}
.widgetTableB td .notice{ color:#ff1a1a; background:url(../img/black/lineTextDiv.gif) no-repeat right center;}
.widgetTableB td .category{ color:#666; background:url(../img/black/lineTextDiv.gif) no-repeat right center;}
.widgetTableB td .replyNum{ color:#ff1a1a;}
.widgetTableB td .trackbackNum{ color:#66c;}
.widgetTableB td .author { color:#999;}
.widgetTableB td .date{ color:#999;}
.widgetTableB td .hour{ color:#888;}
/* widgetTableC */
.widgetTableC{ border-color:#7f7f7f;}
.widgetTableC td{ border-color:#7f7f7f;}
.widgetTableC td.title a{ color:#ccc;}
.widgetTableC td.title dd{ color:#888;}
.widgetTableC td.lastDoc p a{ color:#ccc;}
.widgetTableC td.lastDoc .author{ color:#888;}
.widgetTableC td.lastDoc .time{ color:#888;}
/* widgetUlistA */
.widgetUlistA li a{ color:#999;}
/* widgetUlistB */
.widgetUlistB li .author img{ border-color:#666;}
.widgetUlistB li .title{ border-color:#333; color:#999; background:#000;}
.widgetUlistB li .title a{ color:#3399ff;}
.widgetUlistB li .title .arrow{ background:url(../img/black/arrowUlistB.gif) no-repeat;}
.widgetUlistB li .title .deco{ background:#000;}
.widgetUlistB li .title .date{ color:#999;}
.widgetUlistB li .title .hour{ color:#888;}
/* widgetOlistA */
.widgetOlistA li,
.widgetOlistA li a{ color:#999;}
.widgetOlistA li sup{ color:#666;}
/* widgetDlistA */
.widgetDlistA dt{ color:#999;}
.widgetDlistA dd,
.widgetDlistA dd a{ color:#888;}
/* widgetGalleryA */
.widgetGalleryA li .title{ color:#999;}
.widgetGalleryA li .replyNum a{ color:#ff1a1a;}
.widgetGalleryA li .trackbackNum a{ color:#66c;}
.widgetGalleryA li .author{ color:#999;}
.widgetGalleryA li .date{ color:#999;}
.widgetGalleryA li .hour{ color:#888;}
/* widgetGalleryB */
.widgetGalleryB li{ border-color:#7f7f7f;}
.widgetGalleryB li .title{ color:#999;}
.widgetGalleryB li .replyNum a{ color:#ff1a1a;}
.widgetGalleryB li .trackbackNum a{ color:#66c;}
.widgetGalleryB li .author{ color:#999;}
.widgetGalleryB li .date{ color:#999;}
.widgetGalleryB li .hour{ color:#888;}
/* widgetZineA */
.widgetZineA li .board{ color:#999; background:url(../img/black/lineTextDiv.gif) no-repeat right center;}
.widgetZineA li .title{ color:#999;}
.widgetZineA li .replyNum a{ color:#ff1a1a;}
.widgetZineA li .trackbackNum a{ color:#66c;}
.widgetZineA li .author{ color:#999;}
.widgetZineA li .date{ color:#999;}
.widgetZineA li .hour{ color:#888;}
.widgetZineA li .text{ color:#888;}
/* widgetZineB */
.widgetZineB li .board{ color:#999; background:url(../img/black/lineTextDiv.gif) no-repeat right center;}
.widgetZineB li{ border-color:#7f7f7f;}
.widgetZineB li .title{ color:#999;}
.widgetZineB li .replyNum a{ color:#ff1a1a;}
.widgetZineB li .trackbackNum a{ color:#66c;}
.widgetZineB li .author{ color:#999;}
.widgetZineB li .date{ color:#999;}
.widgetZineB li .hour{ color:#888;}
.widgetZineB li .text{ color:#888;}
/* widgetLogin */
.widgetLogin label{ color:#999;}
.widgetLogin .help a{ color:#ccc;}
.widgetLogin .help li{ background:url(../img/black/lineTextDiv.gif) no-repeat left center;}
/* widgetLastLogin */
.widgetLastLogin dt{ color:#999;}
.widgetLastLogin dd{ color:#888;}
.widgetLastLogin a{ color:#333;}
.widgetLastLogin li{ background:url(../img/black/iconInfoMine.gif) no-repeat left center;}
/* widgetMyInfo */
.widgetMyInfo li a{ color:#999;}
.widgetMyInfo li{ background:url(../img/black/iconMyInfo.gif) no-repeat left 1px;}
/* widgetTree */
.widgetTree{ color:#999;}
.widgetTree a{ color:#999;}
/* widgetCounter */
.widgetCounter dt{ color:#999;}
.widgetCounter dd{ color:#888;}
/* widgetLanguage */
.widgetLanguage p a{ color:#b3b3b3;}
.widgetLanguage .langList{ background:#fff; border:1px solid #ccc;}
.widgetLanguage .langList a{ color:#333;}
/* Widget Tree */
.widgetTree ul{ background:url(../img/black/lineTreeVr.gif) repeat-y 0 -1px;}
.widgetTree ul li{ background:url(../img/black/lineTreeHr.gif) no-repeat 1px 5px !important;}
.widgetTree ul li button{ background:url(../img/black/buttonTreeCollapse.gif) no-repeat;}
.widgetTree ul li.nav_tree_last{ background:url(../img/black/lineTreeLastHr.gif) no-repeat 0 5px !important;}
/* widgetLevel */
.widgetLevel.num0 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/0.gif);}
.widgetLevel.num1 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/1.gif);}
.widgetLevel.num2 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/2.gif);}
.widgetLevel.num3 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/3.gif);}
.widgetLevel.num4 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/4.gif);}
.widgetLevel.num5 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/5.gif);}
.widgetLevel.num6 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/6.gif);}
.widgetLevel.num7 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/7.gif);}
.widgetLevel.num8 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/8.gif);}
.widgetLevel.num9 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/9.gif);}
.widgetLevel.num10 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/10.gif);}
.widgetLevel.num11 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/11.gif);}
.widgetLevel.num12 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/12.gif);}
.widgetLevel.num13 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/13.gif);}
.widgetLevel.num14 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/14.gif);}
.widgetLevel.num15 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/15.gif);}
.widgetLevel.num16 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/16.gif);}
.widgetLevel.num17 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/17.gif);}
.widgetLevel.num18 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/18.gif);}
.widgetLevel.num19 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/19.gif);}
.widgetLevel.num20 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/20.gif);}
.widgetLevel.num21 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/21.gif);}
.widgetLevel.num22 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/22.gif);}
.widgetLevel.num23 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/23.gif);}
.widgetLevel.num24 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/24.gif);}
.widgetLevel.num25 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/25.gif);}
.widgetLevel.num26 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/26.gif);}
.widgetLevel.num27 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/27.gif);}
.widgetLevel.num28 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/28.gif);}
.widgetLevel.num29 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/29.gif);}
.widgetLevel.num30 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/30.gif);}
/* widgetTabA */
.widgetTabA{ border-color:#999;}
.widgetTabA li,
.widgetTabA li a{ background-image:url(../img/black/buttonWidgetTab.gif);}
.widgetTabA li a{ color:#999;}
/* widgetTabB */
.widgetTabB li a{ color:#999;}
/* widgetTabC */
.widgetTabC{ border-color:#7f7f7f;}
.widgetTabC li{ border-color:#7f7f7f; background:#222;}
.widgetTabC li a{ color:#999;}
.widgetTabC li a:hover,
.widgetTabC li a:active,
.widgetTabC li a:focus{ background:#333;}
/* widgetThumb */
.widgetThumb{ color:#999;}
.widgetThumb a{ color:#999;}
.widgetThumb .hour{ color:#888;}
/* widgetTagCloud */
.widgetTagCloud li a{ color:#999;}
.widgetTagCloud li.level1 a{ color:#333;}
.widgetTagCloud li.level2 a{ color:#666;}
.widgetTagCloud li.level3 a{ color:#999;}
.widgetTagCloud li.level4 a{ color:#fff;}
/* widgetCalendar */
.widgetCalendarNavigation button{ color:#999;}
.widgetCalendar caption{ color:#999;}
.widgetCalendar th{ background:#333; color:#fff;}
.widgetCalendar th.sun,
.widgetCalendar td.sun,
.widgetCalendar td em{ color:#ff1a1a;}
.widgetCalendar td,
.widgetCalendar td a{ color:#999;}
.widgetCalendar td.sun a{ color:#ff1a1a;}
/* widgetPoint */
.widgetPoint dt{ color:#999;}
/* widgetMenuA */
.widgetMenuA{ border-color:#7f7f7f;}
.widgetMenuA li{ border-color:#7f7f7f;}
.widgetMenuA li a{ color:#999; background-image:url(../img/black/iconMenuAnormal.gif);}
.widgetMenuA li.active a{ background-image:url(../img/black/iconMenuAactive.gif);}
/* widgetMenuB */
.widgetMenuB{ border-color:#7f7f7f;}
.widgetMenuB li{ border-color:#7f7f7f;}
.widgetMenuB li a{ color:#999; background-image:url(../img/black/iconMenuAnormal.gif);}
.widgetMenuB li.active a{ background-image:url(../img/black/iconMenuAactive.gif);}
.widgetMenuB li ul{ border-color:#777; background:#000;}
.widgetMenuB li li.first{ background-image:url(../img/black/arrowMenuB.gif);}
/* widgetMenuCgreen */
.widgetMenuCgreen{ background-image:url(../img/white/bgMenuCgreen.gif);}
.widgetMenuCgreen ul li ul{ background:#35ad06; border-color:#027a00;}
.widgetMenuCgreen li{ background-image:url(../img/white/bgMenuCgreen.gif);}
.widgetMenuCgreen li.first a{ background-image:url(../img/white/bgMenuCgreen.gif);}
.widgetMenuCgreen li.active{ background-image:url(../img/white/bgMenuCgreen.gif);}
.widgetMenuCgreen li.active a{ background-image:url(../img/white/bgMenuCgreen.gif);}
.widgetMenuCgreen li.active li.first{ background-image:url(../img/white/arrowMenuCgreen.gif);}
/* widgetMenuCblue */
.widgetMenuCblue{ background-image:url(../img/white/bgMenuCblue.gif);}
.widgetMenuCblue ul li ul{ background:#0688ad; border-color:#00557a;}
.widgetMenuCblue li{ background-image:url(../img/white/bgMenuCblue.gif);}
.widgetMenuCblue li.first a{ background-image:url(../img/white/bgMenuCblue.gif);}
.widgetMenuCblue li.active{ background-image:url(../img/white/bgMenuCblue.gif);}
.widgetMenuCblue li.active a{ background-image:url(../img/white/bgMenuCblue.gif);}
.widgetMenuCblue li.active li.first{ background-image:url(../img/white/arrowMenuCblue.gif);}
/* widgetMenuCcyan */
.widgetMenuCcyan{ background-image:url(../img/white/bgMenuCcyan.gif);}
.widgetMenuCcyan ul li ul{ background:#06a4ad; border-color:#00717a;}
.widgetMenuCcyan li{ background-image:url(../img/white/bgMenuCcyan.gif);}
.widgetMenuCcyan li.first a{ background-image:url(../img/white/bgMenuCcyan.gif);}
.widgetMenuCcyan li.active{ background-image:url(../img/white/bgMenuCcyan.gif);}
.widgetMenuCcyan li.active a{ background-image:url(../img/white/bgMenuCcyan.gif);}
.widgetMenuCcyan li.active li.first{ background-image:url(../img/white/arrowMenuCcyan.gif);}
/* widgetMenuCorange */
.widgetMenuCorange{ background-image:url(../img/white/bgMenuCorange.gif);}
.widgetMenuCorange ul li ul{ background:#ad9906; border-color:#7a6600;}
.widgetMenuCorange li{ background-image:url(../img/white/bgMenuCorange.gif);}
.widgetMenuCorange li.first a{ background-image:url(../img/white/bgMenuCorange.gif);}
.widgetMenuCorange li.active{ background-image:url(../img/white/bgMenuCorange.gif);}
.widgetMenuCorange li.active a{ background-image:url(../img/white/bgMenuCorange.gif);}
.widgetMenuCorange li.active li.first{ background-image:url(../img/white/arrowMenuCorange.gif);}
/* widgetMenuCred */
.widgetMenuCred{ background-image:url(../img/white/bgMenuCred.gif);}
.widgetMenuCred ul li ul{ background:#ad4606; border-color:#7a1300;}
.widgetMenuCred li{ background-image:url(../img/white/bgMenuCred.gif);}
.widgetMenuCred li.first a{ background-image:url(../img/white/bgMenuCred.gif);}
.widgetMenuCred li.active{ background-image:url(../img/white/bgMenuCred.gif);}
.widgetMenuCred li.active a{ background-image:url(../img/white/bgMenuCred.gif);}
.widgetMenuCred li.active li.first{ background-image:url(../img/white/arrowMenuCred.gif);}
/* widgetMenuCgray */
.widgetMenuCgray{ background-image:url(../img/white/bgMenuCgray.gif);}
.widgetMenuCgray ul li ul{ background:#595959; border-color:#7a1300;}
.widgetMenuCgray li{ background-image:url(../img/white/bgMenuCgray.gif);}
.widgetMenuCgray li.first a{ background-image:url(../img/white/bgMenuCgray.gif);}
.widgetMenuCgray li.active{ background-image:url(../img/white/bgMenuCgray.gif);}
.widgetMenuCgray li.active a{ background-image:url(../img/white/bgMenuCgray.gif);}
.widgetMenuCgray li.active li.first{ background-image:url(../img/white/arrowMenuCgray.gif);}
address.period { color:#333; }

View file

@ -0,0 +1,278 @@
@charset "utf-8";
/* NHN > UIT Center > Open UI Technology Team > Jeong Chan Myeong(dece24@nhncorp.com) */
/* Common Class */
.widgetXeInputText{ border-color:#ccc; background:#f4f4f4; color:#000;}
/* widgetTableA */
.widgetTableA td.title a{ color:#333;}
.widgetTableA td .board{ color:#333; background:url(../img/white/lineTextDiv.gif) no-repeat right center;}
.widgetTableA td .notice{ color:#ff1a1a; background:url(../img/white/lineTextDiv.gif) no-repeat right center;}
.widgetTableA td .category{ color:#888; background:url(../img/white/lineTextDiv.gif) no-repeat right center;}
.widgetTableA td .replyNum a{ color:#ff1a1a;}
.widgetTableA td .trackbackNum a{ color:#66c;}
.widgetTableA td .author { color:#333;}
.widgetTableA td .date{ color:#333;}
.widgetTableA td .hour{ color:#888;}
/* widgetTableB */
.widgetTableB,
.widgetTableB td{ border-color:#e5e5e5;}
.widgetTableB td.title a{ color:#333;}
.widgetTableB td .board{ color:#333; background:url(../img/white/lineTextDiv.gif) no-repeat right center;}
.widgetTableB td .notice{ color:#ff1a1a; background:url(../img/white/lineTextDiv.gif) no-repeat right center;}
.widgetTableB td .category{ color:#888; background:url(../img/white/lineTextDiv.gif) no-repeat right center;}
.widgetTableB td .replyNum a{ color:#ff1a1a;}
.widgetTableB td .trackbackNum a{ color:#66c;}
.widgetTableB td .author { color:#333;}
.widgetTableB td .date{ color:#333;}
.widgetTableB td .hour{ color:#888;}
/* widgetTableC */
.widgetTableC{ border-color:#e5e5e5;}
.widgetTableC td{ border-color:#e5e5e5;}
.widgetTableC td.title a{ color:#333;}
.widgetTableC td.title dd{ color:#888;}
.widgetTableC td.lastDoc p a{ color:#333;}
.widgetTableC td.lastDoc .author{ color:#888;}
.widgetTableC td.lastDoc .time{ color:#888;}
/* widgetUlistA */
.widgetUlistA li a{ color:#666;}
/* widgetUlistB */
.widgetUlistB li .author img{ border-color:#ccc;}
.widgetUlistB li .title{ border-color:#eee; color:#333; background:#fff;}
.widgetUlistB li .title a{ color:#0066ff;}
.widgetUlistB li .title .arrow{ background:url(../img/white/arrowUlistB.gif) no-repeat;}
.widgetUlistB li .title .deco{ background:#fff;}
.widgetUlistB li .title .date{ color:#333;}
.widgetUlistB li .title .hour{ color:#888;}
/* widgetOlistA */
.widgetOlistA li,
.widgetOlistA li a{ color:#666;}
.widgetOlistA li sup{ color:#AAA;}
/* widgetDlistA */
.widgetDlistA dt{ color:#333;}
.widgetDlistA dd,
.widgetDlistA dd a{ color:#888;}
/* widgetGalleryA */
.widgetGalleryA li .title{ color:#333;}
.widgetGalleryA li .replyNum a{ color:#ff1a1a;}
.widgetGalleryA li .trackbackNum a{ color:#66c;}
.widgetGalleryA li .author{ color:#333;}
.widgetGalleryA li .date{ color:#333;}
.widgetGalleryA li .hour{ color:#888;}
/* widgetGalleryB */
.widgetGalleryB li{ border-color:#e5e5e5;}
.widgetGalleryB li .title{ color:#333;}
.widgetGalleryB li .replyNum a{ color:#ff1a1a;}
.widgetGalleryB li .trackbackNum a{ color:#66c;}
.widgetGalleryB li .author{ color:#333;}
.widgetGalleryB li .date{ color:#333;}
.widgetGalleryB li .hour{ color:#888;}
/* widgetZineA */
.widgetZineA li .board{ color:#333; background:url(../img/white/lineTextDiv.gif) no-repeat right center;}
.widgetZineA li .title{ color:#666;}
.widgetZineA li .replyNum a{ color:#ff1a1a;}
.widgetZineA li .trackbackNum a{ color:#66c;}
.widgetZineA li .author{ color:#333;}
.widgetZineA li .date{ color:#333;}
.widgetZineA li .hour{ color:#888;}
.widgetZineA li .text{ color:#888;}
/* widgetZineB */
.widgetZineB li .board{ color:#333; background:url(../img/white/lineTextDiv.gif) no-repeat right center;}
.widgetZineB li{ border-color:#e5e5e5;}
.widgetZineB li .title{ color:#666;}
.widgetZineB li .replyNum a{ color:#ff1a1a;}
.widgetZineB li .trackbackNum a{ color:#66c;}
.widgetZineB li .author{ color:#333;}
.widgetZineB li .date{ color:#333;}
.widgetZineB li .hour{ color:#888;}
.widgetZineB li .text{ color:#888;}
/* widgetLogin */
.widgetLogin label{ color:#333;}
.widgetLogin .help a{ color:#333;}
.widgetLogin .help li{ background:url(../img/white/lineTextDiv.gif) no-repeat left center;}
/* widgetLastLogin */
.widgetLastLogin dt{ color:#333;}
.widgetLastLogin dd{ color:#888;}
.widgetLastLogin a{ color:#333;}
.widgetLastLogin li{ background:url(../img/white/iconInfoMine.gif) no-repeat left center;}
/* widgetMyInfo */
.widgetMyInfo li a{ color:#666;}
.widgetMyInfo li{ background:url(../img/white/iconMyInfo.gif) no-repeat left 1px;}
/* widgetTree */
.widgetTree{ color:#333;}
.widgetTree a{ color:#333;}
/* widgetCounter */
.widgetCounter dt{ color:#333;}
.widgetCounter dd{ color:#888;}
/* widgetLanguage */
.widgetLanguage p a{ color:#b3b3b3;}
.widgetLanguage .langList{ background:#fff; border:1px solid #ccc;}
.widgetLanguage .langList a{ color:#333;}
/* Widget Tree */
.widgetTree ul{ background:url(../img/white/lineTreeVr.gif) repeat-y 0 -1px;}
.widgetTree ul li{ background:url(../img/white/lineTreeHr.gif) no-repeat 1px 5px !important;}
.widgetTree ul li button{ background:url(../img/white/buttonTreeCollapse.gif) no-repeat;}
.widgetTree ul li.nav_tree_last{ background:url(../img/white/lineTreeLastHr.gif) no-repeat 0 5px !important;}
/* widgetLevel */
.widgetLevel.num0 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/0.gif);}
.widgetLevel.num1 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/1.gif);}
.widgetLevel.num2 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/2.gif);}
.widgetLevel.num3 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/3.gif);}
.widgetLevel.num4 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/4.gif);}
.widgetLevel.num5 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/5.gif);}
.widgetLevel.num6 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/6.gif);}
.widgetLevel.num7 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/7.gif);}
.widgetLevel.num8 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/8.gif);}
.widgetLevel.num9 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/9.gif);}
.widgetLevel.num10 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/10.gif);}
.widgetLevel.num11 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/11.gif);}
.widgetLevel.num12 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/12.gif);}
.widgetLevel.num13 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/13.gif);}
.widgetLevel.num14 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/14.gif);}
.widgetLevel.num15 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/15.gif);}
.widgetLevel.num16 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/16.gif);}
.widgetLevel.num17 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/17.gif);}
.widgetLevel.num18 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/18.gif);}
.widgetLevel.num19 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/19.gif);}
.widgetLevel.num20 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/20.gif);}
.widgetLevel.num21 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/21.gif);}
.widgetLevel.num22 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/22.gif);}
.widgetLevel.num23 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/23.gif);}
.widgetLevel.num24 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/24.gif);}
.widgetLevel.num25 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/25.gif);}
.widgetLevel.num26 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/26.gif);}
.widgetLevel.num27 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/27.gif);}
.widgetLevel.num28 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/28.gif);}
.widgetLevel.num29 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/29.gif);}
.widgetLevel.num30 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/30.gif);}
/* widgetTabA */
.widgetTabA{ border-color:#666;}
.widgetTabA li,
.widgetTabA li a{ background-image:url(../img/white/buttonWidgetTab.gif);}
.widgetTabA li a{ color:#333;}
/* widgetTabB */
.widgetTabB li a{ color:#333;}
/* widgetTabC */
.widgetTabC{ border-color:#e5e5e5;}
.widgetTabC li{ border-color:#e5e5e5; background:#f8f8f8;}
.widgetTabC li a{ color:#333;}
.widgetTabC li a:hover,
.widgetTabC li a:active,
.widgetTabC li a:focus{ background:#eee;}
/* widgetThumb */
.widgetThumb{ color:#333;}
.widgetThumb a{ color:#333;}
.widgetThumb .hour{ color:#888;}
/* widgetTagCloud */
.widgetTagCloud li a{ color:#666;}
.widgetTagCloud li.level1 a{ color:#999;}
.widgetTagCloud li.level2 a{ color:#666;}
.widgetTagCloud li.level3 a{ color:#333;}
.widgetTagCloud li.level4 a{ color:#000;}
/* widgetCalendar */
.widgetCalendarNavigation button{ color:#333;}
.widgetCalendar caption{ color:#333;}
.widgetCalendar th{ background:#eee; color:#333;}
.widgetCalendar th.sun,
.widgetCalendar td.sun,
.widgetCalendar td em{ color:#ff1a1a;}
.widgetCalendar td,
.widgetCalendar td a{ color:#666;}
.widgetCalendar td.sun a{ color:#ff1a1a;}
/* widgetPoint */
.widgetPoint dt{ color:#333;}
/* widgetMenuA */
.widgetMenuA{ border-color:#e5e5e5;}
.widgetMenuA li{ border-color:#e5e5e5;}
.widgetMenuA li a{ color:#333; background-image:url(../img/white/iconMenuAnormal.gif);}
.widgetMenuA li.active a{ background-image:url(../img/white/iconMenuAactive.gif);}
/* widgetMenuB */
.widgetMenuB{ border-color:#e5e5e5;}
.widgetMenuB li{ border-color:#e5e5e5;}
.widgetMenuB li a{ color:#333; background-image:url(../img/white/iconMenuAnormal.gif);}
.widgetMenuB li.active a{ background-image:url(../img/white/iconMenuAactive.gif);}
.widgetMenuB li ul{ border-color:#ddd; background:#fff;}
.widgetMenuB li li.first{ background-image:url(../img/white/arrowMenuB.gif);}
/* widgetMenuCgreen */
.widgetMenuCgreen{ background-image:url(../img/white/bgMenuCgreen.gif);}
.widgetMenuCgreen ul li ul{ background:#35ad06; border-color:#027a00;}
.widgetMenuCgreen li{ background-image:url(../img/white/bgMenuCgreen.gif);}
.widgetMenuCgreen li.first a{ background-image:url(../img/white/bgMenuCgreen.gif);}
.widgetMenuCgreen li.active{ background-image:url(../img/white/bgMenuCgreen.gif);}
.widgetMenuCgreen li.active a{ background-image:url(../img/white/bgMenuCgreen.gif);}
.widgetMenuCgreen li.active li.first{ background-image:url(../img/white/arrowMenuCgreen.gif);}
/* widgetMenuCblue */
.widgetMenuCblue{ background-image:url(../img/white/bgMenuCblue.gif);}
.widgetMenuCblue ul li ul{ background:#0688ad; border-color:#00557a;}
.widgetMenuCblue li{ background-image:url(../img/white/bgMenuCblue.gif);}
.widgetMenuCblue li.first a{ background-image:url(../img/white/bgMenuCblue.gif);}
.widgetMenuCblue li.active{ background-image:url(../img/white/bgMenuCblue.gif);}
.widgetMenuCblue li.active a{ background-image:url(../img/white/bgMenuCblue.gif);}
.widgetMenuCblue li.active li.first{ background-image:url(../img/white/arrowMenuCblue.gif);}
/* widgetMenuCcyan */
.widgetMenuCcyan{ background-image:url(../img/white/bgMenuCcyan.gif);}
.widgetMenuCcyan ul li ul{ background:#06a4ad; border-color:#00717a;}
.widgetMenuCcyan li{ background-image:url(../img/white/bgMenuCcyan.gif);}
.widgetMenuCcyan li.first a{ background-image:url(../img/white/bgMenuCcyan.gif);}
.widgetMenuCcyan li.active{ background-image:url(../img/white/bgMenuCcyan.gif);}
.widgetMenuCcyan li.active a{ background-image:url(../img/white/bgMenuCcyan.gif);}
.widgetMenuCcyan li.active li.first{ background-image:url(../img/white/arrowMenuCcyan.gif);}
/* widgetMenuCorange */
.widgetMenuCorange{ background-image:url(../img/white/bgMenuCorange.gif);}
.widgetMenuCorange ul li ul{ background:#ad9906; border-color:#7a6600;}
.widgetMenuCorange li{ background-image:url(../img/white/bgMenuCorange.gif);}
.widgetMenuCorange li.first a{ background-image:url(../img/white/bgMenuCorange.gif);}
.widgetMenuCorange li.active{ background-image:url(../img/white/bgMenuCorange.gif);}
.widgetMenuCorange li.active a{ background-image:url(../img/white/bgMenuCorange.gif);}
.widgetMenuCorange li.active li.first{ background-image:url(../img/white/arrowMenuCorange.gif);}
/* widgetMenuCred */
.widgetMenuCred{ background-image:url(../img/white/bgMenuCred.gif);}
.widgetMenuCred ul li ul{ background:#ad4606; border-color:#7a1300;}
.widgetMenuCred li{ background-image:url(../img/white/bgMenuCred.gif);}
.widgetMenuCred li.first a{ background-image:url(../img/white/bgMenuCred.gif);}
.widgetMenuCred li.active{ background-image:url(../img/white/bgMenuCred.gif);}
.widgetMenuCred li.active a{ background-image:url(../img/white/bgMenuCred.gif);}
.widgetMenuCred li.active li.first{ background-image:url(../img/white/arrowMenuCred.gif);}
/* widgetMenuCgray */
.widgetMenuCgray{ background-image:url(../img/white/bgMenuCgray.gif);}
.widgetMenuCgray ul li ul{ background:#595959; border-color:#7a1300;}
.widgetMenuCgray li{ background-image:url(../img/white/bgMenuCgray.gif);}
.widgetMenuCgray li.first a{ background-image:url(../img/white/bgMenuCgray.gif);}
.widgetMenuCgray li.active{ background-image:url(../img/white/bgMenuCgray.gif);}
.widgetMenuCgray li.active a{ background-image:url(../img/white/bgMenuCgray.gif);}
.widgetMenuCgray li.active li.first{ background-image:url(../img/white/arrowMenuCgray.gif);}
address.period { color:#AAA; }

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 B

Some files were not shown because too many files have changed in this diff Show more