1.0.3 배포

git-svn-id: http://xe-core.googlecode.com/svn/trunk@4211 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
zero 2008-05-16 05:27:17 +00:00
commit 182491ac14
265 changed files with 5542 additions and 2321 deletions

View file

@ -0,0 +1,25 @@
<?php
if(!defined("__ZBXE__")) exit();
/**
* @file autolink.addon.php
* @author zero (zero@nzeo.com)
* @brief 자동 링크 애드온
**/
if($called_position == 'after_module_proc' && Context::getResponseMethod()!="XMLRPC") {
Context::loadLang("./addons/autolink/lang");
$open_cur_window = Context::getLang('open_cur_window');
$open_new_window = Context::getLang('open_new_window');
$script_code = <<<EndOfScript
<script type="text/javascript">
// <![CDATA[
var url_regx = new RegExp("(http|https|ftp|news)://([-/.a-zA-Z0-9_~#%$?&=:200-377()]+)","gi"); function replaceHrefLink(obj) { while(obj) { if(obj.nodeType == 3) { var text = obj.data; if(url_regx.test(text)) { var html = text.replace(url_regx,"<a href=\"$1://$2\" onclick=\"window.open(this.href); return false;\">$1://$2</a>"); var dummy = xCreateElement('span'); xInnerHtml(dummy, html); obj.parentNode.insertBefore(dummy, obj); obj.parentNode.removeChild(obj); } } if(obj.firstChild) replaceHrefLink(obj.firstChild); obj = obj.nextSibling; } } function addUrlLink() { var objs = xGetElementsByClassName('xe_content'); if(objs.length<1) return; for(var i=0;i<objs.length;i++) { replaceHrefLink(objs[i].firstChild); xAddEventListener(objs[i], 'mouseover', showUrlOpener); } } function showUrlOpener(e) { var evt = new xEvent(e); var obj = evt.target; var layer = xGetElementById('zbXEUrlOpener'); if(!layer) { layer = xCreateElement('div'); layer.style.position = 'absolute'; layer.style.border = '3px solid #DDDDDD'; layer.style.backgroundColor = '#FFFFFF'; layer.style.padding = '5px'; layer.style.visibility = 'hidden'; layer.style.lineHeight = '1.6'; layer.setAttribute('id','zbXEUrlOpener'); document.body.appendChild(layer); } if(obj && obj.nodeName == 'A' && obj.getAttribute('href') && !/#/.test(obj.getAttribute('href'))) { var href = obj.getAttribute('href'); if(href.length>40) href = href.substr(0,40)+'...'; var html = ''+ '<a href="'+obj.getAttribute('href')+'" onclick="window.open(this.href); return false;" style="text-decoration:none; color:#555555;">'+href+'</a> [{$open_new_window}]<br />'+ '<a href="'+obj.getAttribute('href')+'" style="text-decoration:none; color:#555555;">'+href+'</a> [{$open_cur_window}]'+ ''; xInnerHtml(layer, html); xLeft(layer, evt.pageX-20); xTop(layer, evt.pageY-10); layer.style.visibility = 'visible'; } else { layer.style.visibility = 'hidden'; } } xAddEventListener(window,'load', addUrlLink);
// ]]>
</script>
EndOfScript;
Context::addHtmlHeader($script_code);
}
?>

View file

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<addon version="0.1">
<title xml:lang="ko">자동 링크 애드온</title>
<title xml:lang="zh-CN">自动链接插件</title>
<title xml:lang="es">auto vínculo addon</title>
<title xml:lang="ru">авто ссылка аддон</title>
<title xml:lang="ge">Auto-Link Addon</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2008. 4. 22">
<name xml:lang="ko">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="ru">zero</name>
<name xml:lang="ge">zero</name>
<description xml:lang="ko">
게시글과 댓글의 내용중 http로 시작되는 일반 문자열에 자동으로 링크를 걸고 각 링크에 마우스 오버시 새창과 현재창 메뉴가 나타나도록 꾸미는 애드온입니다.
</description>
<description xml:lang="zh-CN">
主题及评论中以http开始的字符串自动转换为链接。并且鼠标移到链接上方时将出现可选(新窗/本页面)提示框。
</description>
<description xml:lang="es">
Los comentarios que comienzan con http naeyongjung tema común de la cadena para vincular automáticamente a colgar el puntero del ratón sobre cada uno de los vínculos y saechang Ciudad y aparecen en el menú de add-on de decoración.
</description>
<description xml:lang="ru">
Комментарии, которые начинаются с http naeyongjung темой общей строки автоматически ссылку повесить мышь над каждой ссылке и saechang Сити и появляться на меню добавить-на украшения.
</description>
<description xml:lang="ge">
Kommentare beginnen mit http naeyongjung Thema der gemeinsamen String automatisch Link zu hängen Sie mit der Maus über die einzelnen Links und saechang Stadt und auf dem Menü des Add-On Dekoration.
</description>
</author>
</addon>

View file

@ -0,0 +1,9 @@
<?php
/**
* @file addons/autolink/lang/es.lang.php
* @author zero (zero@zeroboard.com)
* @brief 한국어 언어팩 (기본적인 내용만 수록)
**/
$lang->open_cur_window = "ventana actual";
$lang->open_new_window = "una nueva ventana";
?>

View file

@ -0,0 +1,9 @@
<?php
/**
* @file addons/autolink/lang/ge.lang.php
* @author zero (zero@zeroboard.com)
* @brief 한국어 언어팩 (기본적인 내용만 수록)
**/
$lang->open_cur_window = "aktuelle Fenster";
$lang->open_new_window = "neues Fenster";
?>

View file

@ -0,0 +1,9 @@
<?php
/**
* @file addons/autolink/lang/ko.lang.php
* @author zero (zero@zeroboard.com)
* @brief 한국어 언어팩 (기본적인 내용만 수록)
**/
$lang->open_cur_window = "현재창";
$lang->open_new_window = "새창";
?>

View file

@ -0,0 +1,9 @@
<?php
/**
* @file addons/autolink/lang/ru.lang.php
* @author zero (zero@zeroboard.com)
* @brief 한국어 언어팩 (기본적인 내용만 수록)
**/
$lang->open_cur_window = "текущем окне";
$lang->open_new_window = "Новое окно";
?>

View file

@ -0,0 +1,9 @@
<?php
/**
* @file addons/autolink/lang/ko.lang.php
* @author zero (zero@zeroboard.com)
* @brief 中文语言包
**/
$lang->open_cur_window = "本页面";
$lang->open_new_window = "新窗口";
?>

View file

@ -3,6 +3,7 @@
<title xml:lang="ko">LemonPen XE 애드온</title>
<title xml:lang="zh-CN">LemonPen XE插件</title>
<title xml:lang="en">LemonPen XE Addon</title>
<title xml:lang="ge">LemonPen XE Addon</title>
<title xml:lang="es">LemonPen XE addon</title>
<title xml:lang="ru">LemonPen XE Addon</title>
<title xml:lang="jp">LemonPen XE アドオン</title>
@ -10,11 +11,13 @@
<name xml:lang="ko">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="ge">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="ru">zero</name>
<name xml:lang="jp">zero</name>
<description xml:lang="ko">활성화 하시면 레몬펜을 사이트에 달 수 있습니다.</description>
<description xml:lang="zh-CN">要想在网站使用LemonPen插件请将此插件激活。</description>
<description xml:lang="ge">Sie können LemonPen auf der Website, wenn Sie diese aktivieren.</description>
<description xml:lang="en">You can insert LemonPen to the site when you enable this.</description>
<description xml:lang="es">Puede insertar LemonPen al sitio cuando este se activa.</description>
<description xml:lang="ru">Вы можете вставить LemonPen к месту, когда вы позволили это.</description>
@ -25,12 +28,14 @@
<title xml:lang="ko">sid</title>
<title xml:lang="zh-CN">sid</title>
<title xml:lang="en">sid</title>
<title xml:lang="ge">sid</title>
<title xml:lang="es">sid</title>
<title xml:lang="ru">sid</title>
<title xml:lang="jp">sid</title>
<description xml:lang="ko">레몬펜에서 사이트 등록시 발급받은 sid값을 입력해주세요.</description>
<description xml:lang="zh-CN">请输入注册LemonPen网站时发放的sid值。</description>
<description xml:lang="en">Please input sid value that you got after registering at the LemonPen website.</description>
<description xml:lang="ge">Bitte geben Sie Ihre SID-Wert ein, die Sie nach Registrierung auf der Website LemonPen.</description>
<description xml:lang="es">Por favor, de entrada sid valor que había que hacer después de registrarse en el sitio web LemonPen.</description>
<description xml:lang="ru">Введите замороженный ценности, которые вы получили после регистрации на сайте LemonPen.</description>
<description xml:lang="jp">レモンペンのサイトで発行されたsidを入力してください。 (LemonPenOpenmaru社提供)</description>

View file

@ -2,14 +2,10 @@
if(!defined("__ZBXE__")) exit();
/**
* @file rainbow.addon.php
* @file lemonpen.addon.php
* @author zero (zero@nzeo.com)
* @brief Rainbow link addon
*
* 링크가 걸린 텍스트에 마우스 오버를 하면 무지개색으로 변하게 하는 애드온입니다.
* rainbow.js 파일만 추가하는 것으로 끝납니다.
* rainbow.js는 http://www.dynamicdrive.com에서 제작하였으며 저작권을 가지고 있습니다.
* before_display_content 에서만 요청이 됩니다.
* @brief LemonPen addon
* 스프링노트의 레몬펜을 사이트에 설치하는 애드온입니다
**/
if(Context::getResponseMethod()=="XMLRPC") return;

View file

@ -4,6 +4,7 @@
<title xml:lang="jp">会員情報・コミュニティアドオン</title>
<title xml:lang="zh-CN">用户扩展信息</title>
<title xml:lang="en">Activation of Member's Additional Information and Communication Function.</title>
<title xml:lang="ge">Die Aktivierung der Mitglied's weitere Informations-und Kommunikations-Funktion.</title>
<title xml:lang="es">Addon para activar la función de la Información addcional del usuario y de la comunicación.</title>
<title xml:lang="ru">Аддон для предоставления дополнительной информации о пользователях и коммуникации</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 2. 28">
@ -11,6 +12,7 @@
<name xml:lang="jp">Zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="ge">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="ru">zero</name>
<description xml:lang="ko">
@ -52,6 +54,16 @@
3. When a new msessage is arrived, this will display the message in the popup window.
4. This makes available to send a message if the target is a member when MemberModel::getMemberMenu is called.
5. This adds a menu for registering as a friend when MemberModel::getMemberMenu is called.
</description>
<description xml:lang="ge">
Unter anderem Informationen über Benutzer, dieses Addon zeigt Bild Name, Bild-Marke, und Unterschrift.
Dieses Addon ist normalerweise ausgeschaltet zu verringern Ladezeit.
So zeigen Sie Image-Namen-, Bild-Marke, und die Unterschrift, wenden Sie sich bitte in diesem Addon.
1. Recht vor Anzeigen, dieses Addon wird sich für den eindeutigen Schlüssel des Mitglieds aus &lt; div class = "member_ (eindeutigen Schlüssel zu den Mitgliedern)" &gt; ....&lt; / div &gt; und ersetzen wird der Inhalt mit den Image-Namen und / oder Bild-Marke, wenn sie vorhanden sind.
2. Recht vor Anzeigen, dieses Addon wird nach &lt; div class = "document_ (eindeutigen Schlüssel des Dokuments)" ... &gt; &lt; / div &gt; und die Anzeige der Signatur in der unteren der Artikel.
3. Wenn eine neue msessage ist angekommen, dieser wird die Nachricht in einem Popup-Fenster.
4. Dies stellt eine Nachricht zu senden, wenn das Ziel ist Mitglied bei MemberModel:: getMemberMenu aufgerufen.
5. Dadurch wird ein Menü für die Eintragung als Freund, wenn MemberModel:: getMemberMenu aufgerufen.
</description>
<description xml:lang="es">
Addon que permite mostrar en la pantalla las informaciones del usuario, la imagen del nombre, Imagen de marca y la firma .

View file

@ -1,3 +1,3 @@
<?php
$lang->alert_new_message_arrived = 'You got a new message. Do you want to check now?';
$lang->alert_new_message_arrived = 'You have a new message. Do you want to check now?';
?>

View file

@ -0,0 +1,3 @@
<?php
$lang->alert_new_message_arrived = 'Sie haben eine neue Nachricht. Wollen Sie jetzt prüfen, ob?';
?>

View file

@ -39,6 +39,12 @@
// 로그인된 사용자 정보를 구함
$logged_info = Context::get('logged_info');
// 회원 로그인 정보중에서 쪽지등의 메뉴를 추가
$logged_info->menu_list['dispMemberFriend'] = 'cmd_view_friend';
$logged_info->menu_list['dispMemberMessages'] = 'cmd_view_message_box';
Context::set('logged_info', $logged_info);
$_SESSION['logged_info'] = $logged_info;
$flag_path = './files/member_extra_info/new_message_flags/'.getNumberingPath($logged_info->member_srl);
$flag_file = sprintf('%s%s', $flag_path, $logged_info->member_srl);

View file

@ -3,6 +3,7 @@
<title xml:lang="ko">OpenID delegation ID</title>
<title xml:lang="zh-CN">OpenID</title>
<title xml:lang="en">OpenID Delegation ID</title>
<title xml:lang="ge">OpenID Delegation ID</title>
<title xml:lang="es">Delegación ID para OpenID</title>
<title xml:lang="jp">OpenIDアドオン</title>
<title xml:lang="ru">Аддон для делигирования доменного имени к OpenID</title>
@ -10,6 +11,7 @@
<name xml:lang="ko">제로</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="ge">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="jp">Zero</name>
<name xml:lang="ru">Zero</name>
@ -24,6 +26,10 @@
<description xml:lang="en">
This addon enables you to use your own domain name as an OpenID.
Just be sure to set the values related with openid provider before using.
</description>
<description xml:lang="ge">
Dieses Addon ermöglicht es Ihnen, mit Ihrem eigenen Domain-Namen als OpenID.
Einfach sicher sein, dass die Werte im Zusammenhang mit OpenID-Provider, bevor Sie.
</description>
<description xml:lang="es">
Utlizando su propio dominio puede usar como OpenID.
@ -43,12 +49,14 @@
<title xml:lang="ko">server</title>
<title xml:lang="zh-CN">server</title>
<title xml:lang="en">server</title>
<title xml:lang="ge">server</title>
<title xml:lang="es">Servidor</title>
<title xml:lang="jp">server</title>
<title xml:lang="ru">server</title>
<description xml:lang="ko">openid.server 값을 입력해 주세요.</description>
<description xml:lang="zh-CN">请输入 openid.server 值。</description>
<description xml:lang="en">Please input your openid.server value.</description>
<description xml:lang="ge">Bitte geben Sie Ihre openid.server Wert.</description>
<description xml:lang="es">Ingrese el valor del openid.server.</description>
<description xml:lang="jp">openid.server の値を入力してください。</description>
<description xml:lang="ru">Пожалуйста, введите Ваше значение openid сервера.</description>
@ -56,6 +64,7 @@
<var name="delegate">
<title xml:lang="ko">delegate</title>
<title xml:lang="en">delegate</title>
<title xml:lang="ge">delegate</title>
<title xml:lang="zh-CN">delegate</title>
<title xml:lang="es">delegado</title>
<title xml:lang="jp">delegate</title>
@ -63,6 +72,7 @@
<description xml:lang="ko">openid.delegate값을 입력해주세요.</description>
<description xml:lang="zh-CN">请输入 openid.delegate 值。</description>
<description xml:lang="en">Please input your openid.delegate value.</description>
<description xml:lang="ge">Bitte geben Sie Ihre openid.delegate Wert.</description>
<description xml:lang="es">Ingresar el valor del openid.delegate</description>
<description xml:lang="jp">openid.delegate の値を入力してください。</description>
<description xml:lang="ru">Пожалуйста, введите Ваше значение openid делегата.</description>
@ -71,12 +81,14 @@
<title xml:lang="ko">xrds</title>
<title xml:lang="zh-CN">xrds</title>
<title xml:lang="en">xrds</title>
<title xml:lang="ge">xrds</title>
<title xml:lang="es">xrds</title>
<title xml:lang="jp">xrds</title>
<title xml:lang="ru">xrds</title>
<description xml:lang="ko">X-XRDS-Location값을 입력해주세요.</description>
<description xml:lang="zh-CN">请输入 X-XRDS-Location 值。</description>
<description xml:lang="en">Please input your X-XRDS-Location value.</description>
<description xml:lang="ge">Bitte geben Sie Ihre X-XRDS-Standort Wert.</description>
<description xml:lang="es">Ingresar el valor de X-XRDS-Location</description>
<description xml:lang="jp">X-XRDS-Location の値を入力してください。</description>
<description xml:lang="ru">Пожалуйста, введите Ваше значение X-XRDS-Локации.</description>

View file

@ -4,6 +4,7 @@
<title xml:lang="zh-CN">积分级别图标</title>
<title xml:lang="jp">ポイントレベルアイコン表示アドオン</title>
<title xml:lang="en">Point Level Icon</title>
<title xml:lang="ge">Point-Level-Symbol</title>
<title xml:lang="es">Addon para mostar el nivel del ícono</title>
<title xml:lang="ru">Аддон для отображения иконки уровня</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 7. 26">
@ -11,6 +12,7 @@
<name xml:lang="zh-CN">Zero</name>
<name xml:lang="jp">Zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="ge">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="ru">zero</name>
<description xml:lang="ko">
@ -28,6 +30,10 @@
<description xml:lang="en">
This addon displays level icon in front of the user name when you are using the point system.
You can choose the level icon on Module &gt; Point System.
</description>
<description xml:lang="ge">
Dieses Addon zeigt Level Icon vor dem Benutzernamen, wenn Sie die Punkte-System.
Sie können wählen, der Level Icon in Modul> Point-System.
</description>
<description xml:lang="es">
Este addon muestra el nivel del ícono delante del nombre del usuario cuando es usado el sistema de puntos.

View file

@ -3,6 +3,7 @@
<title xml:lang="ko">레인보우 링크 애드온</title>
<title xml:lang="zh-CN">Rainbow链接</title>
<title xml:lang="en">Rainbow Link Addon</title>
<title xml:lang="ge">Rainbow Link Addon</title>
<title xml:lang="es">Adición Enlace Arco Iris</title>
<title xml:lang="jp">レインボーリンクアドオン</title>
<title xml:lang="ru">Аддон для радужных ссылок</title>
@ -10,6 +11,7 @@
<name xml:lang="ko">dynamicdrive.com</name>
<name xml:lang="zh-CN">dynamicdrive.com</name>
<name xml:lang="en">dynamicdrive.com</name>
<name xml:lang="ge">dynamicdrive.com</name>
<name xml:lang="es">dynamicdrive.com</name>
<name xml:lang="jp">dynamicdrive.com</name>
<name xml:lang="ru">dynamicdrive.com</name>
@ -24,6 +26,10 @@
<description xml:lang="en">
This addon will insert the &quot;rainbow.js&quot; file to the header, which will make the linked text to get the chameleon(rainbow) color change effect.
&quot;rainbow.js&quot; Copyrightⓒ2007 &lt;a href=&quot;http://www.dynamicdrive.com&quot; target=&quot;_blank&quot;&gt;Dynamicdrive.com&lt;/a&gt;.
</description>
<description xml:lang="ge">
Dieses Addon wird ersetzt durch die &quot;rainbow.js&quot;-Datei auf den Kopf, wodurch der verlinkten Text, um das Chamäleon (Regenbogen) Farbwechsel-Effekt.
&quot;rainbow.js&quot; Copyright ⓒ 2007 &lt;a href=&quot;http://www.dynamicdrive.com&quot; target=&quot;_blank&quot;&gt; Dynamicdrive.com &lt;/a&gt;.
</description>
<description xml:lang="es">
incluye rainbow.js en header para mostrar enlaces en colores de arco iris.

View file

@ -4,6 +4,7 @@
<title xml:lang="jp">リファラー コレクター</title>
<title xml:lang="zh-CN">反向链接统计</title>
<title xml:lang="en">Referer Collector</title>
<title xml:lang="ge">Referer Collector</title>
<title xml:lang="es">Referer Collector</title>
<title xml:lang="ru">Сборщик рефералов</title>
<author email_address="haneul0318@gmail.com" link="http://haneul.zetyx.net" date="2007. 11. 26">
@ -11,6 +12,7 @@
<name xml:lang="jp">Haneul</name>
<name xml:lang="zn-CN">haneul</name>
<name xml:lang="en">haneul</name>
<name xml:lang="ge">haneul</name>
<name xml:lang="es">haneul</name>
<name xml:lang="ru">haneul</name>
<description xml:lang="ko">
@ -24,6 +26,9 @@
</description>
<description xml:lang="en">
Collect referer log and statistics.
</description>
<description xml:lang="ge">
Sammeln Sie Referer-Log und Statistik.
</description>
<description xml:lang="es">
Recoger referer log y estadísticas.

View file

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<addon version="0.1">
<title xml:lang="ko">본문내 이미지 조절 애드온</title>
<title xml:lang="zh-CN">内容区图片缩放插件</title>
<title xml:lang="es">Imagen de control add-on bonmunnae</title>
<title xml:lang="ru">Image контроля добавить-на bonmunnae</title>
<title xml:lang="ge">Image-Add-on bonmunnae</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2008. 4. 22">
<name xml:lang="ko">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="ge">zero</name>
<name xml:lang="ru">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="zh_cn">zero</name>
<name xml:lang="jp">zero</name>
<description xml:lang="ko">
본문내에 삽입된 이미지의 크기를 본문크기에 맞게 하고 클릭시 원본을 보여주는 애드온입니다.
</description>
<description xml:lang="zh-CN">
自动调整主题内容区内的图片大小,点击将显示原始大小的插件。
</description>
<description xml:lang="es">
La imagen corporal se inserta dentro del cuerpo para que se adapte al tamaño de la muestra original cuando hago clic en los add-ons.
</description>
<description xml:lang="ru">
Орган изображение вставляется внутрь тела с учетом размера первоначального шоу, когда я нажимаю на надстройки.
</description>
<description xml:lang="ge">
Body Bild eingefügt im Inneren des Körpers zu passen die Größe des Originals zeigen, wenn ich darauf klicke auf das Add-ons.
</description>
</author>
</addon>

View file

@ -0,0 +1,5 @@
@charset "utf-8";
#forOriginalImageAreaBackground { z-index:1001; background-color:#AAAAAA; top:0px; left:0px; position:relative; padding:0; border:8px solid #444444; white-space:nowrap; }
#forOriginalImageArea { visibility:hidden; padding:0px; margin:0px; width:100%; height:100%; top:0px; left:0px; position:absolute; z-index:1000; text-align:left; overflow:hidden; background-color:#000000;}
#fororiginalimage { z-index:1002; margin:0; padding:0; }

View file

@ -0,0 +1,212 @@
/**
* @brief 화면내에서 상위 영역보다 이미지가 크면 리사이즈를 하고 클릭시 원본을 보여줄수 있도록 변경
**/
function resizeImageContents() {
// 일단 모든 이미지에 대한 체크를 시작
var objs = xGetElementsByTagName("IMG");
for(var i in objs) {
var obj = objs[i];
if(!obj.parentNode) continue;
if(/\/modules\//i.test(obj.src)) continue;
if(/\/layouts\//i.test(obj.src)) continue;
if(/\/widgets\//i.test(obj.src)) continue;
if(/\/classes\//i.test(obj.src)) continue;
if(/\/common\/tpl\//i.test(obj.src)) continue;
if(/\/member_extra_info\//i.test(obj.src)) continue;
// 상위 node의 className이 document_ 또는 comment_ 로 시작하지 않으면 패스
var parent = obj.parentNode;
while(parent) {
if(parent.className && parent.className.search(/xe_content|document_|comment_/i) != -1) break;
parent = parent.parentNode;
}
if (!parent || parent.className.search(/xe_content|document_|comment_/i) < 0) continue;
if(parent.parentNode) xWidth(parent, xWidth(parent.parentNode));
parent.style.width = '100%';
parent.style.overflow = 'hidden';
var parent_width = xWidth(parent);
if(parent.parentNode && xWidth(parent.parentNode)<parent_width) parent_width = xWidth(parent.parentNode);
var obj_width = xWidth(obj);
var obj_height = xHeight(obj);
// 만약 선택된 이미지의 가로 크기가 부모의 가로크기보다 크면 리사이즈 (이때 부모의 가로크기 - 2 정도로 지정해줌)
if(obj_width > parent_width - 2) {
obj.style.cursor = "pointer";
var new_w = parent_width - 2;
var new_h = Math.round(obj_height * new_w/obj_width);
xWidth(obj, new_w);
xHeight(obj, new_h);
xAddEventListener(obj,"click", showOriginalImage);
// 선택된 이미지가 부모보다 작을 경우 일단 원본 이미지를 불러와서 비교
} else {
var orig_img = new Image();
orig_img.src = obj.src;
if(orig_img.width > parent_width - 2 || orig_img.width != obj_width) {
obj.style.cursor = "pointer";
xAddEventListener(obj,"click", showOriginalImage);
}
}
}
}
xAddEventListener(window, "load", resizeImageContents);
/**
* @brief 본문내에서 컨텐츠 영역보다 이미지의 경우 원본 크기를 보여줌
**/
function showOriginalImage(evt) {
var e = new xEvent(evt);
var obj = e.target;
var src = obj.src;
if(!xGetElementById("forOriginalImageArea")) {
var dummy = xCreateElement("div");
dummy.id = "forOriginalImageArea";
dummy.style.visibility = "hidden";
xInnerHtml(dummy, "<div id=\"forOriginalImageAreaBackground\"><img src=\""+request_uri+"common/tpl/images/blank.gif\" alt=\"original image\" border=\"0\" id=\"fororiginalimage\" /></div>");
document.body.appendChild(dummy);
}
var orig_image = xGetElementById("fororiginalimage");
var tmp_image = new Image();
tmp_image.src = src;
var image_width = tmp_image.width;
var image_height = tmp_image.height;
orig_image.style.margin = "0px 0px 0px 0px";
orig_image.style.cursor = "move";
orig_image.src = src;
var areabg = xGetElementById("forOriginalImageAreaBackground");
xWidth(areabg, image_width+16);
xHeight(areabg, image_height+16);
var area = xGetElementById("forOriginalImageArea");
xLeft(area, xScrollLeft());
xTop(area, xScrollTop());
xWidth(area, xWidth(document));
xHeight(area, xHeight(document));
area.style.visibility = "visible";
var area_width = xWidth(area);
var area_height = xHeight(area);
var x = parseInt((area_width-image_width)/2,10);
var y = parseInt((area_height-image_height)/2,10);
if(x<0) x = 0;
if(y<0) y = 0;
xLeft(areabg, x);
xTop(areabg, y);
var sel_list = xGetElementsByTagName("select");
for (var i = 0; i < sel_list.length; ++i) sel_list[i].style.visibility = "hidden";
xAddEventListener(orig_image, "mousedown", origImageDragEnable);
xAddEventListener(orig_image, "dblclick", closeOriginalImage);
xAddEventListener(window, "scroll", closeOriginalImage);
xAddEventListener(window, "resize", closeOriginalImage);
xAddEventListener(document, 'keydown',closeOriginalImage);
areabg.style.visibility = 'visible';
}
/**
* @brief 원본 이미지 보여준 닫는 함수
**/
function closeOriginalImage(evt) {
var area = xGetElementById("forOriginalImageArea");
if(area.style.visibility != "visible") return;
area.style.visibility = "hidden";
xGetElementById("forOriginalImageAreaBackground").style.visibility = "hidden";
var sel_list = xGetElementsByTagName("select");
for (var i = 0; i < sel_list.length; ++i) sel_list[i].style.visibility = "visible";
xRemoveEventListener(area, "mousedown", closeOriginalImage);
xRemoveEventListener(window, "scroll", closeOriginalImage);
xRemoveEventListener(window, "resize", closeOriginalImage);
xRemoveEventListener(document, 'keydown',closeOriginalImage);
}
/**
* @brief 원본 이미지 드래그
**/
var origDragManager = {obj:null, isDrag:false}
function origImageDragEnable(evt) {
var e = new xEvent(evt);
var obj = e.target;
if(obj.id != "fororiginalimage") return;
obj.draggable = true;
obj.startX = e.pageX;
obj.startY = e.pageY;
if(!origDragManager.isDrag) {
origDragManager.isDrag = true;
xAddEventListener(document, "mousemove", origImageDragMouseMove, false);
}
xAddEventListener(document, "mousedown", origImageDragMouseDown, false);
}
function origImageDrag(obj, px, py) {
var x = px - obj.startX;
var y = py - obj.startY;
var areabg = xGetElementById("forOriginalImageAreaBackground");
xLeft(areabg, xLeft(areabg)+x);
xTop(areabg, xTop(areabg)+y);
obj.startX = px;
obj.startY = py;
}
function origImageDragMouseDown(evt) {
var e = new xEvent(evt);
var obj = e.target;
if(obj.id != "fororiginalimage" || !obj.draggable) return;
if(obj) {
xPreventDefault(evt);
obj.startX = e.pageX;
obj.startY = e.pageY;
origDragManager.obj = obj;
xAddEventListener(document, 'mouseup', origImageDragMouseUp, false);
origImageDrag(obj, e.pageX, e.pageY);
}
}
function origImageDragMouseUp(evt) {
if(origDragManager.obj) {
xPreventDefault(evt);
xRemoveEventListener(document, 'mouseup', origImageDragMouseUp, false);
xRemoveEventListener(document, 'mousemove', origImageDragMouseMove, false);
xRemoveEventListener(document, 'mousemdown', origImageDragMouseDown, false);
origDragManager.obj.draggable = false;
origDragManager.obj = null;
origDragManager.isDrag = false;
}
}
function origImageDragMouseMove(evt) {
var e = new xEvent(evt);
var obj = e.target;
if(!obj) return;
if(obj.id != "fororiginalimage") {
xPreventDefault(evt);
xRemoveEventListener(document, 'mouseup', origImageDragMouseUp, false);
xRemoveEventListener(document, 'mousemove', origImageDragMouseMove, false);
xRemoveEventListener(document, 'mousemdown', origImageDragMouseDown, false);
origDragManager.obj.draggable = false;
origDragManager.obj = null;
origDragManager.isDrag = false;
return;
}
xPreventDefault(evt);
origDragManager.obj = obj;
xAddEventListener(document, 'mouseup', origImageDragMouseUp, false);
origImageDrag(obj, e.pageX, e.pageY);
}

View file

@ -0,0 +1,14 @@
<?php
if(!defined("__ZBXE__")) exit();
/**
* @file reaize_image.addon.php
* @author zero (zero@nzeo.com)
* @brief 본문내 이미지 조절 애드온
**/
if($called_position == 'after_module_proc' && Context::getResponseMethod()!="XMLRPC") {
Context::addJsFile('./addons/resize_image/js/resize_image.js');
Context::addCSSFile('./addons/resize_image/css/resize_image.css');
}
?>

View file

@ -10,6 +10,10 @@
* php5 쓰고 싶당.. .
**/
define('FOLLOW_REQUEST_SSL',0);
define('ENFORCE_SSL',1);
define('RELEASE_SSL',2);
class Context {
var $request_method = 'GET'; ///< @brief GET/POST/XMLRPC 중 어떤 방식으로 요청이 왔는지에 대한 값이 세팅. GET/POST/XML 3가지가 있음
@ -19,8 +23,8 @@
var $db_info = NULL; ///< @brief DB 정보
var $ssl_actions = array(); ///< @brief ssl로 전송해야 할 action등록 (common/js/xml_handler.js에서 ajax통신시 활용)
var $js_files = array(); ///< @brief display시에 사용하게 되는 js files의 목록
var $css_files = array(); ///< @brief display시에 사용하게 되는 css files의 목록
var $html_header = NULL; ///< @brief display시에 사용하게 되는 <head>..</head>내의 스크립트코드
@ -105,33 +109,29 @@
$this->_setRequestArgument();
$this->_setUploadedArgument();
// 인증관련 데이터를 Context에 설정
$oMemberModel = &getModel('member');
// 로그인되어 있지 않고 자동로그인 키값이 있으면 자동 로그인 체크
if(Context::isInstalled() && !$oMemberModel->isLogged() && $_COOKIE['xeak']) {
// 인증 관련 정보를 Context와 세션에 설정
if(Context::isInstalled()) {
// 인증관련 데이터를 Context에 설정
$oMemberModel = &getModel('member');
$oMemberController = &getController('member');
$oMemberController->doAutologin();
}
// 로그인되어 있으면 로그인 정보 기록
if($oMemberModel->isLogged()) {
$this->_set('is_logged', true);
$this->_set('logged_info', $_SESSION['logged_info']);
// 인증이 되어 있을 경우 유효성 체크
if($oMemberModel->isLogged()) {
$oMemberController->setSessionInfo();
// 로그인 되어 있지 않으면 먼저 자동 로그인을 체크 비로그인 상태 기록
} else {
$this->_set('is_logged', false);
$this->_set('logged_info', NULL);
// 인증이 되어 있지 않을 경우 자동 로그인 확인
} elseif($_COOKIE['xeak']) {
$oMemberController->doAutologin();
}
$this->_set('is_logged', $oMemberModel->isLogged() );
$this->_set('logged_info', $oMemberModel->getLoggedInfo() );
}
// rewrite 모듈사용 상태 체크
if(file_exists('./.htaccess')&&$this->db_info->use_rewrite == 'Y') $this->allow_rewrite = true;
else $this->allow_rewrite = false;
// 상대 경로 설정
$this->path = $this->getRequestUri();
// 기본 JS/CSS 등록
$this->addJsFile("./common/js/x.js");
$this->addJsFile("./common/js/common.js");
@ -148,7 +148,7 @@
if(!$val) continue;
$url .= ($url?'&':'').$key.'='.$val;
}
Context::set('current_url',sprintf('%s?%s',$this->path, $url));
Context::set('current_url',sprintf('%s?%s', $this->getRequestUri(), $url));
} else {
Context::set('current_url',$this->getUrl());
}
@ -177,13 +177,16 @@
$db_config_file = $this->getConfigFile();
if(file_exists($db_config_file)) @include($db_config_file);
if(!$db_info->time_zone) $db_info->time_zone = date("O");
if(!$db_info->use_optimizer || $db_info->use_optimizer != 'N') $db_info->use_optimizer = 'Y';
else $db_info->use_optimizer = 'N';
if(!$db_info->time_zone) $db_info->time_zone = date("O");
if(!$db_info->use_optimizer || $db_info->use_optimizer != 'N') $db_info->use_optimizer = 'Y';
else $db_info->use_optimizer = 'N';
if(!$db_info->qmail_compatibility || $db_info->qmail_compatibility != 'Y') $db_info->qmail_compatibility = 'N';
else $db_info->qmail_compatibility = 'Y';
$this->_setDBInfo($db_info);
$GLOBALS['_time_zone'] = $db_info->time_zone;
$GLOBALS['_time_zone'] = $db_info->time_zone;
$GLOBALS['_qmail_compatibility'] = $db_info->qmail_compatibility;
}
/**
@ -576,33 +579,36 @@
$var_count = count($get_vars);
if(!$var_count) return '';
if($get_vars['act'] && $this->isExistsSSLAction($get_vars['act'])) $path = $this->getRequestUri(ENFORCE_SSL);
else $path = $this->getRequestUri(RELEASE_SSL);
// rewrite모듈을 사용하고 인자의 값이 4개 이하일 경우
if($this->allow_rewrite && $var_count < 4) {
$var_keys = array_keys($get_vars);
if($var_count == 1) {
if($var_keys[0]=='mid') return $this->path.$get_vars['mid'];
elseif($var_keys[0]=='document_srl') return $this->path.$get_vars['document_srl'];
if($var_keys[0]=='mid') return $path.$get_vars['mid'];
elseif($var_keys[0]=='document_srl') return $path.$get_vars['document_srl'];
} elseif($var_count == 2) {
asort($var_keys);
$target = implode('.',$var_keys);
if($target=='act.mid' && !preg_match('/([A-Z]+)/',$get_vars['act'])) return sprintf('%s%s/%s',$this->path,$get_vars['mid'],$get_vars['act']);
elseif($target=='document_srl.mid') return sprintf('%s%s/%s',$this->path,$get_vars['mid'],$get_vars['document_srl']);
elseif($target=='act.document_srl') return sprintf('%s%s/%s',$this->path,$get_vars['document_srl'],$get_vars['act']);
elseif($target=='mid.page') return sprintf('%s%s/page/%s',$this->path,$get_vars['mid'],$get_vars['page']);
elseif($target=='category.mid') return sprintf('%s%s/category/%s',$this->path,$get_vars['mid'],$get_vars['category']);
if($target=='act.mid' && !preg_match('/([A-Z]+)/',$get_vars['act'])) return sprintf('%s%s/%s',$path,$get_vars['mid'],$get_vars['act']);
elseif($target=='document_srl.mid') return sprintf('%s%s/%s',$path,$get_vars['mid'],$get_vars['document_srl']);
elseif($target=='act.document_srl') return sprintf('%s%s/%s',$path,$get_vars['document_srl'],$get_vars['act']);
elseif($target=='mid.page') return sprintf('%s%s/page/%s',$path,$get_vars['mid'],$get_vars['page']);
elseif($target=='category.mid') return sprintf('%s%s/category/%s',$path,$get_vars['mid'],$get_vars['category']);
} elseif($var_count == 3) {
asort($var_keys);
$target = implode('.',$var_keys);
if($target=='act.document_srl.key') {
return sprintf('%s%s/%s/%s',$this->path,$get_vars['document_srl'],$get_vars['key'],$get_vars['act']);
return sprintf('%s%s/%s/%s',$path,$get_vars['document_srl'],$get_vars['key'],$get_vars['act']);
} elseif($target=='category.mid.page') {
return sprintf('%s%s/category/%s/page/%s',$this->path,$get_vars['mid'],$get_vars['category'],$get_vars['page']);
return sprintf('%s%s/category/%s/page/%s',$path,$get_vars['mid'],$get_vars['category'],$get_vars['page']);
} elseif($target=='mid.search_keyword.search_target' && $get_vars['search_target']=='tag') {
return sprintf('%s%s/tag/%s',$this->path,$get_vars['mid'],str_replace(' ','-',$get_vars['search_keyword']));
return sprintf('%s%s/tag/%s',$path,$get_vars['mid'],str_replace(' ','-',$get_vars['search_keyword']));
} elseif($target=='mid.search_keyword.search_target' && $get_vars['search_target']=='regdate') {
if(strlen($get_vars['search_keyword'])==8) return sprintf('%s%s/%04d/%02d/%02d',$this->path,$get_vars['mid'],substr($get_vars['search_keyword'],0,4),substr($get_vars['search_keyword'],4,2),substr($get_vars['search_keyword'],6,2));
elseif(strlen($get_vars['search_keyword'])==6) return sprintf('%s%s/%04d/%02d',$this->path,$get_vars['mid'],substr($get_vars['search_keyword'],0,4),substr($get_vars['search_keyword'],4,2));
if(strlen($get_vars['search_keyword'])==8) return sprintf('%s%s/%04d/%02d/%02d',$path,$get_vars['mid'],substr($get_vars['search_keyword'],0,4),substr($get_vars['search_keyword'],4,2),substr($get_vars['search_keyword'],6,2));
elseif(strlen($get_vars['search_keyword'])==6) return sprintf('%s%s/%04d/%02d',$path,$get_vars['mid'],substr($get_vars['search_keyword'],0,4),substr($get_vars['search_keyword'],4,2));
}
}
}
@ -613,14 +619,26 @@
$url .= ($url?'&':'').$key.'='.urlencode($val);
}
return $this->path.'?'.htmlspecialchars($url);
return $path.'?'.htmlspecialchars($url);
}
/**
* @brief 요청이 들어온 URL에서 argument를 제거하여 return
**/
function getRequestUri() {
return sprintf("http://%s%s",$_SERVER['HTTP_HOST'], getScriptPath());
function getRequestUri($ssl_mode = FOLLOW_REQUEST_SSL) {
switch($ssl_mode) {
case FOLLOW_REQUEST_SSL :
if($_SERVER['HTTPS']=='on') $use_ssl = true;
else $use_ssl = false;
break;
case ENFORCE_SSL :
$use_ssl = true;
break;
case RELEASE_SSL :
$use_ssl = false;
break;
}
return sprintf("%s://%s%s",$use_ssl?'https':'http',$_SERVER['HTTP_HOST'], getScriptPath());
}
/**
@ -711,6 +729,38 @@
return clone($this->get_vars);
}
/**
* @brief SSL로 인증되어야 action이 있을 경우 등록
* common/js/xml_handler.js에서 action들에 대해서 https로 전송되도록
**/
function addSSLAction($action) {
$oContext = &Context::getInstance();
return $oContext->_addSSLAction($action);
}
function _addSSLAction($action) {
if(in_array($action, $this->ssl_actions)) return;
$this->ssl_actions[] = $action;
}
function getSSLActions() {
$oContext = &Context::getInstance();
return $oContext->_getSSLActions();
}
function _getSSLActions() {
return $this->ssl_actions;
}
function isExistsSSLAction($action) {
$oContext = &Context::getInstance();
return $oContext->_isExistsSSLAction($action);
}
function _isExistsSSLAction($action) {
return in_array($action, $this->ssl_actions);
}
/**
* @brief js file을 추가
**/

View file

@ -0,0 +1,918 @@
<?php
/**
* @class DBFriebird
* @author 김현식 (dev.hyuns@gmail.com)
* @brief Firebird DBMS를 이용하기 위한 class
* @version 0.3
*
* firebird handling class
**/
class DBFireBird extends DB {
/**
* @brief Firebird DB에 접속하기 위한 정보
**/
var $hostname = '127.0.0.1'; ///< hostname
var $userid = NULL; ///< user id
var $password = NULL; ///< password
var $database = NULL; ///< database
var $prefix = 'xe'; ///< 제로보드에서 사용할 테이블들의 prefix (한 DB에서 여러개의 제로보드 설치 가능)
/**
* @brief firebird에서 사용될 column type
*
* column_type은 schema/query xml에서 공통 선언된 type을 이용하기 때문에
* DBMS에 맞게 replace 해주어야 한다
**/
var $column_type = array(
'bignumber' => 'BIGINT',
'number' => 'INTEGER',
'varchar' => 'VARCHAR',
'char' => 'CHAR',
'text' => 'BLOB SUB_TYPE TEXT SEGMENT SIZE 20',
'bigtext' => 'BLOB SUB_TYPE TEXT SEGMENT SIZE 20',
'date' => 'VARCHAR(14)',
);
/**
* @brief constructor
**/
function DBFireBird() {
$this->_setDBInfo();
$this->_connect();
}
/**
* @brief 설치 가능 여부를 return
**/
function isSupported() {
if(!function_exists('ibase_connect')) return false;
return true;
}
/**
* @brief DB정보 설정 connect/ close
**/
function _setDBInfo() {
$db_info = Context::getDBInfo();
$this->hostname = $db_info->db_hostname;
$this->port = $db_info->db_port;
$this->userid = $db_info->db_userid;
$this->password = $db_info->db_password;
$this->database = $db_info->db_database;
$this->prefix = $db_info->db_table_prefix;
if(!substr($this->prefix,-1)!='_') $this->prefix .= '_';
}
/**
* @brief DB 접속
**/
function _connect() {
// db 정보가 없으면 무시
if(!$this->hostname || !$this->userid || !$this->password || !$this->database) return;
//if(strpos($this->hostname, ':')===false && $this->port) $this->hostname .= ':'.$this->port;
// 접속시도
$host = $this->hostname.":".$this->database;
$this->fd = @ibase_connect($host, $this->userid, $this->password);
if(ibase_errmsg()) {
$this->setError(ibase_errcode(), ibase_errmsg());
return;
}
// Firebird 버전 확인후 2.0 이하면 오류 표시
if (($service = ibase_service_attach($this->hostname, $this->userid, $this->password)) != FALSE) {
// get server version and implementation strings
$server_info = ibase_server_info($service, IBASE_SVC_SERVER_VERSION);
ibase_service_detach($service);
}
else {
$this->setError(ibase_errcode(), ibase_errmsg());
return;
}
$pos = strpos($server_info, "Firebird");
if($pos !== false) {
$ver = substr($server_info, $pos+strlen("Firebird"));
$ver = trim($ver);
}
if($ver < "2.0") {
$this->setError(-1, "Zeroboard XE cannot be installed under the version of firebird 2.0. Current firebird version is ".$ver);
return;
}
// 접속체크
$this->is_connected = true;
}
/**
* @brief DB접속 해제
**/
function close() {
if(!$this->isConnected()) return;
ibase_close($this->fd);
}
/**
* @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절
**/
function addQuotes($string) {
// if(get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string));
// if(!is_numeric($string)) $string = str_replace("'","''", $string);
return $string;
}
/**
* @brief 쿼리에서 입력되는 table, column 명에 더블쿼터를 넣어줌
**/
function addDoubleQuotes($string) {
if($string == "*") return $string;
if(strpos($string, "'")!==false) {
$string = str_replace("'", "\"", $string);
}
else if(strpos($string, "\"")!==false) {
}
else {
$string = "\"".$string."\"";
}
return $string;
}
/**
* @brief 쿼리에서 입력되는 table, column 명에 더블쿼터를 넣어줌
**/
function autoQuotes($string){
$string = strtolower($string);
// substr 함수 일경우
if(strpos($string, "substr(") !== false) {
$tokken = strtok($string, "(,)");
$tokken = strtok("(,)");
while($tokken) {
$tokkens[] = $tokken;
$tokken = strtok("(,)");
}
if(count($tokkens) !== 3) return $string;
return sprintf("substring(%s from %s for %s)", $this->addDoubleQuotes($tokkens[0]), $tokkens[1], $tokkens[2]);
}
// as
$as = false;
if(($no1 = strpos($string," as ")) !== false) {
$as = substr($string, $no1, strlen($string)-$no1);
$string = substr($string, 0, $no1);
$as = str_replace(" as ", "", $as);
$as = trim($as);
$as = $this->addDoubleQuotes($as);
}
// 함수 사용시
if(($no1 = strpos($string,'('))!==false && ($no2 = strpos($string, ')'))!==false) {
$tmpString1 = substr($string, 0, $no1+1);
$tmpString2 = substr($string, $no1+1, $no2-$no1-1);
$tmpString3 = substr($string, $no2, strlen($string)-$no2+1);
$tmpString2 = trim($tmpString2);
if($tmpString2 != "*") $tmpString2 = $this->addDoubleQuotes($tmpString2);
$string = $tmpString1.$tmpString2.$tmpString3;
}
// 테이블.필드
else if(($no1 = strpos($string,'.'))!==false) {
$tmpString1 = substr($string, 0, $no1); // table
$tmpString2 = substr($string, $no1+1, strlen($string)-$no1+1); // field
$tmpString1 = trim($tmpString1);
$tmpString2 = trim($tmpString2);
$tmpString1 = $this->addDoubleQuotes($tmpString1);
if($tmpString2 != "*") $tmpString2 = $this->addDoubleQuotes($tmpString2);
$string = $tmpString1.".".$tmpString2;
}
else {
$string = $this->addDoubleQuotes($string);
}
if($as !== false) $string = $string." as ".$as;
return $string;
}
function autoValueQuotes($string, $output){
$tok = strtok($string, ",");
while($tok !== false) {
$values[] = $tok;
$tok = strtok(",");
}
foreach($values as $val) {
if(($no1 = strpos($val,'.'))!==false) {
$tmpString1 = substr($val, 0, $no1); // table
$tmpString2 = substr($val, $no1+1, strlen($val)-$no1+1); // field
$tmpString1 = trim($tmpString1);
$tmpString2 = trim($tmpString2);
$isTable = false;
foreach($output->tables as $key => $val) {
if($key == $tmpString1) $isTable = true;
}
if($isTable) {
$tmpString1 = $this->addDoubleQuotes($tmpString1);
if($tmpString2 != "*") $tmpString2 = $this->addDoubleQuotes($tmpString2);
$return[] = $tmpString1.".".$tmpString2;
}
else {
$return[] = $tmpString1.".".$tmpString2;
}
}
else if(!is_numeric($val)) {
if(strpos($val, "'") !== 0)
$return[] = "'".$val."'";
else
$return[] = $val;
}
else {
$return[] = $val;
}
}
return implode(",", $return);
}
/**
* @brief 트랜잭션 시작
**/
function begin() {
}
/**
* @brief 롤백
**/
function rollback() {
//@ibase_rollback($this->fd);
}
/**
* @brief 커밋
**/
function commit() {
//@ibase_commit($this->fd);
}
/**
* @brief : 쿼리문의 실행 결과의 fetch 처리
*
* query : query문 실행하고 result return\n
* fetch : reutrn 값이 없으면 NULL\n
* rows이면 array object\n
* row이면 object\n
* return\n
**/
function _query($query, $params=null) {
if(!$this->isConnected()) return;
if(count($params) == 0) {
// 쿼리 시작을 알림
$this->actStart($query);
// 쿼리 문 실행
$result = ibase_query($this->fd, $query);
}
else {
// 쿼리 시작을 알림
$log = $query."\n\t\t\t";
$log .= implode(",", $params);
$this->actStart($log);
// 쿼리 문 실행 (blob type 입력하기 위한 방법)
$query = ibase_prepare($this->fd, $query);
$fnarr = array_merge(array($query), $params);
$result = call_user_func_array("ibase_execute", $fnarr);
}
// 오류 체크
if(ibase_errmsg()) $this->setError(ibase_errcode(), ibase_errmsg());
// 쿼리 실행 종료를 알림
$this->actFinish();
// 결과 리턴
return $result;
}
/**
* @brief 결과를 fetch
**/
function _fetch($result, $output) {
if(!$this->isConnected() || $this->isError() || !$result) return;
while($tmp = ibase_fetch_object($result)) {
foreach($tmp as $key => $val) {
$type = $output->column_type[$key];
if($type == "text" || $type == "bigtext") {
$blob_data = ibase_blob_info($tmp->{$key});
$blob_hndl = ibase_blob_open($tmp->{$key});
$tmp->{$key} = ibase_blob_get($blob_hndl, $blob_data[0]);
ibase_blob_close($blob_hndl);
}
}
$return[] = $tmp;
}
if(count($return)==1) return $return[0];
return $return;
}
/**
* @brief 1 증가되는 sequence값을 return (firebird의 generator 값을 증가)
**/
function getNextSequence() {
$gen = "GEN_".$this->prefix."sequence_ID";
$sequence = ibase_gen_id($gen, 1);
return $sequence;
}
/**
* @brief 테이블 기생성 여부 return
**/
function isTableExists($target_name) {
$query = sprintf("select rdb\$relation_name from rdb\$relations where rdb\$system_flag=0 and rdb\$relation_name = '%s%s';", $this->prefix, $target_name);
$result = $this->_query($query);
$tmp = $this->_fetch($result);
if(!$tmp)
{
@ibase_rollback($this->fd);
return false;
}
//commit();
@ibase_commit($this->fd);
return true;
}
/**
* @brief 특정 테이블에 특정 column 추가
**/
function addColumn($table_name, $column_name, $type='number', $size='', $default = '', $notnull=false) {
$type = $this->column_type[$type];
if(strtoupper($type)=='INTEGER') $size = '';
$query = sprintf("ALTER TABLE \"%s%s\" ADD \"%s\" ", $this->prefix, $table_name, $column_name);
if($size) $query .= sprintf(" %s(%s) ", $type, $size);
else $query .= sprintf(" %s ", $type);
if($default) $query .= sprintf(" DEFAULT '%s' ", $default);
if($notnull) $query .= " NOT NULL ";
$this->_query($query);
//commit();
@ibase_commit($this->fd);
}
/**
* @brief 특정 테이블의 column의 정보를 return
**/
function isColumnExists($table_name, $column_name) {
$query = sprintf("SELECT RDB\$FIELD_NAME as \"FIELD\" FROM RDB\$RELATION_FIELDS WHERE RDB\$RELATION_NAME = '%s%s'", $this->prefix, $table_name);
$result = $this->_query($query);
if($this->isError()) return;
$output = $this->_fetch($result);
//commit();
@ibase_commit($this->fd);
if($output) {
$column_name = strtolower($column_name);
foreach($output as $key => $val) {
$name = trim(strtolower($val->FIELD));
if($column_name == $name) return true;
}
}
return false;
}
/**
* @brief 특정 테이블에 특정 인덱스 추가
* $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);
$query = sprintf('CREATE %s INDEX "%s" ON "%s%s" ("%s");', $is_unique?'UNIQUE':'', $index_name, $this->prefix, $table_name, implode('", "',$target_columns));
$this->_query($query);
//commit();
@ibase_commit($this->fd);
}
/**
* @brief 특정 테이블의 index 정보를 return
**/
function isIndexExists($table_name, $index_name) {
$query = "SELECT\n";
$query .= " RDB\$INDICES.rdb\$index_name AS Key_name\n";
$query .= "FROM\n";
$query .= " RDB\$INDICES, rdb\$index_segments\n";
$query .= "WHERE\n";
$query .= " RDB\$INDICES.rdb\$index_name = rdb\$index_segments.rdb\$index_name AND\n";
$query .= " RDB\$INDICES.rdb\$relation_name = '";
$query .= $this->prefix;
$query .= $table_name;
$query .= "' AND\n";
$query .= " RDB\$INDICES.rdb\$index_name = '";
$query .= $index_name;
$query .= "'";
$result = $this->_query($query);
if($this->isError()) return;
$output = $this->_fetch($result);
//commit();
@ibase_commit($this->fd);
for($i=0;$i<count($output);$i++) {
if(trim($output[$i]->KEY_NAME) == $index_name) return true;
}
return false;
}
/**
* @brief xml 받아서 테이블을 생성
**/
function createTableByXml($xml_doc) {
return $this->_createTable($xml_doc);
}
/**
* @brief xml 받아서 테이블을 생성
**/
function createTableByXmlFile($file_name) {
if(!file_exists($file_name)) return;
// xml 파일을 읽음
$buff = FileHandler::readFile($file_name);
return $this->_createTable($buff);
}
/**
* @brief schema xml을 이용하여 create table query생성
*
* type : number, varchar, text, char, date, \n
* opt : notnull, default, size\n
* index : primary key, index, unique\n
**/
function _createTable($xml_doc) {
// xml parsing
$oXml = new XmlParser();
$xml_obj = $oXml->parse($xml_doc);
// 테이블 생성 schema 작성
$table_name = $xml_obj->table->attrs->name;
if($this->isTableExists($table_name)) return;
$table_name = $this->prefix.$table_name;
if(!is_array($xml_obj->table->column)) $columns[] = $xml_obj->table->column;
else $columns = $xml_obj->table->column;
foreach($columns as $column) {
$name = $column->attrs->name;
$type = $column->attrs->type;
$size = $column->attrs->size;
$notnull = $column->attrs->notnull;
$primary_key = $column->attrs->primary_key;
$index = $column->attrs->index;
$unique = $column->attrs->unique;
$default = $column->attrs->default;
$auto_increment = $column->attrs->auto_increment;
if($this->column_type[$type]=='INTEGER') $size = null;
else if($this->column_type[$type]=='VARCHAR' && !$size) $size = 256;
$column_schema[] = sprintf('"%s" %s%s %s %s',
$name,
$this->column_type[$type],
$size?'('.$size.')':'',
$default?"DEFAULT '".$default."'":"",
$notnull?'NOT NULL':'');
if($auto_increment) $auto_increment_list[] = $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\")%s", implode("\",\"", $primary_list), "\n");
}
if(count($unique_list)) {
foreach($unique_list as $key => $val) {
$column_schema[] = sprintf("UNIQUE(\"%s\")%s", implode("\",\"", $val), "\n");
}
}
$schema = sprintf("CREATE TABLE \"%s\" (%s%s); \n", $table_name, "\n", implode($column_schema, ",\n"));
$output = $this->_query($schema);
//commit();
@ibase_commit($this->fd);
if(!$output) return false;
if(count($index_list)) {
foreach($index_list as $key => $val) {
// index name = prefix + table name + index_list
// index name 크기가 31byte로 제한되어 있어 중복되지 않을만큼 테이블명을 줄임
// prefix name을 2byte 보다 크게 할 경우 31byte를 넘는 index name이 생김
// 더 좋은 방법을 찾아봐야겠음.
$tok = strtok($table_name, "_");
$index_name = $this->prefix;
$tok = strtok("_");
$index_name .= substr($tok, 0, 2);
$index_name .= substr($tok, -1, 1);
$tok = strtok("_");
while($tok !== false) {
$index_name .= substr($tok, 0, 1);
$tok = strtok("_");
}
$schema = sprintf("CREATE INDEX \"%s_%s\" ON \"%s\" (\"%s\");",
$index_name, $key, $table_name, implode($val, "\",\""));
$output = $this->_query($schema);
//commit();
@ibase_commit($this->fd);
if(!$output) return false;
}
}
foreach($auto_increment_list as $increment) {
$schema = sprintf('CREATE GENERATOR GEN_%s_ID;', $table_name);
$output = $this->_query($schema);
@ibase_commit($this->fd);
if(!$output) return false;
// Firebird에서 auto increment는 generator를 만들어 insert 발생시 트리거를 실행시켜
// generator의 값을 증가시키고 그값을 테이블에 넣어주는 방식을 사용함.
// 아래 트리거가 auto increment 역할을 하지만 쿼리로 트리거 등록이 되지 않아 주석처리 하였음.
// php 함수에서 generator 값을 증가시켜 주는 함수가 있어 제로보드에서는 굳이
// auto increment를 사용 할 필요가 없어보임.
/*
$schema = 'SET TERM ^ ; ';
$schema .= sprintf('CREATE TRIGGER "%s_BI" FOR "%s" ', $table_name, $table_name);
$schema .= 'ACTIVE BEFORE INSERT POSITION 0 ';
$schema .= sprintf('AS BEGIN IF (NEW."%s" IS NULL) THEN ', $increment);
$schema .= sprintf('NEW."%s" = GEN_ID("GEN_%s_ID",1);', $increment, $table_name);
$schema .= 'END^ SET TERM ; ^';
$output = $this->_query($schema);
if(!$output) return false;
*/
}
}
/**
* @brief 조건문 작성하여 return
**/
function getCondition($output) {
if(!$output->conditions) return;
foreach($output->conditions as $key => $val) {
$sub_condition = '';
foreach($val['condition'] as $k =>$v) {
if(!$v['value']) continue;
$name = $v['column'];
$operation = $v['operation'];
$value = $v['value'];
$type = $this->getColumnType($output->column_type,$name);
$pipe = $v['pipe'];
$value = $this->getConditionValue('"'.$name.'"', $value, $operation, $type, $output->column_type);
if(!$value) $value = $v['value'];
$name = $this->autoQuotes($name);
$value = $this->autoValueQuotes($value, $output);
$str = $this->getConditionPart($name, $value, $operation);
if($sub_condition) $sub_condition .= ' '.$pipe.' ';
$sub_condition .= $str;
}
if($sub_condition) {
if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' ';
$condition .= '('.$sub_condition.')';
}
}
if($condition) $condition = ' Where '.$condition;
return $condition;
}
/**
* @brief insertAct 처리
**/
function _executeInsertAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = '"'.$this->prefix.$val.'"';
}
// 컬럼 정리
foreach($output->columns as $key => $val) {
$name = $val['name'];
$value = $val['value'];
$value = str_replace("'", "`", $value);
if($output->column_type[$name]=="text" || $output->column_type[$name]=="bigtext"){
$blh = ibase_blob_create($this->fd);
ibase_blob_add($blh, $value);
$value = ibase_blob_close($blh);
}
else if($output->column_type[$name]!='number') {
// if(!$value) $value = 'null';
} elseif(!$value || is_numeric($value)) $value = (int)$value;
$column_list[] = '"'.$name.'"';
$value_list[] = $value;
$questions[] = "?";
}
$query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $questions));
$result = $this->_query($query, $value_list);
@ibase_commit($this->fd);
return $result;
}
/**
* @brief updateAct 처리
**/
function _executeUpdateAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = '"'.$this->prefix.$val.'"';
}
// 컬럼 정리
foreach($output->columns as $key => $val) {
if(!isset($val['value'])) continue;
$name = $val['name'];
$value = $val['value'];
$value = str_replace("'", "`", $value);
if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value;
else {
if($output->column_type[$name]=="text" || $output->column_type[$name]=="bigtext"){
$blh = ibase_blob_create($this->fd);
ibase_blob_add($blh, $value);
$value = ibase_blob_close($blh);
}
else if($output->column_type[$name]!='number') {
//$value = "'".$value."'";
}
elseif(!$value || is_numeric($value)) {
$value = (int)$value;
}
if(strlen($value) != 0) {
if(($pos = strpos($value, '+1')) !== false) {
$substr = substr($value, 0, $pos);
$value = '"'.$substr.'"'."+1";
$column_list[] = sprintf("\"%s\" = %s", $name, $value);
continue;
}
}
$values[] = $value;
$column_list[] = sprintf('"%s" = ?', $name);
}
}
// 조건절 정리
$condition = $this->getCondition($output);
$query = sprintf("update %s set %s %s;", implode(',',$table_list), implode(',',$column_list), $condition);
$result = $this->_query($query, $values);
@ibase_commit($this->fd);
return $result;
}
/**
* @brief deleteAct 처리
**/
function _executeDeleteAct($output) {
// 테이블 정리
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);
$result = $this->_query($query);
@ibase_commit($this->fd);
return $result;
}
/**
* @brief selectAct 처리
*
* select의 경우 특정 페이지의 목록을 가져오는 것을 편하게 하기 위해\n
* navigation이라는 method를 제공
**/
function _executeSelectAct($output) {
// 테이블 정리
$table_list = array();
foreach($output->tables as $key => $val) {
$table_list[] = sprintf("\"%s%s\" as \"%s\"", $this->prefix, $val, $key);
}
if(!$output->columns) {
$columns = '*';
} else {
$column_list = array();
foreach($output->columns as $key => $val) {
$name = $val['name'];
$alias = $val['alias'];
if($alias == "")
$column_list[] = $this->autoQuotes($name);
else
$column_list[] = sprintf("%s as \"%s\"", $this->autoQuotes($name), $alias);
}
$columns = implode(',',$column_list);
}
$condition = $this->getCondition($output);
if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $condition, $output);
// list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가
if($output->order) {
$conditions = $this->getConditionList($output);
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);
}
}
}
// list_count를 사용할 경우 적용
if($output->list_count['value']) $limit = sprintf('FIRST %d', $output->list_count['value']);
else $limit = '';
$query = sprintf("select %s %s from %s %s", $limit, $columns, implode(',',$table_list), $condition);
if($output->groups) {
foreach($output->groups as $key => $val) {
$group_list[] = $this->autoQuotes($val);
}
if(count($group_list)) $query .= sprintf(" group by %s", implode(",",$group_list));
}
if($output->order) {
foreach($output->order as $key => $val) {
$index_list[] = sprintf("%s %s", $this->autoQuotes($val[0]), $val[1]);
}
if(count($index_list)) $query .= sprintf(" order by %s", implode(",",$index_list));
}
$query .= ";";
$result = $this->_query($query);
if($this->isError()) return;
$data = $this->_fetch($result, $output);
@ibase_commit($this->fd);
$buff = new Object();
$buff->data = $data;
return $buff;
}
/**
* @brief query xml에 navigation 정보가 있을 경우 페이징 관련 작업을 처리한다
*
* 그닥 좋지는 않은 구조이지만 편리하다.. -_-;
**/
function _getNavigationData($table_list, $columns, $condition, $output) {
require_once('./classes/page/PageHandler.class.php');
// 전체 개수를 구함
$count_query = sprintf('select count(*) as "count" from %s %s;', implode(',',$table_list), $condition);
$total_count = $this->getCountCache($output->tables, $condition);
if($total_count === false) {
$result = $this->_query($count_query);
$count_output = $this->_fetch($result);
@ibase_commit($this->fd);
$total_count = (int)$count_output->count;
$this->putCountCache($output->tables, $condition, $total_count);
}
$list_count = $output->list_count['value'];
if(!$list_count) $list_count = 20;
$page_count = $output->page_count['value'];
if(!$page_count) $page_count = 10;
$page = $output->page['value'];
if(!$page) $page = 1;
// 전체 페이지를 구함
if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1;
else $total_page = 1;
// 페이지 변수를 체크
if($page > $total_page) $page = $total_page;
$start_count = ($page-1)*$list_count;
// list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가
if($output->order) {
$conditions = $this->getConditionList($output);
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);
}
}
}
$limit = sprintf('FIRST %d SKIP %d ', $list_count, $start_count);
$query = sprintf('SELECT %s %s FROM %s %s', $limit, $columns, implode(',',$table_list), $condition);
if($output->groups) {
foreach($output->groups as $key => $val) {
$group_list[] = $this->autoQuotes($val);
}
if(count($group_list)) $query .= sprintf(" GROUP BY %s", implode(",",$group_list));
}
if($output->order) {
foreach($output->order as $key => $val) {
$index_list[] = sprintf("%s %s", $this->autoQuotes($val[0]), $val[1]);
}
if(count($index_list)) $query .= sprintf(" ORDER BY %s", implode(",",$index_list));
}
$query .= ";";
$result = $this->_query($query);
if($this->isError()) {
$buff = new Object();
$buff->total_count = 0;
$buff->total_page = 0;
$buff->page = 1;
$buff->data = array();
$buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count);
return $buff;
}
$virtual_no = $total_count - ($page-1)*$list_count;
while($tmp = ibase_fetch_object($result)) {
foreach($tmp as $key => $val){
$type = $output->column_type[$key];
if($type == "text" || $type == "bigtext") {
$blob_data = ibase_blob_info($tmp->{$key});
$blob_hndl = ibase_blob_open($tmp->{$key});
$tmp->{$key} = ibase_blob_get($blob_hndl, $blob_data[0]);
ibase_blob_close($blob_hndl);
}
}
$data[$virtual_no--] = $tmp;
}
@ibase_commit($this->fd);
$buff = new Object();
$buff->total_count = $total_count;
$buff->total_page = $total_page;
$buff->page = $page;
$buff->data = $data;
$buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count);
return $buff;
}
}
?>

View file

@ -45,14 +45,13 @@
$layout_file = $oModule->getLayoutFile();
$edited_layout_file = $oModule->getEditedLayoutFile();
}
if(!$layout_path) $layout_path = './common/tpl/';
if(!$layout_file) $layout_file = 'default_layout.html';
$zbxe_final_content = $oTemplate->compile($layout_path, $layout_file, $edited_layout_file);
if(__DEBUG__==3) $GLOBALS['__layout_compile_elapsed__'] = getMicroTime()-$start;
// 각 위젯, 에디터 컴포넌트의 코드 변경
if(__DEBUG__==3) $start = getMicroTime();

View file

@ -62,26 +62,27 @@
function send() {
$boundary = '----=='.uniqid(rand(),true);
$eol = $GLOBALS['_qmail_compatibility'] == "Y" ? "\n" : "\r\n";
$headers = sprintf(
"From: %s\r\n".
"MIME-Version: 1.0\r\n".
"Content-Type: multipart/alternative;\r\n\tboundary=\"%s\"\r\n\r\n".
"From: %s".$eol.
"MIME-Version: 1.0".$eol.
"Content-Type: multipart/alternative;".$eol."\tboundary=\"%s\"".$eol.$eol.
"",
$this->getSender(),
$boundary
);
$body = sprintf(
"--%s\r\n".
"Content-Type: text/plain; charset=utf-8; format=flowed\r\n".
"Content-Transfer-Encoding: base64\r\n".
"Content-Disposition: inline\r\n\r\n".
"--%s".$eol.
"Content-Type: text/plain; charset=utf-8; format=flowed".$eol.
"Content-Transfer-Encoding: base64".$eol.
"Content-Disposition: inline".$eol.$eol.
"%s".
"--%s\r\n".
"Content-Type: text/html; charset=utf-8\r\n".
"Content-Transfer-Encoding: base64\r\n".
"Content-Disposition: inline\r\n\r\n".
"--%s".$eol.
"Content-Type: text/html; charset=utf-8".$eol.
"Content-Transfer-Encoding: base64".$eol.
"Content-Disposition: inline".$eol.$eol.
"%s".
"--%s--".
"",

View file

@ -334,12 +334,20 @@
$oModule->setModule($module);
$oModule->setModulePath($class_path);
// 요청된 module에 constructor가 있으면 실행
if(!isset($GLOBALS['_called_constructor'][$instance_name])) {
$GLOBALS['_called_constructor'][$instance_name] = true;
if(@method_exists($oModule, $instance_name)) $oModule->{$instance_name}();
}
// GLOBALS 변수에 생성된 객체 저장
$GLOBALS['_loaded_module'][$module][$type][$kind] = $oModule;
}
if(__DEBUG__==3) $GLOBALS['__elapsed_class_load__'] += getMicroTime() - $start_time;
// init method가 있으면 실행
// 객체 리턴
return $GLOBALS['_loaded_module'][$module][$type][$kind];
}

View file

@ -89,10 +89,6 @@ a.bold { font-weight:bold; }
/* xe layer */
#waitingforserverresponse { border:2px solid #444444; font-weight:bold; color:#444444; padding: 7px 5px 5px 25px; background:#FFFFFF url("../tpl/images/loading.gif") no-repeat 5px 5px; top:40px; left:40px; position:absolute; z-index:100; visibility:hidden; }
#fororiginalimageareabg { z-index:1001; background-color:#FFFFFF; width:100%; height:100%; top:0px; left:0px; position:relative; padding:20px 10px 10px 10px; border:8px solid #DDDDDD; }
#fororiginalimagearea { visibility:hidden; padding:0px; margin:0px; width:100%; height:100%; top:0px; left:0px; position:absolute; z-index:1000; text-align:left; overflow:hidden; }
#fororiginalimage { z-index:1002; }
#closeOriginalImageBtn { position:absolute; right:8px; top:5px; cursor:pointer; width:50px; height:12px; z-index:1003; }
#popup_menu_area { position:absolute; left:0px; top:0px; z-index:1003; visibility:hidden; border:2px solid #D9D9D9; background-color:#FFFFFF; padding:0; }
#popup_menu_area .box { border:1px solid #CACACA; background-color:#FFFFFF; padding:7px; }
#popup_menu_area .item { color:#333333; cursor:pointer; margin:0; padding:3px 0 3px 0; white-space:nowrap; }

View file

@ -1,6 +1,6 @@
// ** I18N
// Calendar EN language
// DyCalendar EN language
// Author: Mihai Bazon, <mihai_bazon@yahoo.com>
// Encoding: any
// Distributed under the same terms as the calendar itself.
@ -10,7 +10,7 @@
// include your contact information in the header, as can be seen above.
// full day names
Calendar._DN = new Array
DyCalendar._DN = new Array
("Sunday",
"Monday",
"Tuesday",
@ -25,15 +25,15 @@ Calendar._DN = new Array
// for exemplification on how one can customize the short day names, but if
// they are simply the first N letters of the full name you can simply say:
//
// Calendar._SDN_len = N; // short day name length
// Calendar._SMN_len = N; // short month name length
// DyCalendar._SDN_len = N; // short day name length
// DyCalendar._SMN_len = N; // short month name length
//
// If N = 3 then this is not needed either since we assume a value of 3 if not
// present, to be compatible with translation files that were written before
// this feature.
// short day names
Calendar._SDN = new Array
DyCalendar._SDN = new Array
("Sun",
"Mon",
"Tue",
@ -45,10 +45,10 @@ Calendar._SDN = new Array
// First day of the week. "0" means display Sunday first, "1" means display
// Monday first, etc.
Calendar._FD = 0;
DyCalendar._FD = 0;
// full month names
Calendar._MN = new Array
DyCalendar._MN = new Array
("January",
"February",
"March",
@ -63,7 +63,7 @@ Calendar._MN = new Array
"December");
// short month names
Calendar._SMN = new Array
DyCalendar._SMN = new Array
("Jan",
"Feb",
"Mar",
@ -78,10 +78,10 @@ Calendar._SMN = new Array
"Dec");
// tooltips
Calendar._TT = {};
Calendar._TT["INFO"] = "About the calendar";
DyCalendar._TT = {};
DyCalendar._TT["INFO"] = "About the calendar";
Calendar._TT["ABOUT"] =
DyCalendar._TT["ABOUT"] =
"DHTML Date/Time Selector\n" +
"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
@ -91,37 +91,37 @@ Calendar._TT["ABOUT"] =
"- Use the \xab, \xbb buttons to select year\n" +
"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +
"- Hold mouse button on any of the above buttons for faster selection.";
Calendar._TT["ABOUT_TIME"] = "\n\n" +
DyCalendar._TT["ABOUT_TIME"] = "\n\n" +
"Time selection:\n" +
"- Click on any of the time parts to increase it\n" +
"- or Shift-click to decrease it\n" +
"- or click and drag for faster selection.";
Calendar._TT["PREV_YEAR"] = "Prev. year (hold for menu)";
Calendar._TT["PREV_MONTH"] = "Prev. month (hold for menu)";
Calendar._TT["GO_TODAY"] = "Go Today";
Calendar._TT["NEXT_MONTH"] = "Next month (hold for menu)";
Calendar._TT["NEXT_YEAR"] = "Next year (hold for menu)";
Calendar._TT["SEL_DATE"] = "Select date";
Calendar._TT["DRAG_TO_MOVE"] = "Drag to move";
Calendar._TT["PART_TODAY"] = " (today)";
DyCalendar._TT["PREV_YEAR"] = "Prev. year (hold for menu)";
DyCalendar._TT["PREV_MONTH"] = "Prev. month (hold for menu)";
DyCalendar._TT["GO_TODAY"] = "Go Today";
DyCalendar._TT["NEXT_MONTH"] = "Next month (hold for menu)";
DyCalendar._TT["NEXT_YEAR"] = "Next year (hold for menu)";
DyCalendar._TT["SEL_DATE"] = "Select date";
DyCalendar._TT["DRAG_TO_MOVE"] = "Drag to move";
DyCalendar._TT["PART_TODAY"] = " (today)";
// the following is to inform that "%s" is to be the first day of week
// %s will be replaced with the day name.
Calendar._TT["DAY_FIRST"] = "Display %s first";
DyCalendar._TT["DAY_FIRST"] = "Display %s first";
// This may be locale-dependent. It specifies the week-end days, as an array
// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
// means Monday, etc.
Calendar._TT["WEEKEND"] = "0,6";
DyCalendar._TT["WEEKEND"] = "0,6";
Calendar._TT["CLOSE"] = "Close";
Calendar._TT["TODAY"] = "Today";
Calendar._TT["TIME_PART"] = "(Shift-)Click or drag to change value";
DyCalendar._TT["CLOSE"] = "Close";
DyCalendar._TT["TODAY"] = "Today";
DyCalendar._TT["TIME_PART"] = "(Shift-)Click or drag to change value";
// date formats
Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
DyCalendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
DyCalendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
Calendar._TT["WK"] = "wk";
Calendar._TT["TIME"] = "Time:";
DyCalendar._TT["WK"] = "wk";
DyCalendar._TT["TIME"] = "Time:";

133
common/js/calendar-es.js Normal file
View file

@ -0,0 +1,133 @@
// ** I18N
// DyCalendar KO language
// Author: Mihai Bazon, <mihai_bazon@yahoo.com>
// Translation: Bradly1, <bradly1@paran.com>
// Encoding: UTF-8
// lang : es
// Distributed under the same terms as the calendar itself.
// For translators: please use UTF-8 if possible. We strongly believe that
// Unicode is the answer to a real internationalized world. Also please
// include your contact information in the header, as can be seen above.
// full day names
DyCalendar._DN = new Array
("Domingo",
"Lunes",
"Martes",
"Miércoles",
"Jueves",
"Viernes",
"Sábado",
"Domingo");
// Please note that the following array of short day names (and the same goes
// for short month names, _SMN) isn't absolutely necessary. We give it here
// for exemplification on how one can customize the short day names, but if
// they are simply the first N letters of the full name you can simply say:
//
// DyCalendar._SDN_len = N; // short day name length
// DyCalendar._SMN_len = N; // short month name length
//
// If N = 3 then this is not needed either since we assume a value of 3 if not
// present, to be compatible with translation files that were written before
// this feature.
// short day names
DyCalendar._SDN = new Array
("Domingo",
"Lunes",
"Martes",
"Miércoles",
"Jueves",
"Viernes",
"Sábado",
"Domingo");
// First day of the week. "0" means display Sunday first, "1" means display
// Monday first, etc.
DyCalendar._FD = 0;
// full month names
DyCalendar._MN = new Array
("Enero",
"Febrero",
"Marzo",
"Abril",
"Mayo",
"Junio",
"Julio",
"Agosto",
"Septiembre",
"Octubre",
"Noviembre",
"Diciembre");
// short month names
DyCalendar._SMN = new Array
("Enero",
"Febrero",
"Marzo",
"Abril",
"Mayo",
"Junio",
"Julio",
"Agosto",
"Septiembre",
"Octubre",
"Noviembre",
"Diciembre");
// tooltips
DyCalendar._TT = {};
DyCalendar._TT["INFO"] = "Sobre el calendario";
DyCalendar._TT["ABOUT"] =
"DHTML Date/Time Selector\n" +
"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
"\n"+
"최신 버전을 받으시려면 http://www.dynarch.com/projects/calendar/ 에 방문하세요\n" +
"\n"+
"GNU LGPL 라이센스로 배포됩니다. \n"+
"라이센스에 대한 자세한 내용은 http://gnu.org/licenses/lgpl.html 을 읽으세요." +
"\n\n" +
"날짜 선택:\n" +
"- 연도를 선택하려면 \xab, \xbb 버튼을 사용합니다\n" +
"- 달을 선택하려면 " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " 버튼을 누르세요\n" +
"- 계속 누르고 있으면 위 값들을 빠르게 선택하실 수 있습니다.";
DyCalendar._TT["ABOUT_TIME"] = "\n\n" +
"시간 선택:\n" +
"- 마우스로 누르면 시간이 증가합니다\n" +
"- Shift 키와 함께 누르면 감소합니다\n" +
"- 누른 상태에서 마우스를 움직이면 좀 더 빠르게 값이 변합니다.\n";
DyCalendar._TT["PREV_YEAR"] = "Prev. año (mantener para menu)";
DyCalendar._TT["PREV_MONTH"] = "Prev. mes (mantener para menu)";
DyCalendar._TT["GO_TODAY"] = "Ir Hoy";
DyCalendar._TT["NEXT_MONTH"] = "El mes próximo (mantener para menu)";
DyCalendar._TT["NEXT_YEAR"] = "El año que viene (mantener para menu)";
DyCalendar._TT["SEL_DATE"] = "Seleccionar fecha";
DyCalendar._TT["DRAG_TO_MOVE"] = "Arrastra para mover";
DyCalendar._TT["PART_TODAY"] = " (hoy)";
// the following is to inform that "%s" is to be the first day of week
// %s will be replaced with the day name.
DyCalendar._TT["DAY_FIRST"] = "Mostrar% s primero";
// This may be locale-dependent. It specifies the week-end days, as an array
// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
// means Monday, etc.
DyCalendar._TT["WEEKEND"] = "0,6";
DyCalendar._TT["CLOSE"] = "Cerrar";
DyCalendar._TT["TODAY"] = "Hoy";
DyCalendar._TT["TIME_PART"] = "(Shift-) Haga clic o arrastre para cambiar el valor";
// date formats
DyCalendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
DyCalendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
DyCalendar._TT["WK"] = "wk";
DyCalendar._TT["TIME"] = "Tiempo:";

129
common/js/calendar-ge.js Normal file
View file

@ -0,0 +1,129 @@
// ** I18N
// DyCalendar KO language
// Author: Mihai Bazon, <mihai_bazon@yahoo.com>
// Translation: bradly1, <bradly1@paran.com>
// Encoding: UTF-8
// lang : ge
// Distributed under the same terms as the calendar itself.
// For translators: please use UTF-8 if possible. We strongly believe that
// Unicode is the answer to a real internationalized world. Also please
// include your contact information in the header, as can be seen above.
// full day names
DyCalendar._DN = new Array
("Sonntag",
"Montag",
"Dienstag",
"Mittwoch",
"Donnerstag",
"Freitag",
"Samstag",
"Sonntag");
// Please note that the following array of short day names (and the same goes
// for short month names, _SMN) isn't absolutely necessary. We give it here
// for exemplification on how one can customize the short day names, but if
// they are simply the first N letters of the full name you can simply say:
//
// DyCalendar._SDN_len = N; // short day name length
// DyCalendar._SMN_len = N; // short month name length
//
// If N = 3 then this is not needed either since we assume a value of 3 if not
// present, to be compatible with translation files that were written before
// this feature.
// short day names
DyCalendar._SDN = new Array
("Sonntag",
"Montag",
"Dienstag",
"Mittwoch",
"Donnerstag",
"Freitag",
"Samstag",
"Sonntag");
// First day of the week. "0" means display Sunday first, "1" means display
// Monday first, etc.
DyCalendar._FD = 0;
// full month names
DyCalendar._MN = new Array
("Januar",
"Februar",
"März",
"April",
"Mai",
"Juni",
"Juli",
"August",
"September",
"Oktober",
"November",
"Dezember");
// short month names
DyCalendar._SMN = new Array
("Januar",
"Februar",
"März",
"April",
"Mai",
"Juni",
"Juli",
"August",
"September",
"Oktober",
"November",
"Dezember");
// tooltips
DyCalendar._TT = {};
DyCalendar._TT["INFO"] = "Über den Kalender";
DyCalendar._TT["ABOUT"] =
"DHTML Date/Time Selector\n" +
"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
"\n\n" +
"Date selection:\n" +
"- Use the \xab, \xbb buttons to select year\n" +
"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +
"- Hold mouse button on any of the above buttons for faster selection.";
DyCalendar._TT["ABOUT_TIME"] = "\n\n" +
"Time selection:\n" +
"- Click on any of the time parts to increase it\n" +
"- or Shift-click to decrease it\n" +
"- or click and drag for faster selection.";
DyCalendar._TT["PREV_YEAR"] = "Prev. Jahr (halten für Menü)";
DyCalendar._TT["PREV_MONTH"] = "Prev. Monat (halten für Menü)";
DyCalendar._TT["GO_TODAY"] = "Gehe Heute";
DyCalendar._TT["NEXT_MONTH"] = "Nächsten Monat (halten für Menü)";
DyCalendar._TT["NEXT_YEAR"] = "Nächstes Jahr (halten für Menü)";
DyCalendar._TT["SEL_DATE"] = "Wählen Sie das Datum";
DyCalendar._TT["DRAG_TO_MOVE"] = "Per Drag & Drop verschieben";
DyCalendar._TT["PART_TODAY"] = " (heute)";
// the following is to inform that "%s" is to be the first day of week
// %s will be replaced with the day name.
DyCalendar._TT["DAY_FIRST"] = "Anzeige% s erste";
// This may be locale-dependent. It specifies the week-end days, as an array
// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
// means Monday, etc.
DyCalendar._TT["WEEKEND"] = "0,6";
DyCalendar._TT["CLOSE"] = "Schließen";
DyCalendar._TT["TODAY"] = "Heute";
DyCalendar._TT["TIME_PART"] = "(Shift-)Klicken Sie oder ziehen Sie ändern Wert";
// date formats
DyCalendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
DyCalendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
DyCalendar._TT["WK"] = "wk";
DyCalendar._TT["TIME"] = "Zeit:";

View file

@ -1,6 +1,6 @@
// ** I18N
// Calendar KO language
// DyCalendar KO language
// Author: Mihai Bazon, <mihai_bazon@yahoo.com>
// Translation: Yourim Yi <yyi@yourim.net>
// Encoding: UTF-8
@ -13,7 +13,7 @@
// full day names
Calendar._DN = new Array
DyCalendar._DN = new Array
("일요일",
"월요일",
"화요일",
@ -28,15 +28,15 @@ Calendar._DN = new Array
// for exemplification on how one can customize the short day names, but if
// they are simply the first N letters of the full name you can simply say:
//
// Calendar._SDN_len = N; // short day name length
// Calendar._SMN_len = N; // short month name length
// DyCalendar._SDN_len = N; // short day name length
// DyCalendar._SMN_len = N; // short month name length
//
// If N = 3 then this is not needed either since we assume a value of 3 if not
// present, to be compatible with translation files that were written before
// this feature.
// short day names
Calendar._SDN = new Array
DyCalendar._SDN = new Array
("일",
"월",
"화",
@ -47,7 +47,7 @@ Calendar._SDN = new Array
"일");
// full month names
Calendar._MN = new Array
DyCalendar._MN = new Array
("1월",
"2월",
"3월",
@ -62,7 +62,7 @@ Calendar._MN = new Array
"12월");
// short month names
Calendar._SMN = new Array
DyCalendar._SMN = new Array
("1",
"2",
"3",
@ -77,10 +77,10 @@ Calendar._SMN = new Array
"12");
// tooltips
Calendar._TT = {};
Calendar._TT["INFO"] = "calendar 소개";
DyCalendar._TT = {};
DyCalendar._TT["INFO"] = "calendar 소개";
Calendar._TT["ABOUT"] =
DyCalendar._TT["ABOUT"] =
"DHTML Date/Time Selector\n" +
"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
"\n"+
@ -93,32 +93,32 @@ Calendar._TT["ABOUT"] =
"- 연도를 선택하려면 \xab, \xbb 버튼을 사용합니다\n" +
"- 달을 선택하려면 " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " 버튼을 누르세요\n" +
"- 계속 누르고 있으면 위 값들을 빠르게 선택하실 수 있습니다.";
Calendar._TT["ABOUT_TIME"] = "\n\n" +
DyCalendar._TT["ABOUT_TIME"] = "\n\n" +
"시간 선택:\n" +
"- 마우스로 누르면 시간이 증가합니다\n" +
"- Shift 키와 함께 누르면 감소합니다\n" +
"- 누른 상태에서 마우스를 움직이면 좀 더 빠르게 값이 변합니다.\n";
Calendar._TT["PREV_YEAR"] = "지난 해 (길게 누르면 목록)";
Calendar._TT["PREV_MONTH"] = "지난 달 (길게 누르면 목록)";
Calendar._TT["GO_TODAY"] = "오늘 날짜로";
Calendar._TT["NEXT_MONTH"] = "다음 달 (길게 누르면 목록)";
Calendar._TT["NEXT_YEAR"] = "다음 해 (길게 누르면 목록)";
Calendar._TT["SEL_DATE"] = "날짜를 선택하세요";
Calendar._TT["DRAG_TO_MOVE"] = "마우스 드래그로 이동 하세요";
Calendar._TT["PART_TODAY"] = " (오늘)";
DyCalendar._TT["PREV_YEAR"] = "지난 해 (길게 누르면 목록)";
DyCalendar._TT["PREV_MONTH"] = "지난 달 (길게 누르면 목록)";
DyCalendar._TT["GO_TODAY"] = "오늘 날짜로";
DyCalendar._TT["NEXT_MONTH"] = "다음 달 (길게 누르면 목록)";
DyCalendar._TT["NEXT_YEAR"] = "다음 해 (길게 누르면 목록)";
DyCalendar._TT["SEL_DATE"] = "날짜를 선택하세요";
DyCalendar._TT["DRAG_TO_MOVE"] = "마우스 드래그로 이동 하세요";
DyCalendar._TT["PART_TODAY"] = " (오늘)";
Calendar._TT["DAY_FIRST"] = "%s 먼저 표시";
DyCalendar._TT["DAY_FIRST"] = "%s 먼저 표시";
Calendar._TT["WEEKEND"] = "0,6";
DyCalendar._TT["WEEKEND"] = "0,6";
Calendar._TT["CLOSE"] = "닫기";
Calendar._TT["TODAY"] = "오늘";
Calendar._TT["TIME_PART"] = "(Shift-)클릭 또는 드래그 하세요";
DyCalendar._TT["CLOSE"] = "닫기";
DyCalendar._TT["TODAY"] = "오늘";
DyCalendar._TT["TIME_PART"] = "(Shift-)클릭 또는 드래그 하세요";
// date formats
Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
Calendar._TT["TT_DATE_FORMAT"] = "%b/%e [%a]";
DyCalendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
DyCalendar._TT["TT_DATE_FORMAT"] = "%b/%e [%a]";
Calendar._TT["WK"] = "주";
Calendar._TT["TIME"] = "시:";
DyCalendar._TT["WK"] = "주";
DyCalendar._TT["TIME"] = "시:";

127
common/js/calendar-ru.js Normal file
View file

@ -0,0 +1,127 @@
// ** I18N
// DyCalendar EN language
// Author: Mihai Bazon, <mihai_bazon@yahoo.com>
// Encoding: any
// Distributed under the same terms as the calendar itself.
// For translators: please use UTF-8 if possible. We strongly believe that
// Unicode is the answer to a real internationalized world. Also please
// include your contact information in the header, as can be seen above.
// full day names
DyCalendar._DN = new Array
("Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday");
// Please note that the following array of short day names (and the same goes
// for short month names, _SMN) isn't absolutely necessary. We give it here
// for exemplification on how one can customize the short day names, but if
// they are simply the first N letters of the full name you can simply say:
//
// DyCalendar._SDN_len = N; // short day name length
// DyCalendar._SMN_len = N; // short month name length
//
// If N = 3 then this is not needed either since we assume a value of 3 if not
// present, to be compatible with translation files that were written before
// this feature.
// short day names
DyCalendar._SDN = new Array
("Sun",
"Mon",
"Tue",
"Wed",
"Thu",
"Fri",
"Sat",
"Sun");
// First day of the week. "0" means display Sunday first, "1" means display
// Monday first, etc.
DyCalendar._FD = 0;
// full month names
DyCalendar._MN = new Array
("January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December");
// short month names
DyCalendar._SMN = new Array
("Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec");
// tooltips
DyCalendar._TT = {};
DyCalendar._TT["INFO"] = "About the calendar";
DyCalendar._TT["ABOUT"] =
"DHTML Date/Time Selector\n" +
"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
"\n\n" +
"Date selection:\n" +
"- Use the \xab, \xbb buttons to select year\n" +
"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +
"- Hold mouse button on any of the above buttons for faster selection.";
DyCalendar._TT["ABOUT_TIME"] = "\n\n" +
"Time selection:\n" +
"- Click on any of the time parts to increase it\n" +
"- or Shift-click to decrease it\n" +
"- or click and drag for faster selection.";
DyCalendar._TT["PREV_YEAR"] = "Prev. year (hold for menu)";
DyCalendar._TT["PREV_MONTH"] = "Prev. month (hold for menu)";
DyCalendar._TT["GO_TODAY"] = "Go Today";
DyCalendar._TT["NEXT_MONTH"] = "Next month (hold for menu)";
DyCalendar._TT["NEXT_YEAR"] = "Next year (hold for menu)";
DyCalendar._TT["SEL_DATE"] = "Select date";
DyCalendar._TT["DRAG_TO_MOVE"] = "Drag to move";
DyCalendar._TT["PART_TODAY"] = " (today)";
// the following is to inform that "%s" is to be the first day of week
// %s will be replaced with the day name.
DyCalendar._TT["DAY_FIRST"] = "Display %s first";
// This may be locale-dependent. It specifies the week-end days, as an array
// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
// means Monday, etc.
DyCalendar._TT["WEEKEND"] = "0,6";
DyCalendar._TT["CLOSE"] = "Close";
DyCalendar._TT["TODAY"] = "Today";
DyCalendar._TT["TIME_PART"] = "(Shift-)Click or drag to change value";
// date formats
DyCalendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
DyCalendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
DyCalendar._TT["WK"] = "wk";
DyCalendar._TT["TIME"] = "Time:";

View file

@ -59,144 +59,4 @@
* pass none of "inputField", "displayArea" or "button" you'll get a warning
* saying "nothing to setup".
*/
Calendar.setup = function (params) {
function param_default(pname, def) { if (typeof params[pname] == "undefined") { params[pname] = def; } };
param_default("inputField", null);
param_default("displayArea", null);
param_default("button", null);
param_default("eventName", "click");
param_default("ifFormat", "%Y/%m/%d");
param_default("daFormat", "%Y/%m/%d");
param_default("singleClick", true);
param_default("disableFunc", null);
param_default("dateStatusFunc", params["disableFunc"]); // takes precedence if both are defined
param_default("dateText", null);
param_default("firstDay", null);
param_default("align", "Br");
param_default("range", [1900, 2999]);
param_default("weekNumbers", true);
param_default("flat", null);
param_default("flatCallback", null);
param_default("onSelect", null);
param_default("onClose", null);
param_default("onUpdate", null);
param_default("date", null);
param_default("showsTime", false);
param_default("timeFormat", "24");
param_default("electric", true);
param_default("step", 2);
param_default("position", null);
param_default("cache", false);
param_default("showOthers", false);
param_default("multiple", null);
var tmp = ["inputField", "displayArea", "button"];
for (var i in tmp) {
if (typeof params[tmp[i]] == "string") {
params[tmp[i]] = document.getElementById(params[tmp[i]]);
}
}
if (!(params.flat || params.multiple || params.inputField || params.displayArea || params.button)) {
alert("Calendar.setup:\n Nothing to setup (no fields found). Please check your code");
return false;
}
function onSelect(cal) {
var p = cal.params;
var update = (cal.dateClicked || p.electric);
if (update && p.inputField) {
p.inputField.value = cal.date.print(p.ifFormat);
if (typeof p.inputField.onchange == "function")
p.inputField.onchange();
}
if (update && p.displayArea)
p.displayArea.innerHTML = cal.date.print(p.daFormat);
if (update && typeof p.onUpdate == "function")
p.onUpdate(cal);
if (update && p.flat) {
if (typeof p.flatCallback == "function")
p.flatCallback(cal);
}
if (update && p.singleClick && cal.dateClicked)
cal.callCloseHandler();
};
if (params.flat != null) {
if (typeof params.flat == "string")
params.flat = document.getElementById(params.flat);
if (!params.flat) {
alert("Calendar.setup:\n Flat specified but can't find parent.");
return false;
}
var cal = new Calendar(params.firstDay, params.date, params.onSelect || onSelect);
cal.showsOtherMonths = params.showOthers;
cal.showsTime = params.showsTime;
cal.time24 = (params.timeFormat == "24");
cal.params = params;
cal.weekNumbers = params.weekNumbers;
cal.setRange(params.range[0], params.range[1]);
cal.setDateStatusHandler(params.dateStatusFunc);
cal.getDateText = params.dateText;
if (params.ifFormat) {
cal.setDateFormat(params.ifFormat);
}
if (params.inputField && typeof params.inputField.value == "string") {
cal.parseDate(params.inputField.value);
}
cal.create(params.flat);
cal.show();
return false;
}
var triggerEl = params.button || params.displayArea || params.inputField;
triggerEl["on" + params.eventName] = function() {
var dateEl = null;
if(params.displayArea) dateEl = params.displayArea;
else dateEl = params.inputField;
var dateFmt = params.inputField ? params.ifFormat : params.daFormat;
var mustCreate = false;
var cal = window.calendar;
if (dateEl)
params.date = Date.parseDate(dateEl.value || dateEl.innerHTML, dateFmt);
if (!(cal && params.cache)) {
window.calendar = cal = new Calendar(params.firstDay,
params.date,
params.onSelect || onSelect,
params.onClose || function(cal) { cal.hide(); });
cal.showsTime = params.showsTime;
cal.time24 = (params.timeFormat == "24");
cal.weekNumbers = params.weekNumbers;
mustCreate = true;
} else {
if (params.date)
cal.setDate(params.date);
cal.hide();
}
if (params.multiple) {
cal.multiple = {};
for (var i = params.multiple.length; --i >= 0;) {
var d = params.multiple[i];
var ds = d.print("%Y%m%d");
cal.multiple[ds] = d;
}
}
cal.showsOtherMonths = params.showOthers;
cal.yearStep = params.step;
cal.setRange(params.range[0], params.range[1]);
cal.params = params;
cal.setDateStatusHandler(params.dateStatusFunc);
cal.getDateText = params.dateText;
cal.setDateFormat(dateFmt);
if (mustCreate)
cal.create();
cal.refresh();
if (!params.position)
cal.showAtElement(params.button || params.displayArea || params.inputField, params.align);
else
cal.showAt(params.position[0], params.position[1]);
return false;
};
return cal;
};
DyCalendar.setup=function(params){function param_default(pname,def){if(typeof params[pname]=="undefined"){params[pname]=def}};param_default("inputField",null);param_default("displayArea",null);param_default("button",null);param_default("eventName","click");param_default("ifFormat","%Y/%m/%d");param_default("daFormat","%Y/%m/%d");param_default("singleClick",true);param_default("disableFunc",null);param_default("dateStatusFunc",params["disableFunc"]);param_default("dateText",null);param_default("firstDay",null);param_default("align","Br");param_default("range",[1900,2999]);param_default("weekNumbers",true);param_default("flat",null);param_default("flatCallback",null);param_default("onSelect",null);param_default("onClose",null);param_default("onUpdate",null);param_default("date",null);param_default("showsTime",false);param_default("timeFormat","24");param_default("electric",true);param_default("step",2);param_default("position",null);param_default("cache",false);param_default("showOthers",false);param_default("multiple",null);var tmp=["inputField","displayArea","button"];for(var i in tmp){if(typeof params[tmp[i]]=="string"){params[tmp[i]]=document.getElementById(params[tmp[i]])}}if(!(params.flat||params.multiple||params.inputField||params.displayArea||params.button)){alert("DyCalendar.setup:\n Nothing to setup (no fields found). Please check your code");return false}function onSelect(cal){var p=cal.params;var update=(cal.dateClicked||p.electric);if(update&&p.inputField){p.inputField.value=cal.date.print(p.ifFormat);if(typeof p.inputField.onchange=="function")p.inputField.onchange()}if(update&&p.displayArea)p.displayArea.innerHTML=cal.date.print(p.daFormat);if(update&&typeof p.onUpdate=="function")p.onUpdate(cal);if(update&&p.flat){if(typeof p.flatCallback=="function")p.flatCallback(cal)}if(update&&p.singleClick&&cal.dateClicked)cal.callCloseHandler()};if(params.flat!=null){if(typeof params.flat=="string")params.flat=document.getElementById(params.flat);if(!params.flat){alert("DyCalendar.setup:\n Flat specified but can't find parent.");return false}var cal=new DyCalendar(params.firstDay,params.date,params.onSelect||onSelect);cal.showsOtherMonths=params.showOthers;cal.showsTime=params.showsTime;cal.time24=(params.timeFormat=="24");cal.params=params;cal.weekNumbers=params.weekNumbers;cal.setRange(params.range[0],params.range[1]);cal.setDateStatusHandler(params.dateStatusFunc);cal.getDateText=params.dateText;if(params.ifFormat){cal.setDateFormat(params.ifFormat)}if(params.inputField&&typeof params.inputField.value=="string"){cal.parseDate(params.inputField.value)}cal.create(params.flat);cal.show();return false}var triggerEl=params.button||params.displayArea||params.inputField;triggerEl["on"+params.eventName]=function(){var dateEl=null;if(params.displayArea)dateEl=params.displayArea;else dateEl=params.inputField;var dateFmt=params.inputField?params.ifFormat:params.daFormat;var mustCreate=false;var cal=window.calendar;if(dateEl)params.date=Date.parseDate(dateEl.value||dateEl.innerHTML,dateFmt);if(!(cal&&params.cache)){window.calendar=cal=new DyCalendar(params.firstDay,params.date,params.onSelect||onSelect,params.onClose||function(cal){cal.hide()});cal.showsTime=params.showsTime;cal.time24=(params.timeFormat=="24");cal.weekNumbers=params.weekNumbers;mustCreate=true}else{if(params.date)cal.setDate(params.date);cal.hide()}if(params.multiple){cal.multiple={};for(var i=params.multiple.length;--i>=0;){var d=params.multiple[i];var ds=d.print("%Y%m%d");cal.multiple[ds]=d}}cal.showsOtherMonths=params.showOthers;cal.yearStep=params.step;cal.setRange(params.range[0],params.range[1]);cal.params=params;cal.setDateStatusHandler(params.dateStatusFunc);cal.getDateText=params.dateText;cal.setDateFormat(dateFmt);if(mustCreate)cal.create();cal.refresh();if(!params.position)cal.showAtElement(params.button||params.displayArea||params.inputField,params.align);else cal.showAt(params.position[0],params.position[1]);return false};return cal};

124
common/js/calendar-zh-CN.js Normal file
View file

@ -0,0 +1,124 @@
// ** I18N
// DyCalendar zh-CN language
// Author: Mihai Bazon, <mihai_bazon@yahoo.com>
// Translation: Yourim Yi <yyi@yourim.net>
// Encoding: UTF-8
// lang : ko
// Distributed under the same terms as the calendar itself.
// For translators: please use UTF-8 if possible. We strongly believe that
// Unicode is the answer to a real internationalized world. Also please
// include your contact information in the header, as can be seen above.
// full day names
DyCalendar._DN = new Array
("星期日",
"星期一",
"星期二",
"星期三",
"星期四",
"星期五",
"星期六",
"星期日");
// Please note that the following array of short day names (and the same goes
// for short month names, _SMN) isn't absolutely necessary. We give it here
// for exemplification on how one can customize the short day names, but if
// they are simply the first N letters of the full name you can simply say:
//
// DyCalendar._SDN_len = N; // short day name length
// DyCalendar._SMN_len = N; // short month name length
//
// If N = 3 then this is not needed either since we assume a value of 3 if not
// present, to be compatible with translation files that were written before
// this feature.
// short day names
DyCalendar._SDN = new Array
("日",
"一",
"二",
"三",
"四",
"五",
"六",
"日");
// full month names
DyCalendar._MN = new Array
("1月",
"2月",
"3月",
"4月",
"5月",
"6月",
"7月",
"8月",
"9月",
"10月",
"11月",
"12月");
// short month names
DyCalendar._SMN = new Array
("1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12");
// tooltips
DyCalendar._TT = {};
DyCalendar._TT["INFO"] = "calendar 简介";
DyCalendar._TT["ABOUT"] =
"DHTML Date/Time Selector\n" +
"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
"\n"+
"下载最新版本请访问 http://www.dynarch.com/projects/calendar/ \n" +
"\n"+
"遵循GNU LGPL许可协议。 \n"+
"具体许可内容请参考 http://gnu.org/licenses/lgpl.html " +
"\n\n" +
"日期选择:\n" +
"- 选择年份请使用 \xab, \xbb 按钮\n" +
"- 选择月份请使用 " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " 按钮\n" +
"- 按住按钮可快速的选择所需的年份或月份";
DyCalendar._TT["ABOUT_TIME"] = "\n\n" +
"时间选择:\n" +
"- 鼠标点击可增加时间\n" +
"- 配合Shift键时间减少 \n" +
"- 鼠标按住状态下向右为增加向左为减少,这样时间调整会快一些。\n";
DyCalendar._TT["PREV_YEAR"] = "去年 (按住显示目录)";
DyCalendar._TT["PREV_MONTH"] = "上月 (按住显示目录)";
DyCalendar._TT["GO_TODAY"] = "设为今日";
DyCalendar._TT["NEXT_MONTH"] = "下月 (按住显示目录)";
DyCalendar._TT["NEXT_YEAR"] = "来年 (按住显示目录)";
DyCalendar._TT["SEL_DATE"] = "请选择日期";
DyCalendar._TT["DRAG_TO_MOVE"] = "可以用鼠标拖动";
DyCalendar._TT["PART_TODAY"] = " (今日)";
DyCalendar._TT["DAY_FIRST"] = "%s排到第一列";
DyCalendar._TT["WEEKEND"] = "0,6";
DyCalendar._TT["CLOSE"] = "关闭";
DyCalendar._TT["TODAY"] = "今日";
DyCalendar._TT["TIME_PART"] = "(Shift-)点击或拖动";
// date formats
DyCalendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
DyCalendar._TT["TT_DATE_FORMAT"] = "%b/%e [%a]";
DyCalendar._TT["WK"] = "周";
DyCalendar._TT["TIME"] = "时:";

File diff suppressed because it is too large Load diff

18
common/js/calendar.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -38,7 +38,7 @@ String.prototype.setQuery = function(key, val) {
var q_list = new Array();
for(var i in args) {
if( !args.hasOwnProperty(i) ) continue;
if( !args.hasOwnProperty(i) ) continue;
var arg = args[i];
if(!arg.toString().trim()) continue;
@ -48,7 +48,17 @@ String.prototype.setQuery = function(key, val) {
} else {
if(val.toString().trim()) uri = uri+"?"+key+"="+val;
}
//uri = uri.replace(request_uri+'?',request_uri+'index.php?');
uri = uri.replace(/^https:\/\//i,'http://');
if(typeof(ssl_actions)!='undefined' && typeof(ssl_actions.length)!='undefined' && uri.getQuery('act')) {
var act = uri.getQuery('act');
for(i=0;i<ssl_actions.length;i++) {
if(ssl_actions[i]==act) {
uri = uri.replace(/^http:\/\//i,'https://');
break;
}
}
}
return uri;
}
@ -166,14 +176,17 @@ function move_url(url, open_wnidow) {
}
/**
* @brief 특정 div(or span...) display옵션 토글
* @brief 특정 Element의 display 옵션 토글
**/
function toggleDisplay(obj, opt) {
obj = xGetElementById(obj);
function toggleDisplay(obj, display_type) {
var obj = xGetElementById(obj);
if(!obj) return;
if(typeof(opt)=="undefined") opt = "inline";
if(!obj.style.display || obj.style.display == "block") obj.style.display = 'none';
else obj.style.display = opt;
if(!obj.style.display || obj.style.display != 'none') {
obj.style.display = 'none';
} else {
if(display_type) obj.style.display = display_type;
else obj.style.display = '';
}
}
/**
@ -200,7 +213,7 @@ function displayMultimedia(src, width, height, auto_start, flashvars) {
"<param name=\"movie\" value=\""+src+"\" />"+
"<param name=\"quality\" value=\"high\" />"+
"<param name=\"flashvars\" value=\""+flashvars+"\" />"+
"<embed src=\""+src+"\" autostart=\""+auto_start+"\" width=\""+width+"\" height=\""+height+"\" wmode=\"transparent\"></embed>"+
"<embed src=\""+src+"\" autostart=\""+auto_start+"\" width=\""+width+"\" height=\""+height+"\" flashvars=\""+flashvars+"\" wmode=\"transparent\"></embed>"+
"<\/object>";
} else if(/\.flv/i.test(src)) {
html = "<embed src=\""+request_uri+"common/tpl/images/flvplayer.swf\" allowfullscreen=\"true\" autostart=\""+auto_start+"\" width=\""+width+"\" height=\""+height+"\" flashvars=\"&file="+src+"&width="+width+"&height="+height+"&autostart="+auto_start+"\" />";
@ -210,62 +223,6 @@ function displayMultimedia(src, width, height, auto_start, flashvars) {
document.writeln(html);
}
/**
* @brief 화면내에서 상위 영역보다 이미지가 크면 리사이즈를 하고 클릭시 원본을 보여줄수 있도록 변경
**/
function resizeImageContents() {
// 일단 모든 이미지에 대한 체크를 시작
var objs = xGetElementsByTagName("IMG");
for(var i in objs) {
var obj = objs[i];
if(!obj.parentNode) continue;
if(/\/modules\//i.test(obj.src)) continue;
if(/\/layouts\//i.test(obj.src)) continue;
if(/\/widgets\//i.test(obj.src)) continue;
if(/\/classes\//i.test(obj.src)) continue;
if(/\/common\/tpl\//i.test(obj.src)) continue;
if(/\/member_extra_info\//i.test(obj.src)) continue;
// 상위 node의 className이 document_ 또는 comment_ 로 시작하지 않으면 패스
var parent = obj.parentNode;
while(parent) {
if(parent.className && parent.className.search(/xe_content|document_|comment_/i) != -1) break;
parent = parent.parentNode;
}
if (!parent || parent.className.search(/xe_content|document_|comment_/i) < 0) continue;
if(parent.parentNode) xWidth(parent, xWidth(parent.parentNode));
parent.style.width = '100%';
parent.style.overflow = 'hidden';
var parent_width = xWidth(parent);
if(parent.parentNode && xWidth(parent.parentNode)<parent_width) parent_width = xWidth(parent.parentNode);
var obj_width = xWidth(obj);
var obj_height = xHeight(obj);
// 만약 선택된 이미지의 가로 크기가 부모의 가로크기보다 크면 리사이즈 (이때 부모의 가로크기 - 2 정도로 지정해줌)
if(obj_width > parent_width - 2) {
obj.style.cursor = "pointer";
var new_w = parent_width - 2;
var new_h = Math.round(obj_height * new_w/obj_width);
xWidth(obj, new_w);
xHeight(obj, new_h);
xAddEventListener(obj,"click", showOriginalImage);
// 선택된 이미지가 부모보다 작을 경우 일단 원본 이미지를 불러와서 비교
} else {
var orig_img = new Image();
orig_img.src = obj.src;
if(orig_img.width > parent_width - 2 || orig_img.width != obj_width) {
obj.style.cursor = "pointer";
xAddEventListener(obj,"click", showOriginalImage);
}
}
}
}
xAddEventListener(window, "load", resizeImageContents);
/**
* @brief 에디터에서 사용되는 내용 여닫는 코드 (고정, zbxe용)
**/
@ -349,163 +306,6 @@ function setFixedPopupSize() {
window.scrollTo(0,0);
}
/**
* @brief 본문내에서 컨텐츠 영역보다 이미지의 경우 원본 크기를 보여줌
**/
function showOriginalImage(evt) {
var e = new xEvent(evt);
var obj = e.target;
var src = obj.src;
if(!xGetElementById("fororiginalimagearea")) {
var dummy = xCreateElement("div");
dummy.id = "fororiginalimagearea";
dummy.style.visibility = "hidden";
xInnerHtml(dummy, "<div id=\"fororiginalimageareabg\"><img src=\""+request_uri+"common/tpl/images/blank.gif\" alt=\"original image\" border=\"0\" id=\"fororiginalimage\" /><img src=\""+request_uri+"common/tpl/images/original_image_box_close.gif\" alt=\"close original image\" border=\"0\" onclick=\"closeOriginalImage()\" id=\"closeOriginalImageBtn\"/></div>");
document.body.appendChild(dummy);
}
var orig_image = xGetElementById("fororiginalimage");
var tmp_image = new Image();
tmp_image.src = src;
var image_width = tmp_image.width;
var image_height = tmp_image.height;
orig_image.style.margin = "0px 0px 0px 0px";
orig_image.style.cursor = "move";
orig_image.src = src;
var areabg = xGetElementById("fororiginalimageareabg");
xWidth(areabg, image_width+36);
xHeight(areabg, image_height+46);
var area = xGetElementById("fororiginalimagearea");
xLeft(area, xScrollLeft());
xTop(area, xScrollTop());
xWidth(area, xWidth(document));
xHeight(area, xHeight(document));
area.style.visibility = "visible";
var area_width = xWidth(area);
var area_height = xHeight(area);
var x = parseInt((area_width-image_width)/2,10);
var y = parseInt((area_height-image_height)/2,10);
if(x<0) x = 0;
if(y<0) y = 0;
xLeft(areabg, x);
xTop(areabg, y);
var sel_list = xGetElementsByTagName("select");
for (var i = 0; i < sel_list.length; ++i) sel_list[i].style.visibility = "hidden";
xAddEventListener(orig_image, "mousedown", origImageDragEnable);
xAddEventListener(orig_image, "dblclick", closeOriginalImage);
xAddEventListener(window, "scroll", closeOriginalImage);
xAddEventListener(window, "resize", closeOriginalImage);
xAddEventListener(document, 'keydown',closeOriginalImage);
areabg.style.visibility = 'visible';
}
/**
* @brief 원본 이미지 보여준 닫는 함수
**/
function closeOriginalImage(evt) {
var area = xGetElementById("fororiginalimagearea");
if(area.style.visibility != "visible") return;
area.style.visibility = "hidden";
xGetElementById("fororiginalimageareabg").style.visibility = "hidden";
var sel_list = xGetElementsByTagName("select");
for (var i = 0; i < sel_list.length; ++i) sel_list[i].style.visibility = "visible";
xRemoveEventListener(area, "mousedown", closeOriginalImage);
xRemoveEventListener(window, "scroll", closeOriginalImage);
xRemoveEventListener(window, "resize", closeOriginalImage);
xRemoveEventListener(document, 'keydown',closeOriginalImage);
}
/**
* @brief 원본 이미지 드래그
**/
var origDragManager = {obj:null, isDrag:false}
function origImageDragEnable(evt) {
var e = new xEvent(evt);
var obj = e.target;
if(obj.id != "fororiginalimage") return;
obj.draggable = true;
obj.startX = e.pageX;
obj.startY = e.pageY;
if(!origDragManager.isDrag) {
origDragManager.isDrag = true;
xAddEventListener(document, "mousemove", origImageDragMouseMove, false);
}
xAddEventListener(document, "mousedown", origImageDragMouseDown, false);
}
function origImageDrag(obj, px, py) {
var x = px - obj.startX;
var y = py - obj.startY;
var areabg = xGetElementById("fororiginalimageareabg");
xLeft(areabg, xLeft(areabg)+x);
xTop(areabg, xTop(areabg)+y);
obj.startX = px;
obj.startY = py;
}
function origImageDragMouseDown(evt) {
var e = new xEvent(evt);
var obj = e.target;
if(obj.id != "fororiginalimage" || !obj.draggable) return;
if(obj) {
xPreventDefault(evt);
obj.startX = e.pageX;
obj.startY = e.pageY;
origDragManager.obj = obj;
xAddEventListener(document, 'mouseup', origImageDragMouseUp, false);
origImageDrag(obj, e.pageX, e.pageY);
}
}
function origImageDragMouseUp(evt) {
if(origDragManager.obj) {
xPreventDefault(evt);
xRemoveEventListener(document, 'mouseup', origImageDragMouseUp, false);
xRemoveEventListener(document, 'mousemove', origImageDragMouseMove, false);
xRemoveEventListener(document, 'mousemdown', origImageDragMouseDown, false);
origDragManager.obj.draggable = false;
origDragManager.obj = null;
origDragManager.isDrag = false;
}
}
function origImageDragMouseMove(evt) {
var e = new xEvent(evt);
var obj = e.target;
if(!obj) return;
if(obj.id != "fororiginalimage") {
xPreventDefault(evt);
xRemoveEventListener(document, 'mouseup', origImageDragMouseUp, false);
xRemoveEventListener(document, 'mousemove', origImageDragMouseMove, false);
xRemoveEventListener(document, 'mousemdown', origImageDragMouseDown, false);
origDragManager.obj.draggable = false;
origDragManager.obj = null;
origDragManager.isDrag = false;
return;
}
xPreventDefault(evt);
origDragManager.obj = obj;
xAddEventListener(document, 'mouseup', origImageDragMouseUp, false);
origImageDrag(obj, e.pageX, e.pageY);
}
/**
* @brief 이름, 게시글등을 클릭하였을 경우 팝업 메뉴를 보여주는 함수
**/
@ -989,3 +789,17 @@ if(xIE4Up) {
}
}
}
/* 보안 로그인 모드로 전환 */
function toggleSecuritySignIn() {
var href = location.href;
if(/https:\/\//i.test(href)) location.href = href.replace(/^https/i,'http');
else location.href = href.replace(/^http/i,'https');
}
/* 하위호환성 문제 */
if(typeof(resizeImageContents) == 'undefined')
{
function resizeImageContents() {}
}

View file

@ -19,15 +19,6 @@ function exec_xml(module, act, params, callback_func, response_tags, callback_fu
if(typeof(response_tags)=="undefined" || response_tags.length<1) response_tags = new Array('error','message');
var waiting_obj = xGetElementById("waitingforserverresponse");
if(show_waiting_message && waiting_obj) {
xInnerHtml(waiting_obj, waiting_message);
xTop(waiting_obj, xScrollTop()+20);
xLeft(waiting_obj, xScrollLeft()+20);
waiting_obj.style.visibility = "visible";
}
oXml.request(xml_response_filter, oXml, callback_func, response_tags, callback_func_arg, fo_obj);
}
@ -95,7 +86,7 @@ function xml_handlerRequest(callBackFunc, xmlObj, callBackFunc2, response_tags,
+ "<params>\n"
for (var key in this.params) {
if(!this.params.hasOwnProperty(key)) continue;
if(!this.params.hasOwnProperty(key)) continue;
var val = this.params[key];
rd += "<"+key+"><![CDATA["+val+"]]></"+key+">\n";
}
@ -103,12 +94,43 @@ function xml_handlerRequest(callBackFunc, xmlObj, callBackFunc2, response_tags,
rd += "</params>\n"
+ "</methodCall>\n";
// ssl action
if(typeof(ssl_actions)!='undefined' && typeof(ssl_actions.length)!='undefined' && typeof(this.params['act'])!='undefined' && /^https:\/\//i.test(location.href) ) {
var action = this.params['act'];
for(i=0;i<ssl_actions.length;i++) {
if(ssl_actions[i]==action) {
this.xml_path = this.xml_path.replace(/^http:\/\//i,'https://');
break;
}
}
}
if(this.obj_xmlHttp.readyState!=0) {
this.obj_xmlHttp.abort();
this.obj_xmlHttp = this.getXmlHttp();
}
this.obj_xmlHttp.onreadystatechange = function () {callBackFunc(xmlObj, callBackFunc2, response_tags, callback_func_arg, fo_obj)};
this.obj_xmlHttp.open("POST", this.xml_path, true);
// 모든 xml데이터는 POST방식으로 전송. try-cacht문으로 오류 발생시 대처
try {
this.obj_xmlHttp.open("POST", this.xml_path, true);
} catch(e) {
alert(e);
return;
}
// ajax 통신중 대기 메세지 출력 (show_waiting_message값을 false로 세팅시 보이지 않음)
var waiting_obj = xGetElementById("waitingforserverresponse");
if(show_waiting_message && waiting_obj) {
xInnerHtml(waiting_obj, waiting_message);
xTop(waiting_obj, xScrollTop()+20);
xLeft(waiting_obj, xScrollLeft()+20);
waiting_obj.style.visibility = "visible";
}
this.obj_xmlHttp.send(rd);
}

View file

@ -71,6 +71,7 @@
$lang->notice = 'Notice';
$lang->secret = 'Secret';
$lang->category = $lang->category_srl = 'Category';
$lang->none_category = 'None category';
$lang->document_srl = 'Doc. No.';
$lang->user_id = 'User ID';
$lang->author = 'Developer';
@ -194,6 +195,7 @@
$lang->success_updated = 'Updated successfully';
$lang->success_deleted = 'Deleted successfully';
$lang->success_voted = 'Recommended successfully';
$lang->success_blamed = 'Blamed success_blamed';
$lang->success_moved = 'Moved successfully';
$lang->success_sended = 'Sent successfully';
$lang->success_reset = 'Reset successfully';
@ -204,6 +206,7 @@
$lang->fail_to_move = 'Could not be moved';
$lang->failed_voted = 'Could not recommend';
$lang->failed_blamed = 'Could not blame';
$lang->failed_declared = 'Could not accuse';
$lang->fail_to_delete_have_children = 'Please try again after removing replies first';

View file

@ -70,6 +70,7 @@
$lang->notice = 'Aviso';
$lang->secret = 'Secreto';
$lang->category = $lang->category_srl = 'Categoría';
$lang->none_category = '분류없음';
$lang->document_srl = 'Número del documento';
$lang->user_id = 'Usuario';
$lang->author = 'Autor';
@ -193,6 +194,7 @@
$lang->success_updated = 'Actualizado con éxito';
$lang->success_deleted = 'Boarrado con éxito';
$lang->success_voted = 'Recomendado con éxito';
$lang->success_blamed = 'Culpó success_blamed';
$lang->success_moved = 'Movido con éxito';
$lang->success_sended = 'Enviado con éxito';
$lang->success_reset = 'Reajustado con éxito';
@ -203,6 +205,7 @@
$lang->fail_to_move = 'No puede ser movido';
$lang->failed_voted = 'No puede ser recomendado';
$lang->failed_blamed = 'No se ha podido culpa ';
$lang->failed_declared = 'No se ha podido acusar';
$lang->fail_to_delete_have_children = 'No puede ser borrado, ya que el mensaje posee respuestas ';

View file

@ -8,11 +8,11 @@
// verbes et mots de base decrivant des actions
$lang->cmd_write = 'Ecrire';
$lang->cmd_reply = 'Répondre';
$lang->cmd_delete = 'Supprimer';
$lang->cmd_delete = 'Effacer';
$lang->cmd_modify = 'Modifier';
$lang->cmd_edit = 'Editer';
$lang->cmd_view = 'Voir';
$lang->cmd_view_all = 'Voir Tous';
$lang->cmd_view_all = 'Voir tout';
$lang->cmd_list = 'Liste';
$lang->cmd_prev = 'Précédent';
$lang->cmd_next = 'Suivant';
@ -28,23 +28,23 @@
$lang->cmd_back = 'Retourner';
$lang->cmd_vote = 'Recommander';
$lang->cmd_vote_down = 'Critiquer';
$lang->cmd_declare = 'Accuser';
$lang->cmd_cancel_declare = 'Annuler l\'Accusation';
$lang->cmd_declared_list = 'Liste de l\'Accusation';
$lang->cmd_declare = 'Déclarer';
$lang->cmd_cancel_declare = 'Annuler déclaration';
$lang->cmd_declared_list = 'Liste des déclarations';
$lang->cmd_copy = 'Copier';
$lang->cmd_move = 'Bouger';
$lang->cmd_move_up = 'En haut';
$lang->cmd_move_down = 'En bas';
$lang->cmd_add_indent = 'Ajouter un Rentré';
$lang->cmd_remove_indent = 'Enlever un Rentré';
$lang->cmd_management = 'rer';
$lang->cmd_management = 'Administrer';
$lang->cmd_make = 'Créer';
$lang->cmd_select = 'Choisir';
$lang->cmd_select_all = 'Choisir Tous';
$lang->cmd_unselect_all = 'Annuler Tous';
$lang->cmd_select_all = 'Choisir Tout';
$lang->cmd_unselect_all = 'Annuler Tout';
$lang->cmd_reverse_all = 'Renverser la Sélection';
$lang->cmd_close_all = 'Fermer Tous';
$lang->cmd_open_all = 'Ouvrir Tous';
$lang->cmd_close_all = 'Fermer Tout';
$lang->cmd_open_all = 'Ouvrir Tout';
$lang->cmd_reload = 'Recharger';
$lang->cmd_close = 'Fermer';
$lang->cmd_open = 'Ouvrir';
@ -71,6 +71,7 @@
$lang->notice = 'Notice';
$lang->secret = 'Secret';
$lang->category = $lang->category_srl = 'Catégorie';
$lang->none_category = 'None category';
$lang->document_srl = 'Numéro de série du Document';
$lang->user_id = 'Compte';
$lang->author = 'Auteur';
@ -101,7 +102,7 @@
$lang->allow_trackback = 'Permettre Rétrolien';
$lang->uploaded_file = 'Fichier Attaché';
$lang->grant = 'Permission';
$lang->target = 'Cible';
$lang->target = 'Objet';
$lang->total = 'Total';
$lang->total_count = 'Somme';
$lang->ipaddress = 'Addresse IP';
@ -194,6 +195,7 @@
$lang->success_updated = 'Mise à jour avec succès';
$lang->success_deleted = 'Supprimé avec succès';
$lang->success_voted = 'Voté avec succès';
$lang->success_blamed = 'Blamed success_blamed';
$lang->success_moved = 'Bougé avec succès';
$lang->success_sended = 'Envoyé avec succès';
$lang->success_reset = 'Restauré avec succès';
@ -204,6 +206,7 @@
$lang->fail_to_move = 'N\'a pas pu être bougé';
$lang->failed_voted = 'N\'a pas pu recommander';
$lang->failed_blamed = 'Could not blame';
$lang->failed_declared = 'N\'a pas pu accuser';
$lang->fail_to_delete_have_children = 'Essayez encore après avoir suprimé les reponses, SVP';

250
common/lang/ge.lang.php Normal file
View file

@ -0,0 +1,250 @@
<?php
/**
* @Datei common / lang / en.lang.php
* @Author zero (zero@nzeo.com)
* @Kurzen English Language Pack (nur einfache Worte sind hier eingeschlossen)
**/
// Worte für Aktion, die im Grunde verwendet
$lang->cmd_write = 'Schreiben';
$lang->cmd_reply = 'Antworten';
$lang->cmd_delete = 'Löschen';
$lang->cmd_modify = 'Change';
$lang->cmd_edit = 'Bearbeiten';
$lang->cmd_view = 'Anzeigen';
$lang->cmd_view_all = 'Alle anzeigen';
$lang->cmd_list = 'US -';
$lang->cmd_prev = 'Zurück';
$lang->cmd_next = 'Nächster';
$lang->cmd_send_trackback = 'Trackback senden';
$lang->cmd_registration = $lang->cmd_submit = 'Übermitteln';
$lang->cmd_comment_registration = 'Kommentar hinzufügen';
$lang->cmd_insert = 'Legen Sie';
$lang->cmd_save = 'sichern';
$lang->cmd_load = 'Laden';
$lang->cmd_input = 'Input';
$lang->cmd_search = 'Suche';
$lang->cmd_cancel = 'Abbrechen';
$lang->cmd_back = 'Zurück';
$lang->cmd_vote = 'Weiterempfehlen';
$lang->cmd_vote_down = 'Criticize';
$lang->cmd_declare = 'accuse';
$lang->cmd_cancel_declare = 'accuse Abbrechen';
$lang->cmd_declared_list = 'Vorwürfe Liste';
$lang->cmd_copy = 'Kopieren';
$lang->cmd_move = 'Verschieben';
$lang->cmd_move_up = 'Nach oben';
$lang->cmd_move_down = 'Down';
$lang->cmd_add_indent = 'Einrücken';
$lang->cmd_remove_indent = 'Ausrücken';
$lang->cmd_management = 'Verwaltung';
$lang->cmd_make = 'Erstellen';
$lang->cmd_select = 'Select';
$lang->cmd_select_all = 'Alle auswählen';
$lang->cmd_unselect_all = "Alle abwählen";
$lang->cmd_reverse_all = 'Reverse';
$lang->cmd_close_all = 'Schließen Sie alle';
$lang->cmd_open_all = 'Open All';
$lang->cmd_reload = "Reload";
$lang->cmd_close = 'Schließen';
$lang->cmd_open = 'Open';
$lang->cmd_setup = 'Konfiguration';
$lang->cmd_addition_setup = 'Zusätzliche Setup ';
$lang->cmd_option = 'Option';
$lang->cmd_apply = 'Übernehmen';
$lang->cmd_open_calendar = 'Wählen Sie ein Datum';
$lang->cmd_send = 'Senden';
$lang->cmd_print = 'Drucken';
$lang->cmd_scrap = 'Schrott';
$lang->cmd_preview = 'Vorschau';
$lang->cmd_reset = 'Reset';
$lang->cmd_remake_cache = "Re-Cache-Datei erstellen";
$lang->cmd_publish = "Veröffentlichen";
$lang->cmd_layout_setup = 'Konfiguration Layout';
$lang->cmd_layout_edit = 'Layout bearbeiten';
$lang->enable = "Aktivieren";
$lang->deaktivieren = 'Deaktivieren';
// Essential Words
$lang->no = 'Nein';
$lang->notice = 'Hinweis';
$lang->secret = "Geheim";
$lang->category = $lang->category_srl = 'Kategorie';
$lang->none_category = '분류없음';
$lang->document_srl = 'Doc. No ';
$lang->user_id = 'User-ID';
$lang->author = 'Entwickler';
$lang->password = 'Passwort';
$lang->password1 = 'Passwort';
$lang->password2 = 'Passwort bestätigen';
$lang->admin_id = 'Admin ID';
$lang->writer = 'Autor';
$lang->user_name = 'Username';
$lang->nick_name = 'Nick Name';
$lang->email_address = 'E-Mail';
$lang->homepage = 'Startseite';
$lang->blog = 'Blog';
$lang->birthday = 'Geburtstag';
$lang->browser_title = 'Browser-Titel';
$lang->title = 'Betreff';
$lang->title_content = 'Betreff + Inhalt';
$lang->topic = 'Thema';
$lang->replies = 'Antwort';
$lang->content = "Inhalt";
$lang->document = 'Artikel';
$lang->comment = 'Kommentar';
$lang->description = 'Beschreibung';
$lang->trackback = 'Trackback';
$lang->tag = 'Tag';
$lang->allow_comment = 'Kommentare erlauben';
$lang->lock_comment = 'Block Kommentare';
$lang->allow_trackback = 'Allow Trackbacks';
$lang->uploaded_file = 'Anlage';
$lang->grant = 'Erlaubnis';
$lang->target = 'target';
$lang->total = 'Gesamt';
$lang->total_count = 'count Gesamt';
$lang->ipaddress = 'IP-Adresse';
$lang->path = 'Pfad';
$lang->cart = 'Ausgewählte Posten';
$lang->friend = 'Freunde';
$lang->notify = 'Meldung';
$lang->order_target = 'Ausrichten Target';
$lang->order_type = 'Sortieren Typ';
$lang->order_asc = 'Aufstieg';
$lang->order_desc = 'Abstieg';
$lang->mid = 'Module Name';
$lang->layout = 'Layout';
$lang->widget = "Widget";
$lang->module = 'Modul';
$lang->skin = 'Thema';
$lang->colorset = 'Colorset';
$lang->extra_vars = 'Extra Vars';
$lang->document_url = 'Artikel-URL';
$lang->trackback_url = 'Trackback-URL';
$lang->blog_name = 'Blog-Titel';
$lang->excerpt = 'Zitat';
$lang->document_count = 'Total Artikel';
$lang->page_count = 'Page Count';
$lang->list_count = 'US-Count ';
$lang->search_list_count = 'Suchen US-Count';
$lang->readed_count = 'Views';
$lang->voted_count = 'Stimmen';
$lang->comment_count = 'Kommentare';
$lang->member_count = 'Mitglied Count';
$lang->date = 'Datum';
$lang->regdate = 'Anmeldungsdatum Datum';
$lang->last_update = 'Letzte Aktualisierung';
$lang->last_post = 'Letzter Beitrag';
$lang->signup_date = 'Join Date';
$lang->last_login = "Letzter Login";
$lang->first_page = 'Erste Seite';
$lang->last_page = 'Letzte Seite';
$lang->search_target = 'Target für die Google-Suche';
$lang->search_keyword = 'Stichwort';
$lang->is_default = 'Standard';
$lang->no_documents = 'Keine Artikel';
$lang->board_manager = 'Board';
$lang->member_manager = 'Mitglied';
$lang->layout_manager = 'Layout-Einstellungen';
$lang->use = 'Use';
$lang->notuse = 'nicht verwenden';
$lang->not_exists = "nicht vorhanden";
$lang->public = 'öffentlich';
$lang->private = 'private';
$lang->unit_sec = 's';
$lang->unit_min = 'mindestens';
$lang->unit_hour = 'h';
$lang->unit_day = 'th';
$lang->unit_week = 'Woche';
$lang->unit_month = "Monat";
$lang->unit_year = 'Jahr';
// Beschreibungen
$lang->about_tag = 'Sie können mehrere Tags, indem Sie ein Komma (,) zwischen den einzelnen Tag';
$lang->about_layout = 'Layouts schmücken das Aussehen Ihrer Module. Sie können sie von Layout-Menü am oberen Rand ';
// Messages
$lang->msg_call_server = 'Anfordern an den Server, bitte warten';
$lang->msg_db_not_setted = 'DB-Konfiguration wurde nicht festgelegt ';
$lang->msg_invalid_queryid = 'spezifiziert Abfrage ID-Wert ist ungültig';
$lang->msg_not_permitted = 'Sie haben keine Berechtigung zum Zugriff auf';
$lang->msg_input_password = 'Bitte geben Sie das Passwort';
$lang->msg_invalid_document = 'Ungültige Article Number';
$lang->msg_invalid_request = 'Invalid request ';
$lang->msg_invalid_password = 'Ungültiges Passwort';
$lang->msg_error_occured = 'Ein Fehler ist aufgetreten ';
$lang->msg_not_founded = 'Target konnte nicht gefunden werden';
$lang->msg_no_result = 'Nichts gefunden';
$lang->msg_not_permitted_act = 'Sie haben keine Berechtigung zur Ausführung angeforderte Aktion';
$lang->msg_module_is_not_exists = 'Gewünschte Modul konnte nicht gefunden werden';
$lang->msg_module_is_not_standalone = 'Gewünschte Modul kann nicht ausgeführt werden unabhängig';
$lang->success_registed = 'Anmeldungsdatum';
$lang->success_declared = 'Accused erfolgreich';
$lang->success_updated = 'erfolgreich aktualisiert';
$lang->success_deleted = 'erfolgreich gelöscht';
$lang->success_voted = 'Empfohlen';
$lang->success_blamed = 'Schuld success_blamed';
$lang->success_moved = 'Umzug';
$lang->success_sended = 'Gesendet';
$lang->success_reset = 'Reset';
$lang->success_leaved = 'Alle Mitglieder Daten wurden komplett gestrichen. ';
$lang->success_saved = 'erfolgreich gespeichert ';
$lang->fail_to_delete = 'konnte nicht gelöscht werden';
$lang->fail_to_move = 'konnte nicht verschoben werden';
$lang->failed_voted = 'konnte nicht empfehlen';
$lang->failed_blamed = 'Es konnte keine Schuld';
$lang->failed_declared = 'Konnte nicht vorwerfen';
$lang->fail_to_delete_have_children = 'Bitte versuchen Sie es erneut nach dem Entfernen erste Antworten';
$lang->confirm_submit = 'Sind Sie sicher, dass zur Vorlage? ';
$lang->confirm_logout = 'Sind Sie sicher, dass nach Logout? ';
$lang->confirm_vote = 'Sind Sie sicher, dass zu empfehlen? ';
$lang->CONFIRM_DELETE = 'Sind Sie sicher, dass löschen? ';
$lang->confirm_move = 'Sind Sie sicher, dass zu bewegen? ';
$lang->confirm_reset = 'Sind Sie sicher, dass zurücksetzen? ';
$lang->confirm_leave = 'Sind Sie sicher, dass zu verlassen? ';
$lang->column_type = 'Spaltenart';
$lang->column_type_list['text'] = 'ein Online-Text';
$lang->column_type_list['homepage'] = 'url';
$lang->column_type_list['email_address'] =' E-Mail ';
$lang->column_type_list['tel'] = 'Telefonnummer';
$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['kr_zip'] = 'Postleitzahl (Koreanisch) ";
$lang->column_type_list['date'] = 'Datum (jjjj / mm / dd)';
// $lang->column_type_list [ 'jp_zip'] = 'Postleitzahl (Japanisch)';
$lang->column_name = 'Spaltenname';
$lang->column_title = 'Spaltentitel';
$lang->default_value = 'Standardwert';
$lang->is_active = 'Aktiv';
$lang->is_required = "Pflichtfeld";
// Alert Nachrichten für JavaScript unter Verwendung von XML-Filter
$lang->filter->isnull = 'Bitte geben Sie einen Wert für% s';
$lang->filter->outofrange = 'Bitte richten Sie die Textlänge von% s';
$lang->filter->equalto = "Der Wert von% s ist ungültig";
$lang->filter->invalid_email = "Das Format von% s ist ungültig. ex) zbxe@zeroboard.com";
$lang->filter->invalid_user_id = $lang->filter->invalid_userid = "Das Format von% s ist ungültig. \ \ Nall Werte sollte aus Alphabet, Zahlen oder Unterstrich (_) und den ersten Buchstaben sollten Alphabet" ;
$lang->filter->invalid_homepage = "Das Format von% s ist ungültig. ex) http://www.zeroboard.com";
$lang->filter->invalid_korean = "Das Format von% s ist ungültig. Koreanisch Bitte geben Sie nur";
$lang->filter->invalid_korean_number = "Das Format von% s ist ungültig. Bitte geben Sie Ihre Koreanisch oder Zahlen";
$lang->filter->invalid_alpha = "Das Format von% s ist ungültig. Bitte geben Sie nur Alphabete";
$lang->filter->invalid_alpha_number = "Das Format von% s ist ungültig. Bitte geben Sie Ihre Alphabete oder Zahlen";
$lang->filter->invalid_number = "Das Format von% s ist ungültig. Bitte geben Sie nur Zahlen";
?>

View file

@ -71,6 +71,7 @@
$lang->notice = 'お知らせ';
$lang->secret = '非公開';
$lang->category = $lang->category_srl = 'カテゴリ';
$lang->none_category = 'None category';
$lang->document_srl = '書き込み番号';
$lang->user_id = 'ユーザID';
$lang->author = '作者';
@ -194,6 +195,7 @@
$lang->success_updated = '修正しました。';
$lang->success_deleted = '削除しました。';
$lang->success_voted = '推薦しました。';
$lang->success_blamed = 'Blamed success_blamed';
$lang->success_moved = '移動しました。';
$lang->success_sended = '送信しました。';
$lang->success_reset = '初期化しました。';
@ -204,6 +206,7 @@
$lang->fail_to_move = '移動に失敗しました。';
$lang->failed_voted = '推薦できません。';
$lang->failed_blamed = 'Could not blame';
$lang->failed_declared = '通報できません。';
$lang->fail_to_delete_have_children = '返信の書き込みがあり、削除できません。';

View file

@ -71,6 +71,7 @@
$lang->notice = '공지';
$lang->secret = '비밀';
$lang->category = $lang->category_srl = '분류';
$lang->none_category = '분류 없음';
$lang->document_srl = '문서번호';
$lang->user_id = '아이디';
$lang->author = '작성자';
@ -194,6 +195,7 @@
$lang->success_updated = '수정되었습니다';
$lang->success_deleted = '삭제되었습니다';
$lang->success_voted = '추천되었습니다';
$lang->success_blamed = '비추천되었습니다';
$lang->success_moved = '이동되었습니다';
$lang->success_sended = '발송되었습니다';
$lang->success_reset = '초기화되었습니다';
@ -204,6 +206,7 @@
$lang->fail_to_move = '이동 실패하였습니다';
$lang->failed_voted = '추천하실 수 없습니다';
$lang->failed_blamed = '비추천하실 수 없습니다';
$lang->failed_declared = '신고를 하실 수 없습니다';
$lang->fail_to_delete_have_children = '답글이 있어서 삭제할 수 없습니다';

View file

@ -71,6 +71,7 @@
$lang->notice = 'Уведомление';
$lang->secret = 'Секрет';
$lang->category = $lang->category_srl = 'Категория';
$lang->none_category = 'None category';
$lang->document_srl = 'Док. No.';
$lang->user_id = 'Юзер ID';
$lang->author = 'Разработчик';
@ -194,6 +195,7 @@
$lang->success_updated = 'Обновление успешно';
$lang->success_deleted = 'Удалено успешно';
$lang->success_voted = 'Рекомендовано успешно';
$lang->success_blamed = 'Обвиняют success_blamed';
$lang->success_moved = 'Перемещено успешно';
$lang->success_sended = 'Отправлено успешно';
$lang->success_reset = 'Сброшено успешно';
@ -204,6 +206,7 @@
$lang->fail_to_move = 'Не может быть перемещено';
$lang->failed_voted = 'Ошибка при рекомендации';
$lang->failed_blamed = 'Не виноват';
$lang->failed_declared = 'Ошибка при обвинении';
$lang->fail_to_delete_have_children = 'Пожалуйста, попробуйте еще после удаления дочерних объектов';
@ -216,16 +219,16 @@
$lang->confirm_leave = 'Вы подтверждаете уход?';
$lang->column_type = 'Тип колонки';
$lang->column_type_list['text'] = 'one-line text';
$lang->column_type_list['text'] = 'одна строка текста';
$lang->column_type_list['homepage'] = 'url';
$lang->column_type_list['email_address'] = 'email';
$lang->column_type_list['tel'] = 'phone number';
$lang->column_type_list['textarea'] = 'multi-line textarea';
$lang->column_type_list['checkbox'] = 'checkbox (multiple selection)';
$lang->column_type_list['select'] = 'select box (single selection)';
$lang->column_type_list['kr_zip'] = 'zip code (Korean)';
$lang->column_type_list['date'] = 'date (yyyy/mm/dd)';
//$lang->column_type_list['jp_zip'] = 'zip code (Japanese)';
$lang->column_type_list['email_address'] = 'по электронной почте';
$lang->column_type_list['tel'] = 'номер телефона';
$lang->column_type_list['textarea'] = 'многолетних-лайн textarea';
$lang->column_type_list['checkbox'] = 'флажок (несколько отбор)';
$lang->column_type_list['select'] = 'выберите поле (один отбор)';
$lang->column_type_list['kr_zip'] = 'почтовый индекс (корейский)';
$lang->column_type_list['date'] = 'Дата (гггг / мм / дд)';
//$lang->column_type_list['jp_zip'] = 'почтовый индекс (японский)';
$lang->column_name = 'Имя колонки';
$lang->column_title = 'Название колонки';
$lang->default_value = 'Стандартное значение';

View file

@ -71,6 +71,7 @@
$lang->notice = '公告';
$lang->secret = '密帖';
$lang->category = $lang->category_srl = '分类';
$lang->none_category = '无分类';
$lang->document_srl = '文章编号';
$lang->user_id = '用户名';
$lang->author = '制作';
@ -111,8 +112,8 @@
$lang->notify = '通告';
$lang->order_target = '排序对象';
$lang->order_type = '排序方式';
$lang->order_asc = '继承皇位';
$lang->order_desc = '降临';
$lang->order_asc = '升序';
$lang->order_desc = '倒序';
$lang->mid = '模块名称';
$lang->layout = '布局';
@ -194,6 +195,7 @@
$lang->success_updated = '修改成功!';
$lang->success_deleted = '删除成功!';
$lang->success_voted = '推荐成功!';
$lang->success_blamed = '反对成功!';
$lang->success_moved = '移动成功!';
$lang->success_sended = '发送成功!';
$lang->success_reset = '初始化成功 !';
@ -204,6 +206,7 @@
$lang->fail_to_move = '移动成功!';
$lang->failed_voted = '您不能推荐!';
$lang->failed_blamed = '您不能投反对!';
$lang->failed_declared = '您不具备举报权限!';
$lang->fail_to_delete_have_children = '不能删除有回复的评论!';

View file

@ -1,4 +1,4 @@
{@ $js_files = Context::getJsFile() }{@ $css_files = Context::getCssFile() }<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="{Context::getLangType()}" xml:lang="{Context::getLangType()}" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@ -17,6 +17,7 @@
<!--@end-->
<meta http-equiv="imagetoolbar" content="no" />
<title>{Context::getBrowserTitle()}</title>
{@ $js_files = Context::getJsFile() }
<!--@foreach($js_files as $key => $js_file)-->
<!--@if($js_file['targetie'])-->
<!--[if {$js_file['targetie']}]>
@ -26,6 +27,8 @@
<![endif]-->
<!--@end-->
<!--@end-->
{@ $css_files = Context::getCssFile() }
<!--@foreach($css_files as $key => $css_file)-->
<!--@if($css_file['targetie'])-->
<!--[if {$css_file['targetie']}]>
@ -38,11 +41,14 @@
<!--@if($rss_url)-->
<link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="{$rss_url}" />
<!--@end-->
{@ $ssl_actions = Context::getSSLActions() }
<script type="text/javascript">//<![CDATA[
var current_url = "{$current_url}";
var request_uri = "{$request_uri}";
var current_mid = "{$mid}";
var waiting_message = "{$lang->msg_call_server}";
var ssl_actions = new Array(<!--@if(count($ssl_actions))-->"{implode('","',$ssl_actions)}"<!--@end-->);
//]]></script>
{Context::getHtmlHeader()}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 610 B

View file

@ -14,7 +14,7 @@
* 내용은 제로보드XE의 버전을 관리자 페이지에 표시하기 위한 용도이며
* config.inc.php의 수정이 없더라도 공식 릴리즈시에 수정되어 함께 배포되어야
**/
define('__ZBXE_VERSION__', '1.0.2');
define('__ZBXE_VERSION__', '1.0.3');
/**
* @brief 디버깅 메세지 출력
@ -68,7 +68,7 @@
*
* php5 기반으로 바꾸게 되면 _autoload를 이용할 있기에 제거 대상
**/
if(__DEBUG__) define('__ClassLosdStartTime__', getMicroTime());
if(__DEBUG__) define('__ClassLoadStartTime__', getMicroTime());
require_once('./classes/object/Object.class.php');
require_once('./classes/handler/Handler.class.php');
require_once('./classes/xml/XmlParser.class.php');
@ -82,7 +82,7 @@
require_once('./classes/display/DisplayHandler.class.php');
require_once('./classes/template/TemplateHandler.class.php');
require_once('./classes/mail/Mail.class.php');
if(__DEBUG__) $GLOBALS['__elapsed_class_load__'] = getMicroTime() - __ClassLosdStartTime__;
if(__DEBUG__) $GLOBALS['__elapsed_class_load__'] = getMicroTime() - __ClassLoadStartTime__;
/**
* @brief 세션 설정

View file

@ -4,6 +4,7 @@
<title xml:lang="jp">ZBXEブログのデフォルトスキン</title>
<title xml:lang="zh-CN">Zeroboard XE博客默认皮肤</title>
<title xml:lang="en">Default Skin of Zeroboard XE blog</title>
<title xml:lang="ge">Standard-Skin von Zeroboard XE Blog</title>
<title xml:lang="es">Cuidado de la Piel por defecto de Zeroboard XE blog</title>
<title xml:lang="ru">По умолчанию Кожа Zeroboard XE блоге</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2008. 2. 26">
@ -11,6 +12,7 @@
<name xml:lang="jp">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="ge">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="ru">zero</name>
<description xml:lang="ko">
@ -32,6 +34,11 @@
This is default skin of Zeroboard XE blog.
Design : Ki-Jeong Seo (http://blog.naver.com/addcozy)
HTML/CSS : Ju-Hoon So
</description>
<description xml:lang="ge">
Dies ist der Standard-Skin Zeroboard XE-Blog.
Design: Ki-Seo Jeong (http://blog.naver.com/addcozy)
HTML / CSS: Ju-Hoon Also
</description>
<description xml:lang="es">
Esto es por defecto de la piel Zeroboard XE blog.
@ -50,12 +57,14 @@
<title xml:lang="jp">カラーセット</title>
<title xml:lang="zh-CN">颜色</title>
<title xml:lang="en">Colorset</title>
<title xml:lang="ge">Colorset</title>
<title xml:lang="es">Set de Colores</title>
<title xml:lang="ru">Colorset</title>
<description xml:lang="ko">원하시는 컬러셋을 선택해주세요.</description>
<description xml:lang="jp">希望するカラーセットを選択してください。</description>
<description xml:lang="zh-CN">请选择颜色。</description>
<description xml:lang="en">Please select a colorset you want.</description>
<description xml:lang="ge">Bitte wählen Sie ein colorset Sie wollen.</description>
<description xml:lang="ru">Выберите colorset хотите.</description>
<description xml:lang="es">Seleccione set de colores que desea.</description>
<options name="blue">
@ -63,6 +72,7 @@
<title xml:lang="jp">青 (default)</title>
<title xml:lang="zh-CN">蓝色 (default)</title>
<title xml:lang="en">Blue (default)</title>
<title xml:lang="ge">Blue (Standard)</title>
<title xml:lang="es">Azul (default)</title>
<title xml:lang="ru">Blue (default)</title>
<value>blue</value>
@ -72,6 +82,7 @@
<title xml:lang="jp">灰色背景</title>
<title xml:lang="zh-CN">灰色背景</title>
<title xml:lang="en">Gray</title>
<title xml:lang="ge">Gray</title>
<title xml:lang="es">Gray</title>
<title xml:lang="ru">Gray</title>
<value>gray</value>
@ -81,6 +92,7 @@
<title xml:lang="jp">Orange</title>
<title xml:lang="zh-CN">Orange</title>
<title xml:lang="en">Orange</title>
<title xml:lang="ge">Orange</title>
<title xml:lang="es">Orange</title>
<title xml:lang="ru">Orange</title>
<value>orange</value>
@ -90,6 +102,7 @@
<title xml:lang="jp">Violet</title>
<title xml:lang="zh-CN">Violet</title>
<title xml:lang="en">Violet</title>
<title xml:lang="ge">Violett</title>
<title xml:lang="es">Violet</title>
<title xml:lang="ru">Violet</title>
<value>violet</value>
@ -99,6 +112,7 @@
<title xml:lang="jp"></title>
<title xml:lang="zh-CN">绿色</title>
<title xml:lang="en">Green</title>
<title xml:lang="ge">Grün</title>
<title xml:lang="es">Verde</title>
<title xml:lang="ru">Green</title>
<value>green</value>
@ -107,14 +121,16 @@
<var name="target_mid" type="text">
<title xml:lang="ko">기본 모듈</title>
<title xml:lang="jp">기본 모듈</title>
<title xml:lang="zh-CN">기본 모듈</title>
<title xml:lang="zh-CN">默认模块</title>
<title xml:lang="en">Basic module</title>
<title xml:lang="ge">Basismodul</title>
<title xml:lang="es">Módulo Básico</title>
<title xml:lang="ru">Основной модуль</title>
<description xml:lang="ko">기본 모듈을 지정해주시면 레이아웃에서 표시되는 위젯들이 정상적으로 동작을 하게 됩니다</description>
<description xml:lang="jp">기본 모듈을 지정해주시면 레이아웃에서 표시되는 위젯들이 정상적으로 동작을 하게 됩니다</description>
<description xml:lang="zh-CN">기본 모듈을 지정해주시면 레이아웃에서 표시되는 위젯들이 정상적으로 동작을 하게 됩니다</description>
<description xml:lang="zh-CN">为了让博客系统中的控件正常运作,在这里必须得指定默认版面模块名。</description>
<description xml:lang="en">The widgets that are being displayed in the layout will work properly if you select the basic module</description>
<description xml:lang="ge">Die Widgets, die angezeigt werden im Layout wird ordnungsgemäß funktionieren, wenn Sie das Basismodul</description>
<description xml:lang="es">Los reproductores que se muestran en el diseño funcionará correctamente si selecciona el módulo básico</description>
<description xml:lang="ru">В виджеты, которые отображаются в формате будет работать правильно, если вы выбираете основной модуль</description>
</var>
@ -129,20 +145,23 @@
<description xml:lang="jp">背景イメージを使う場合は、登録してください。</description>
<description xml:lang="zh-CN">要想使用背景图片请在这里上传。</description>
<description xml:lang="en">Please input if you want to use background image.</description>
<description xml:lang="ge">Bitte geben Sie, wenn Sie verwenden wollen Hintergrundbild.</description>
<description xml:lang="es">Entre, por favor, si desea utilizar la imagen de fondo.</description>
<description xml:lang="ru">Введите, если вы хотите использовать фоновое изображение.</description>
</var>
<var name="profile_image" type="image">
<title xml:lang="ko">프로필 이미지</title>
<title xml:lang="jp">プロフィールイメージ</title>
<title xml:lang="zh-CN">博客个性图片</title>
<title xml:lang="zh-CN">博客头像</title>
<title xml:lang="en">Profile Image</title>
<title xml:lang="ge">Profil Bilder</title>
<title xml:lang="es">Perfil de Imagen</title>
<title xml:lang="ru">Профиль Изображение</title>
<description xml:lang="ko">프로필 이미지를 입력해 주세요 (가로 사이즈는 160px이 가장 보기 좋습니다)</description>
<description xml:lang="jp">プロフィールイメージを入力してください横幅は「160px」が一番適しています</description>
<description xml:lang="zh-CN">输入博客个性图片(推荐宽度160px)。</description>
<description xml:lang="zh-CN">上传博客个性头像(推荐宽度为160px)。</description>
<description xml:lang="en">Please input profile image (It is recommended to set width as 160px)</description>
<description xml:lang="ge">itte geben Sie Ihre Image-Profil (Es wird empfohlen, Breite 160px)</description>
<description xml:lang="es">Por favor, el perfil de entrada de imagen (Se recomienda configurar el ancho de 160px)</description>
<description xml:lang="ru">Введите профиля изображения (Рекомендуется устанавливать ширину, 160px)</description>
</var>
@ -151,12 +170,14 @@
<title xml:lang="jp">プロフィール</title>
<title xml:lang="zh-CN">简介</title>
<title xml:lang="en">Profile</title>
<title xml:lang="ge">Profil</title>
<title xml:lang="es">Perfil</title>
<title xml:lang="ru">Профиль</title>
<description lang="ko">간단한 프로필을 입력해주세요</description>
<description lang="jp">簡単なプロフィールを入力してください。</description>
<description lang="zh-CN">请输入简单介绍。</description>
<description lang="en">Please input your simple profile</description>
<description lang="ge">Bitte geben Sie Ihre Simple Profile</description>
<description lang="es">Por favor, introduzca su perfil simple</description>
<description lang="ru">Введите простое профиль</description>
</var>
@ -167,6 +188,7 @@
<title xml:lang="jp">上段メニュー</title>
<title xml:lang="zh-CN">菜单</title>
<title xml:lang="en">Top Menu</title>
<title xml:lang="ge">Top-Menü</title>
<title xml:lang="es">Menú superior</title>
<title xml:lang="ru">Главное меню</title>
<maxdepth>1</maxdepth>

View file

@ -84,5 +84,4 @@ ul.blogMenu li a.on {}
.widget_calendar td.posted a {text-decoration:underline;}
.widget_calendar td.posted {text-decoration:underline;}
.zbXE { width:960px; text-align:center; margin:20px auto 20px auto;}

View file

@ -3,6 +3,7 @@
<title xml:lang="ko">ZBXE 공식 사이트 레이아웃</title>
<title xml:lang="jp">ZBXEオフィシャルレイアウト</title>
<title xml:lang="en">ZBXE Official website layout</title>
<title xml:lang="ge">ZBXE Offizielle Website-Layout</title>
<title xml:lang="ru">ZBXE Официальный сайт макет</title>
<title xml:lang="es">Diseño oficial de la página web de ZBXE</title>
<title xml:lang="zh-CN">ZBXE 官方网站布局</title>
@ -10,6 +11,7 @@
<name xml:lang="ko">zero</name>
<name xml:lang="jp">Zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="ge">zero</name>
<name xml:lang="ru">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="zh-CN">zero</name>
@ -30,6 +32,12 @@
Designer : So-Ra Lee
HTML/CSS : Chan-Myung Jeong
Layout producer : zero
</description>
<description xml:lang="ge">
Dieses Layout ist das Zeroboard XE Offizielle Website-Layout.
Designer: So-Ra Lee
HTML / CSS: Chan-Myung Jeong
Layout Hersteller: Zero
</description>
<description xml:lang="ru">
Этот формат является Zeroboard XE Официальный сайт компоновку.
@ -56,18 +64,21 @@
<title xml:lang="jp">カラーセット</title>
<title xml:lang="zh-CN">颜色</title>
<title xml:lang="en">Colorset</title>
<title xml:lang="ge">Colorset</title>
<title xml:lang="ru">Colorset</title>
<title xml:lang="es">Set de colores</title>
<description xml:lang="ko">원하시는 컬러셋을 선택해주세요.</description>
<description xml:lang="jp">希望するカラーセットを選択してください。</description>
<description xml:lang="zh-CN">请选择颜色。</description>
<description xml:lang="en">Please select a colorset you want.</description>
<description xml:lang="ge">Bitte wählen Sie ein colorset Sie wollen.</description>
<description xml:lang="ru">Выберите colorset хотите.</description>
<description xml:lang="es">Seleccione set de colores que desea.</description>
<options name="default">
<title xml:lang="ko">기본</title>
<title xml:lang="jp">デフォルト</title>
<title xml:lang="en">Basic</title>
<title xml:lang="ge">Basic</title>
<title xml:lang="ru">Базовые</title>
<title xml:lang="es">Básico</title>
<title xml:lang="zh-CN">默认</title>
@ -77,6 +88,7 @@
<title xml:lang="ko">검은색</title>
<title xml:lang="jp"></title>
<title xml:lang="en">Black</title>
<title xml:lang="ge">Schwarz</title>
<title xml:lang="ru">Черного</title>
<title xml:lang="es">Negro</title>
<title xml:lang="zh-CN">黑色</title>
@ -86,6 +98,7 @@
<title xml:lang="ko">하얀색</title>
<title xml:lang="jp"></title>
<title xml:lang="en">white</title>
<title xml:lang="ge">weiß</title>
<title xml:lang="ru">белый</title>
<title xml:lang="es">Blanco</title>
<title xml:lang="zh-CN">白色</title>
@ -97,12 +110,14 @@
<title xml:lang="jp">ロゴイメージ</title>
<title xml:lang="zh-CN">LOGO图片</title>
<title xml:lang="en">Logo image</title>
<title xml:lang="ge">Logobildes</title>
<title xml:lang="ru">Изображения логотипа</title>
<title xml:lang="es">Imagen del logotipo</title>
<description xml:lang="ko">레이아웃의 상단에 표시될 로고이미지를 입력하세요. (세로길이가 23px인 투명이미지가 가장 어울립니다)</description>
<description xml:lang="jp">レイアウトの上段に表示されるロゴイメージを入力してください。 (縦幅が23pxである透明イメージが最も合います。)</description>
<description xml:lang="zh-CN">请输入显示在布局顶部的LOGO图片。(高度为23px的透明图片为适。)</description>
<description xml:lang="en">Please input a logo image which will be displayed on the top of layout. (Transparent image with height of 23px is recommended.)</description>
<description xml:lang="ge">Bitte geben Sie ein Logo das Bild wird auf dem oberen Layout. (Transparent Bild mit einer Höhe von 23px wird empfohlen).</description>
<description xml:lang="ru">Введите логотип изображение, которое будет отображаться в верхней части формы. (Прозрачный изображение с высотой 23px рекомендуется.)</description>
<description xml:lang="es">Ingresar una imagen para logotipo. ( Se recomienda una imagen de fondo transparente con una altura de 23px.</description>
</var>
@ -111,12 +126,14 @@
<title xml:lang="jp">ホームページURL</title>
<title xml:lang="zh-CN">主页地址</title>
<title xml:lang="en">Homepage URL</title>
<title xml:lang="ge">Homepage URL</title>
<title xml:lang="ru">Домашняя страница URL</title>
<title xml:lang="es">URL de la página web</title>
<description xml:lang="ko">로고를 클릭시에 이동할 홈 페이지 URL을 입력해 주세요.</description>
<description xml:lang="jp">ロゴをクリックした時に移動するホームページのURLを入力してください。</description>
<description xml:lang="zh-CN">点击网站LOGO时要移动的页面URL。</description>
<description xml:lang="en">Please input the URL to redirect when user clicks the logo</description>
<description xml:lang="ge">Bitte geben Sie die URL umzuleiten, wenn Benutzer klickt das Logo</description>
<description xml:lang="ru">Пожалуйста, введите URL для перенаправления, когда пользователь нажимает логотип</description>
<description xml:lang="es">Ingresar el URL de la página web para redireccionar al pulsar el logotipo</description>
</var>
@ -125,12 +142,14 @@
<title xml:lang="jp">背景イメージ</title>
<title xml:lang="zh-CN">背景图片</title>
<title xml:lang="en">Background Image</title>
<title xml:lang="ge">Hintergrundbild</title>
<title xml:lang="ru">Фоновое изображение</title>
<title xml:lang="es">Imagen de fondo</title>
<description xml:lang="ko">배경 이미지를 사용하시려면 등록해주세요.</description>
<description xml:lang="jp">背景イメージを使う場合は、登録してください。</description>
<description xml:lang="zh-CN">要想使用背景图片请在这里上传。</description>
<description xml:lang="en">Please input if you want to use background image.</description>
<description xml:lang="ge">Bitte geben Sie, wenn Sie verwenden wollen Hintergrundbild.</description>
<description xml:lang="ru">Введите, если вы хотите использовать фоновое изображение.</description>
<description xml:lang="es">Ingresar imagen de fondo si desea usar.</description>
</var>
@ -141,6 +160,7 @@
<title xml:lang="jp">上段メニュー</title>
<title xml:lang="zh-CN">主菜单</title>
<title xml:lang="en">Top menu</title>
<title xml:lang="ge">Top Menü</title>
<title xml:lang="ru">Верхнее меню</title>
<title xml:lang="es">Menú Principal</title>
<maxdepth>3</maxdepth>
@ -150,6 +170,7 @@
<title xml:lang="jp">下段メニュー</title>
<title xml:lang="zh-CN">底部菜单</title>
<title xml:lang="en">Bottom menu</title>
<title xml:lang="ge">Bottom-Menü</title>
<title xml:lang="ru">Внизу меню</title>
<title xml:lang="es">Menú Inferior </title>
<maxdepth>1</maxdepth>

View file

@ -41,6 +41,7 @@
unset($args->module);
unset($args->act);
unset($args->addon_name);
unset($args->body);
$this->doSetup($addon_name, $args);
@ -55,18 +56,23 @@
$buff = "";
$oAddonModel = &getAdminModel('addon');
$addon_list = $oAddonModel->getInsertedAddons();
foreach($addon_list as $addon=> $val) {
foreach($addon_list as $addon => $val) {
if($val->is_used != 'Y' || !is_dir('./addons/'.$addon) ) continue;
$extra_vars = unserialize($val->extra_vars);
$mid_list = $extra_vars->mid_list;
if(!is_array($mid_list)||!count($mid_list)) $mid_list = null;
$mid_list = base64_encode(serialize($mid_list));
if($val->extra_vars) {
unset($extra_vars);
$extra_vars = base64_encode($val->extra_vars);
}
$buff .= sprintf(' if(file_exists("./addons/%s/%s.addon.php")) { unset($addon_info); $addon_info = unserialize(base64_decode("%s")); $addon_path = "./addons/%s/"; @include("./addons/%s/%s.addon.php"); }', $addon, $addon, $extra_vars, $addon, $addon, $addon);
$buff .= sprintf(' $_ml = unserialize(base64_decode("%s")); if(file_exists("./addons/%s/%s.addon.php") && (!is_array($_ml) || in_array($_m, $_ml))) { unset($addon_info); $addon_info = unserialize(base64_decode("%s")); $addon_path = "./addons/%s/"; @include("./addons/%s/%s.addon.php"); }', $mid_list, $addon, $addon, $extra_vars, $addon, $addon, $addon);
}
$buff = sprintf('<?php if(!defined("__ZBXE__"))exit(); %s ?>', $buff);
$buff = sprintf('<?php if(!defined("__ZBXE__")) exit(); $_m = Context::get(\'mid\'); %s ?>', $buff);
FileHandler::writeFile($this->cache_file, $buff);
}
@ -106,6 +112,7 @@
* @brief 애드온 설정
**/
function doSetup($addon, $extra_vars) {
if($extra_vars->mid_list) $extra_vars->mid_list = explode('|@|', $extra_vars->mid_list);
$args->addon = $addon;
$args->extra_vars = serialize($extra_vars);
return executeQuery('addon.updateAddon', $args);

View file

@ -110,41 +110,51 @@
$addon_info->history[] = $obj;
}
// 확장변수
// DB에 설정된 내역을 가져온다
$db_args->addon = $addon;
$output = executeQuery('addon.getAddonInfo',$db_args);
$extra_vals = unserialize($output->data->extra_vars);
if($extra_vals->mid_list) {
$addon_info->mid_list = $extra_vals->mid_list;
} else {
$addon_info->mid_list = array();
}
if($xml_obj->extra_vars) {
// DB에 설정된 내역을 가져온다
$db_args->addon = $addon;
$output = executeQuery('addon.getAddonInfo',$db_args);
$extra_vals = unserialize($output->data->extra_vars);
// 확장변수를 정리
if(!is_array($xml_obj->extra_vars->var)) $extra_vars[] = $xml_obj->extra_vars->var;
else $extra_vars = $xml_obj->extra_vars->var;
$extra_var_groups = $xml_obj->extra_vars->group;
if(!$extra_var_groups) $extra_var_groups = $xml_obj->extra_vars;
if(!is_array($extra_var_groups)) $extra_var_groups = array($extra_var_groups);
foreach($extra_var_groups as $group) {
$extra_vars = $group->var;
if(!is_array($group->var)) $extra_vars = array($group->var);
foreach($extra_vars as $key => $val) {
unset($obj);
if(!$val->type->body) { $val->type->body = 'text'; }
foreach($extra_vars as $key => $val) {
unset($obj);
if(!$val->type->body) { $val->type->body = 'text'; }
$obj->name = $val->attrs->name;
$obj->title = $val->title->body;
$obj->type = $val->type->body;
$obj->description = $val->description->body;
$obj->value = $extra_vals->{$obj->name};
if(strpos($obj->value, '|@|') != false) { $obj->value = explode('|@|', $obj->value); }
if($obj->type == 'mid_list' && !is_array($obj->value)) { $obj->value = array($obj->value); }
$obj->group = $group->title->body;
$obj->name = $val->attrs->name;
$obj->title = $val->title->body;
$obj->type = $val->type->body;
$obj->description = $val->description->body;
$obj->value = $extra_vals->{$obj->name};
if(strpos($obj->value, '|@|') != false) { $obj->value = explode('|@|', $obj->value); }
if($obj->type == 'mid_list' && !is_array($obj->value)) { $obj->value = array($obj->value); }
// 'select'type에서 option목록을 구한다.
if(is_array($val->options)) {
$option_count = count($val->options);
// 'select'type에서 option목록을 구한다.
if(is_array($val->options)) {
$option_count = count($val->options);
for($i = 0; $i < $option_count; $i++) {
$obj->options[$i]->title = $val->options[$i]->title->body;
$obj->options[$i]->value = $val->options[$i]->value->body;
for($i = 0; $i < $option_count; $i++) {
$obj->options[$i]->title = $val->options[$i]->title->body;
$obj->options[$i]->value = $val->options[$i]->value->body;
}
}
}
$addon_info->extra_vars[] = $obj;
$addon_info->extra_vars[] = $obj;
}
}
}

View file

@ -41,8 +41,22 @@
// mid 목록을 가져옴
$oModuleModel = &getModel('module');
// 모듈 카테고리 목록을 구함
$module_categories = $oModuleModel->getModuleCategories();
$mid_list = $oModuleModel->getMidList();
Context::set('mid_list', $mid_list);
// module_category와 module의 조합
if($module_categories) {
foreach($mid_list as $module_srl => $module) {
$module_categories[$module->module_category_srl]->list[$module_srl] = $module;
}
} else {
$module_categories[0]->list = $mid_list;
}
Context::set('mid_list',$module_categories);
// 레이아웃을 팝업으로 지정
$this->setLayoutFile('popup_layout');

View file

@ -30,8 +30,10 @@
// 몇가지 애드온을 기본 활성화 상태로 변경
$oAddonController->doActivate('member_extra_info');
$oAddonController->doActivate('counter');
$oAddonController->doActivate('blogapi');
//$oAddonController->doActivate('blogapi');
$oAddonController->doActivate('referer');
$oAddonController->doActivate('autolink');
$oAddonController->doActivate('resize_image');
$oAddonController->procAddonAdminToggleActivate();
return new Object();
}

View file

@ -11,5 +11,6 @@
$lang->addon_maker = 'Author of this Addon';
$lang->addon_history = 'Addon History';
$lang->about_addon_mid = "Addons can select targets.<br />(All targets will be selected when nothing is selected)";
$lang->about_addon = 'Addon is for controlling actions rather than displaying the HTML results.<br />Simply by toggling any addons you want on or off, you can use very useful functions to administer your website';
?>

View file

@ -11,5 +11,6 @@
$lang->addon_maker = 'Autor de Addon';
$lang->addon_history = 'Historia de Addon ';
$lang->about_addon_mid = "애드온이 사용될 대상을 지정할 수 있습니다.<br />(모두 해제시 모든 대상에서 사용 가능합니다)";
$lang->about_addon = 'Addon is para controlar las acciones y no para mostrar el resultado en HTML.<br /> Sólo con activar o desactivar el addon que desee, podrá obtener funciones útiles para la administración de tu sitio web.';
?>

View file

@ -11,6 +11,7 @@
$lang->addon_maker = 'L\'Auteur de la Compagnon';
$lang->addon_history = 'L\'Histoire de la Compagnon';
$lang->about_addon_mid = "On peut choisir des objets dans lesquels la Compagnon soit utilisé.<br />(Tout sera choisi quand rien n'est choisi.)";
$lang->about_addon = 'La Compagnon, c\'est pour contrôler les actions plutôt d\'imprimer des résultats de HTML.<br/>Par la Touche à Bascule des compagnons que vous voulez faire marcher ou arrêter, vous pouvez appliquer les fonctions très utiles à administrer votre site web.';
?>

View file

@ -11,5 +11,6 @@
$lang->addon_maker = 'アドオン作者';
$lang->addon_history = '変更内容';
$lang->about_addon_mid = "애드온이 사용될 대상을 지정할 수 있습니다.<br />(모두 해제시 모든 대상에서 사용 가능합니다)";
$lang->about_addon = 'アドオンは、HTMLの出力をコントロールするというより動作を制御する役割をします。お好みのアドオンを「使用/未使用」に設定するだけでサイトの運営に有用な機能が利用できます。';
?>

View file

@ -11,5 +11,6 @@
$lang->addon_maker = '애드온 제작자';
$lang->addon_history = '변경 사항 ';
$lang->about_addon_mid = "애드온이 사용될 대상을 지정할 수 있습니다.<br />(모두 해제시 모든 대상에서 사용 가능합니다)";
$lang->about_addon = '애드온은 html결과물을 출력하기 보다 동작을 제어하는 역할을 합니다.<br />원하시는 애드온을 on/ off하시는 것만으로 사이트 운영에 유용한 기능을 연동할 수 있습니다.';
?>

View file

@ -11,5 +11,6 @@
$lang->addon_maker = 'Автор аддона';
$lang->addon_history = 'История аддона';
$lang->about_addon_mid = "애드온이 사용될 대상을 지정할 수 있습니다.<br />(모두 해제시 모든 대상에서 사용 가능합니다)";
$lang->about_addon = 'Аддон служит больше для контролирования действий, чем для отображения HTML-результатов.<br />Простым включением/выключением любых аддонов, Вы можете использовать очень полезные функции для администрирования Вашего веб-сайта';
?>

View file

@ -11,5 +11,6 @@
$lang->addon_maker = '插件作者';
$lang->addon_history = '更新纪录 ';
$lang->about_addon_mid = "可以指定使用插件的对象。<br />(全部解除表示可用在所有对象。)";
$lang->about_addon = '插件是加载扩展功能的动作,而不是输出结果组件。<br />启用/禁用插件,为网站提供强大的功能。';
?>

View file

@ -3,7 +3,7 @@
<table name="addons" />
</tables>
<columns>
<column name="is_used" var="is_used" default="Y" />
<column name="is_used" var="is_used" />
<column name="extra_vars" var="extra_vars" />
</columns>
<conditions>

View file

@ -89,13 +89,7 @@
<td><a href="{$val->author->homepage}" onclick="window.open(this.href);return false;">{$val->author->name}</a></td>
<td class="tahoma">{$val->author->date}</td>
<td class="tahoma">{$val->path}</td>
<td>
<!--@if($val->extra_vars)-->
<a href="{getUrl('','module','addon','act','dispAddonAdminSetup','selected_addon',$val->addon)}" onclick="popopen(this.href,'addon_info');return false" class="blue">{$lang->cmd_setup}</a>
<!--@else-->
&nbsp;
<!--@end-->
</td>
<td><a href="{getUrl('','module','addon','act','dispAddonAdminSetup','selected_addon',$val->addon)}" onclick="popopen(this.href,'addon_info');return false" class="blue">{$lang->cmd_setup}</a></td>
<td>
<!--@if($val->activated)-->
<a href="#" onclick="doToggleAddon('{$val->addon}');return false;" class="blue">{$lang->use}</a>

View file

@ -0,0 +1,4 @@
@charset "utf-8";
.module_category_title { border:1px solid #DDDDDD; margin:10px 5px 5px 0; padding:3px 3px 3px 9px; }
.module_list { margin:0 0 5px 10px; }

View file

@ -7,3 +7,11 @@ function doToggleAddon(addon) {
fo_obj.addon.value = addon;
procFilter(fo_obj, toggle_activate_addon);
}
function toggleSectionCheckBox(obj, id) {
var box_list = xGetElementsByTagName('input', xGetElementById(id));
if(typeof(box_list.length)=='undefined') return;
for(var i in box_list) {
box_list[i].checked = obj.checked;
}
}

View file

@ -1,4 +1,6 @@
<!--%import("filter/setup_addon.xml")-->
<!--%import("css/addon.css")-->
<!--%import("js/addon.js")-->
<div id="popHeadder">
<h3>{$lang->cmd_setup}</h3>
@ -25,13 +27,18 @@
</tr>
<!--@foreach($addon_info->extra_vars as $id => $var)-->
<!--@if($var->group && ((!$group) || $group != $var->group))-->
{@$group = $var->group}
</table>
<table cellspacing="0" class="adminTable">
<col width="100" />
<col width="*" />
<caption>{$group}</caption>
<!--@end-->
<tr>
<th scope="row">
{$var->title}
<!--@if($var->type == 'mid_list')-->
<input type="checkbox" onclick="checkboxSelectAll(this.form, '{$var->name}'); return false;" />
<!--@end-->
</th>
<th scope="row">{$var->title}</th>
<td>
<!--@if($var->type == 'text')-->
<input type="text" name="{$var->name}" value="{$var->value}" class="inputTypeText w400" />
@ -45,19 +52,47 @@
<option value="{$val->value}"<!--@if($var->value == $val->value)--> selected="selected"<!--@end-->>{$val->title}</option>
<!--@end-->
</select>
<!--@elseif($var->type == 'mid_list')-->
<!--@foreach($mid_list as $key => $val)-->
<div class="addon_mid_list">
<input type="checkbox" value="{$key}" name="{$var->name}" id="chk_mid_list_{$key}" <!--@if(in_array($key, $var->value))-->checked="checkde" <!--@end-->/>
<label for="chk_mid_list_{$key}">{$key} ({$val->browser_title})</label>
</div>
<!--@end-->
<!--@end-->
<p class="clear">{nl2br($var->description)}</p>
</td>
</tr>
<!--@end-->
<!--@if($group)-->
</table>
<table cellspacing="0" class="adminTable">
<col width="100" />
<col width="*" />
<!--@end-->
<tr>
<th scope="row">
{$lang->module}
<input type="checkbox" onclick="checkboxSelectAll(this.form, 'mid_list'); return false;" />
</th>
<td>
<p>{$lang->about_addon_mid}</p>
<!--@foreach($mid_list as $module_category_srl => $modules)-->
<div class="module_category_title">
<input type="checkbox" onclick="toggleSectionCheckBox(this, 'section_{$module_category_srl}');" />
<!--@if($modules->title)-->
{$modules->title}
<!--@else-->
{$lang->none_category}
<!--@end-->
</div>
<div id="section_{$module_category_srl}">
<!--@foreach($modules->list as $key => $val)-->
<div class="module_list">
<input type="checkbox" value="{$key}" name="mid_list" id="chk_mid_list_{$key}" <!--@if(in_array($key, $addon_info->mid_list))-->checked="checked"<!--@end--> />
<label for="chk_mid_list_{$key}">{$key} ({$val->browser_title})</label>
</div>
<!--@end-->
</div>
<!--@end-->
</td>
</tr>
</table>
</div>
@ -67,5 +102,4 @@
<a href="#" onclick="window.close(); return false;" class="button"><span>{$lang->cmd_close}</span></a>
</div>
</div>
</form>

View file

@ -12,50 +12,6 @@
function init() {
}
/**
* @brief 숏컷 추가
**/
function procAdminInsertShortCut() {
$module = Context::get('selected_module');
$output = $this->insertShortCut($module);
if(!$output->toBool()) return $output;
$this->setMessage('success_registed');
}
/**
* @brief 숏컷의 삭제
**/
function procAdminDeleteShortCut() {
$args->module = Context::get('selected_module');
// 삭제 불가능 바로가기의 처리
if(in_array($args->module, array('module','addon','widget','layout'))) return new Object(-1, 'msg_manage_module_cannot_delete');
$output = executeQuery('admin.deleteShortCut', $args);
if(!$output->toBool()) return $output;
$this->setMessage('success_deleted');
}
/**
* @brief 관리자 페이지의 단축 메뉴 추가
**/
function insertShortCut($module) {
// 선택된 모듈의 정보중에서 admin_index act를 구함
$oModuleModel = &getModel('module');
$module_info = $oModuleModel->getModuleInfoXml($module);
$args->module = $module;
$args->title = $module_info->title;
$args->default_act = $module_info->admin_index_act;
if(!$args->default_act) return new Object(-1, 'msg_default_act_is_null');
$output = executeQuery('admin.insertShortCut', $args);
return $output;
}
/**
* @brief 모든 캐시 파일 재생성
**/

View file

@ -13,30 +13,5 @@
function init() {
}
/**
* @brief admin shortcut 등록된 목록을 return;
**/
function getShortCuts() {
$output = executeQuery('admin.getShortCutList');
if(!$output->toBool()) return $output;
if(!is_array($output->data)) $list = array($output->data);
else $list = $output->data;
foreach($list as $val) {
$shortcut_list[$val->module] = $val;
}
// 모듈 목록을 구해와서 숏컷에 해당하는 타이틀을 추출
$oModuleModel = &getModel('module');
$module_list = $oModuleModel->getModulesXmlInfo();
foreach($module_list as $key => $val) {
$module_name = $val->module;
if($shortcut_list[$module_name]) $shortcut_list[$module_name]->title = $val->title;
}
return $shortcut_list;
}
}
?>

View file

@ -34,11 +34,12 @@
Context::set('running_module', $running_module);
$db_info = Context::getDBInfo();
Context::set('time_zone_list', $GLOBALS['time_zone']);
Context::set('time_zone', $GLOBALS['_time_zone']);
Context::set('time_zone_list', $GLOBALS['time_zone']);
Context::set('time_zone', $GLOBALS['_time_zone']);
Context::set('use_rewrite', $db_info->use_rewrite=='Y'?'Y':'N');
Context::set('use_optimizer', $db_info->use_optimizer!='N'?'Y':'N');
Context::set('qmail_compatibility', $db_info->qmail_compatibility=='Y'?'Y':'N');
Context::setBrowserTitle("ZeroboardXE Admin Page");
}
@ -83,12 +84,5 @@
$this->setTemplateFile('index');
}
/**
* @brief 관리자 메뉴 숏컷 출력
**/
function dispAdminShortCut() {
$this->setTemplateFile('shortcut_list');
}
}
?>

View file

@ -11,20 +11,6 @@
* @brief 설치시 추가 작업이 필요할시 구현
**/
function moduleInstall() {
// 게시판, 회원관리, 레이아웃관리등 자주 사용될 module을 admin_shortcut에 등록
$oAdminController = &getAdminController('admin');
$oAdminController->insertShortCut('blog');
$oAdminController->insertShortCut('board');
$oAdminController->insertShortCut('page');
$oAdminController->insertShortCut('opage');
$oAdminController->insertShortCut('menu');
$oAdminController->insertShortCut('layout');
$oAdminController->insertShortCut('addon');
$oAdminController->insertShortCut('widget');
$oAdminController->insertShortCut('member');
$oAdminController->insertShortCut('module');
return new Object();
}

View file

@ -2,10 +2,7 @@
<module>
<actions>
<action name="dispAdminIndex" type="view" standalone="true" index="true"/>
<action name="dispAdminShortCut" type="view" standalone="true" />
<action name="procAdminInsertShortCut" type="controller" standalone="true" />
<action name="procAdminDeleteShortCut" type="controller" standalone="true" />
<action name="procAdminRecompileCacheFile" type="controller" standalone="true" />
</actions>
</module>

View file

@ -12,7 +12,7 @@
'service' => 'Modules de Service',
'manager' => 'Modules Administratif',
'utility' => 'Modules d\'Utilité',
'accessory' => 'Modules Additionnels',
'accessory' => 'Modules Accessoires',
'base' => 'Modules par Défaut',
);
@ -23,8 +23,8 @@
$lang->env_information = "Informations de l'Environnement";
$lang->current_version = "Version Courante";
$lang->current_path = "Chemin Installé";
$lang->released_version = "Version Dernière";
$lang->about_download_link = "Nouvelle version est disponible. Pour télécharger la version dernière, cliquez le lien.";
$lang->released_version = "Dernière Version";
$lang->about_download_link = "Nouvelle version est disponible. Pour télécharger la dernière version, cliquez le lien.";
$lang->item_module = "Liste des Modules";
$lang->item_addon = "Liste des Compagnons";
@ -35,14 +35,14 @@
$lang->addon_name = "Nom de Compagnon";
$lang->version = "Version";
$lang->author = "Auteur";
$lang->table_count = "Tables";
$lang->table_count = "Nombres de Tables";
$lang->installed_path = "Chemin Installé";
$lang->cmd_shortcut_management = "Editer le Menu";
$lang->msg_is_not_administrator = 'Administrateur seulement';
$lang->msg_manage_module_cannot_delete = 'On ne peut pas supprimer les raccourcis pour les modules, les compagnons, les mises en page ou les widgets';
$lang->msg_default_act_is_null = 'on ne peut pas enrégistrer les raccourci parce que les Actions Par Défaut de l\'Administrateur n\'est pas configuré';
$lang->msg_manage_module_cannot_delete = 'On ne peut pas effacer les raccourcis pour les modules, les compagnons, les mises en page ou les widgets';
$lang->msg_default_act_is_null = 'on ne peut pas enrégistrer les raccourcis parce que les Actions Par Défaut de l\'Administrateur ne sont pas établis';
$lang->welcome_to_zeroboard_xe = 'Bienvenue sur la Page d\'Administration du Zeroboard XE';
$lang->about_admin_page = "La Page d\'Administration est encore en train de développer,\nNous allons ajouter des contenus essentiels par accepter beauoup de bons suggestions pendant Béta Proche.";
@ -54,20 +54,20 @@
$lang->xe_user_links = array(
'Site Web Officiel' => 'http://www.zeroboard.com',
//'Site Web Beta Proche' => 'http://spring.zeroboard.com',
//'Rservoir des Modules' => 'http://www.zeroboard.com',
//'Rservoir des Compagnons' => 'http://www.zeroboard.com',
//'Rservoir des Widgets' => 'http://www.zeroboard.com',
//'Rservoir des Thme des Modules' => 'http://www.zeroboard.com',
//Rservoir des Thme des 'Widgets' => 'http://www.zeroboard.com',
//'Rservoir des Thme des Mises en Page' => 'http://www.zeroboard.com',
//'Conservation des Modules' => 'http://www.zeroboard.com',
//'Conservation des Compagnons' => 'http://www.zeroboard.com',
//'Conservation des Widgets' => 'http://www.zeroboard.com',
//'Conservation des Thèmes des Modules' => 'http://www.zeroboard.com',
//Conservation des Thèmes des 'Widgets' => 'http://www.zeroboard.com',
//'Conservation des Thèmes des Mises en Page' => 'http://www.zeroboard.com',
);
$lang->xe_developer_links = array(
'Manuel' => 'http://www.zeroboard.com/manual',
//"Forum pour les Dveloppeurs" => 'http://spring.zeroboard.com',
'Traque des Issues' => 'http://trac.zeroboard.com',
'Réservoir de SVN' => 'http://svn.zeroboard.com',
'Document de Doxygen' => 'http://doc.zeroboard.com',
'Répertoir de SVN' => 'http://svn.zeroboard.com',
'Documents de Doxygen' => 'http://doc.zeroboard.com',
'Documentation de PDF' => 'http://doc.zeroboard.com/zeroboard_xe.pdf',
);
@ -77,12 +77,12 @@
'dispDocumentAdminList' => 'Arrangement des Articles',
'dispCommentAdminList' => 'Arrangement des Commentaires',
'dispFileAdminList' => 'Arrangement des Rattachements',
'dispPollAdminList' => 'Arrangement du Sondage',
'dispPollAdminList' => 'Arrangement des Enquêtes',
'dispSpamfilterAdminConfig' => 'Arrangement du Filtre contre Pourriel',
'dispCounterAdminIndex' => 'Journal de Compteur',
);
$lang->xe_license = 'Zeroboard XE s\'applique la GPL';
$lang->about_shortcut = 'Vous pouvez supprimer raccourci pour les modules qui sont enrgistrés sur le liste des modules utilisés fréquemment';
$lang->about_shortcut = 'Vous pouvez effacer les raccourcis pour les modules qui sont enrgistrés sur le liste des modules utilisés fréquemment';
?>

View file

@ -1,8 +0,0 @@
<query id="deleteShortCut" action="delete">
<tables>
<table name="admin_shortcut" />
</tables>
<conditions>
<condition operation="equal" column="module" var="module" notnull="notnull" />
</conditions>
</query>

View file

@ -1,8 +0,0 @@
<query id="getShortCutList" action="select">
<tables>
<table name="admin_shortcut" />
</tables>
<navigation>
<index var="sort_index" default="list_order" order="asc" />
</navigation>
</query>

View file

@ -1,13 +0,0 @@
<query id="insertShortCut" action="insert">
<tables>
<table name="admin_shortcut" />
</tables>
<columns>
<column name="shortcut_srl" var="shortcut_srl" default="sequence()" filter="number" notnull="notnull" />
<column name="title" var="title" notnull="notnull" minlength="2" maxlength="250" />
<column name="module" var="module" notnull="notnull" minlength="2" maxlength="250" />
<column name="default_act" var="default_act" notnull="notnull" minlength="2" maxlength="250" />
<column name="regdate" var="regdate" default="curdate()" />
<column name="list_order" var="list_order" default="sequence()" />
</columns>
</query>

View file

@ -1,8 +0,0 @@
<table name="admin_shortcut">
<column name="shortcut_srl" type="number" size="11" notnull="notnull" primary_key="primary_key" />
<column name="module" type="varchar" size="250" notnull="notnull" unique="uni_module" />
<column name="title" type="varchar" size="250" notnull="notnull" />
<column name="default_act" type="varchar" size="250" notnull="notnull" />
<column name="list_order" type="number" size="11" notnull="notnull" index="idx_list_order" />
<column name="regdate" type="date" />
</table>

View file

@ -1,9 +0,0 @@
<filter name="delete_shortcut" module="admin" act="procAdminDeleteShortCut" confirm_msg_code="confirm_delete">
<form>
<node target="selected_module" required="true" />
</form>
<response>
<tag name="error" />
<tag name="message" />
</response>
</filter>

View file

@ -51,7 +51,7 @@
</td>
</tr>
<tr>
<th scope="row">Lang</th>
<th scope="row">Language Selection</th>
<td>
<select name="lang_type" onchange="doChangeLangType(this)">
<option value="{$lang_type}">{$lang_supported[$lang_type]}</option>
@ -63,17 +63,24 @@
</select>
<p>{$lang->about_lang_env}</p>
</td>
</tr>
<tr>
<th scope="row">{$lang->time_zone}</th>
<td>
<select name="time_zone" class="time_zone">
<!--@foreach($time_zone_list as $key => $val)-->
<option value="{$key}" <!--@if($time_zone==$key)-->selected="selected"<!--@end-->>{$val}</option>
<!--@end-->
</select>
<p>{$lang->about_time_zone}</p>
</td>
</tr>
<tr>
<th scope="row">{$lang->time_zone}</th>
<td>
<select name="time_zone" class="time_zone">
<!--@foreach($time_zone_list as $key => $val)-->
<option value="{$key}" <!--@if($time_zone==$key)-->selected="selected"<!--@end-->>{$val}</option>
<!--@end-->
</select>
<p>{$lang->about_time_zone}</p>
</td>
</tr>
<tr>
<th scope="row">{$lang->qmail_compatibility}</th>
<td>
<input type="checkbox" name="qmail_compatibility" value="Y" <!--@if($qmail_compatibility=='Y')-->checked="checked"<!--@end--> />
<p>{$lang->about_qmail_compatibility}</p>
</td>
</tr>
<tr>
<th colspan="2" class="button">

View file

@ -4,12 +4,6 @@
* @brief admin 모듈의 javascript
**/
// 숏컷 삭제
function doDeleteShortCut(selected_module) {
var fo_obj = xGetElementById('fo_shortcut_info');
fo_obj.selected_module.value = selected_module;
procFilter(fo_obj, delete_shortcut);
}
// 캐시파일 모두 재 생성
function doRecompileCacheFile() {

View file

@ -1,32 +0,0 @@
<!--%import("filter/delete_shortcut.xml")-->
<!--%import("js/admin.js")-->
<h3>{$lang->cmd_shortcut_management}</h3>
<div class="infoText">{$lang->about_shortcut}</div>
<!-- 숏컷의 위/아래, 삭제와 관련된 form -->
<form id="fo_shortcut_info" action="./" method="get">
<input type="hidden" name="selected_module" value="" />
</form>
<table cellspacing="0" class="tableType3">
<thead>
<tr>
<th scope="col">{$lang->title}</th>
<th scope="col">{$lang->module}</th>
<th scope="col">{$lang->regdate}</th>
<th scope="col">{$lang->cmd_delete}</th>
</tr>
</thead>
<tbody>
<!--@foreach($shortcut_list as $shortcut_info)-->
<tr>
<th scope="row">{$shortcut_info->title}</th>
<td class="tahoma">{$shortcut_info->module}</td>
<td class="tahoma">{zdate($shortcut_info->regdate,"Y-m-d H:i:s")}</td>
<td><a href="#" onclick="doDeleteShortCut('{$shortcut_info->module}');return false;" class="red">{$lang->cmd_delete}</a></td>
</tr>
<!--@end-->
</tbody>
</table>

View file

@ -170,6 +170,7 @@
// 일단 입력된 값들을 모두 받아서 db 입력항목과 그외 것으로 분리
if(!$args) {
$args = Context::gets('module_srl','module_category_srl','board_name','layout_srl','skin','browser_title','description','is_default','header_text','footer_text','admin_id');
$extra_var = delObjectVars(Context::getRequestVars(), $args);
}
$args->module = 'board';
@ -178,7 +179,6 @@
if($args->is_default!='Y') $args->is_default = 'N';
// 기본 값외의 것들을 정리
$extra_var = delObjectVars(Context::getRequestVars(), $args);
if($extra_var->use_category!='Y') $extra_var->use_category = 'N';
if($extra_var->except_notice!='Y') $extra_var->except_notice = 'N';
if($extra_var->consultation!='Y') $extra_var->consultation = 'N';

View file

@ -171,6 +171,7 @@
// skin_info에 extra_vars 값을 지정
if(count($skin_info->extra_vars)) {
foreach($skin_info->extra_vars as $key => $val) {
$group = $val->group;
$name = $val->name;
$type = $val->type;
$value = $module_info->{$name};

View file

@ -125,6 +125,9 @@
// 글이 존재하면 글 보기 권한에 대한 확인과 조회수증가/ 브라우저 타이틀의 설정을 함
} else {
// 글과 요청된 모듈이 다르다면 오류 표시
if($oDocument->get('module_srl')!=Context::get('module_srl') ) return $this->stop('msg_invalid_request');
// 관리 권한이 있다면 권한을 부여
if($this->grant->manager) $oDocument->setGrant();

View file

@ -30,7 +30,7 @@
// blah blah..
$lang->about_category_title = 'Please input category name';
$lang->about_expand = 'By selecting this option, it will be always expanded';
$lang->about_category_group_srls = 'Only the selected group will be able to see current categories. (Manually open xml file to expose)';
$lang->about_category_group_srls = 'Only selected group will be able to use current category';
$lang->about_layout_setup = 'You can manually modify board layout code. Insert or manage the widget code anywhere you want';
$lang->about_board_category = 'You can make board categories.<br />When board category is broken, try rebuilding the cache file manually.';
$lang->about_except_notice = "Notice articles will not be displayed on normal list.";

View file

@ -32,7 +32,7 @@
// bla bla...
$lang->about_category_title = 'Ingresar el nombre de la categoría.';
$lang->about_expand = 'Si seleccionas esta opción, siempre estará expandido.';
$lang->about_category_group_srls = 'Solo se verán los grupos seleccionados en la actual categoría. (Abrir manualmente en archivo xml para la exposición)';
$lang->about_category_group_srls = '선택하신 그룹만 현재 카테고리를 지정할 수 있도록 합니다';
$lang->about_layout_setup = 'Puede modificar manualmente el código del diseño de tableros. Insertar o modificar el código de widget.';
$lang->about_board_category = 'Puede crear las categorias de tableros.<br />Cuando no funciona la categoría de tableros, rehacer el archivo caché manualmente para solucionar.';
$lang->about_except_notice = "Aviso de los artículos no se mostrará en la lista normal.";

View file

@ -30,7 +30,7 @@
// blah blah..
$lang->about_category_title = 'Entrez le nom de la catégorie, SVP.';
$lang->about_expand = 'Si vous cochez la case, ce sera toujours tendu';
$lang->about_category_group_srls = 'Le groupe sélectionné seulement pourra voir ces catégories. (Ouvrir manuellement le fiche de xml, c\'est l\'exposer)';
$lang->about_category_group_srls = '선택하신 그룹만 현재 카테고리를 지정할 수 있도록 합니다';
$lang->about_layout_setup = 'Vous pouvez manuellement modifier le code de Mise en Page du Panneau. Insérez ou arrangez le code de Widget n\'importe où vous voulez.';
$lang->about_board_category = 'Vous pouvez créer des catégories d\'affichage dans le tableau. Quand la catégorie d\'affichage est cassé, essayez manuellement rétablir la cachette du fichier.';
$lang->about_except_notice = "L'Article de Notice ne sera exposé sur la liste normale.";

View file

@ -33,7 +33,7 @@
// その他
$lang->about_category_title = 'カテゴリ名を入力して下さい。';
$lang->about_expand = 'チェックすると常に展開された状態になります。';
$lang->about_category_group_srls = '選択したグループのみ現在のカテゴリが見えるようになりますXMLファイルを直接閲覧すると表示されます';
$lang->about_category_group_srls = '선택하신 그룹만 현재 카테고리를 지정할 수 있도록 합니다';
$lang->about_layout_setup = 'ブログのレイアウトのコードを直接修正します。ウィジェットコードを好きなところに入力、又は管理して下さい。';
$lang->about_board_category = 'ブログのカテゴリを作成します。<br />ブログのカテゴリが誤作動する場合、「キャッシュファイルの再生性」を手動で行うことで解決できます。';
$lang->about_except_notice = "リストの上段に常に表示されるお知らせの書き込みを一般リストからお知らせの書き込みが表示されないようにします。";

View file

@ -30,7 +30,7 @@
// 주절 주절..
$lang->about_category_title = '카테고리 이름을 입력해주세요';
$lang->about_expand = '선택하시면 늘 펼쳐진 상태로 있게 합니다';
$lang->about_category_group_srls = '선택하신 그룹만 현재 카테고리가 보이게 됩니다. (xml파일을 직접 열람하면 노출이 됩니다)';
$lang->about_category_group_srls = '선택하신 그룹만 현재 카테고리를 지정할 수 있도록 합니다';
$lang->about_layout_setup = '블로그의 레이아웃 코드를 직접 수정할 수 있습니다. 위젯 코드를 원하는 곳에 삽입하시거나 관리하세요';
$lang->about_board_category = '분류를 만드실 수 있습니다.<br />분류가 오동작을 할 경우 캐시파일 재생성을 수동으로 해주시면 해결이 될 수 있습니다.';
$lang->about_except_notice = "목록 상단에 늘 나타나는 공지사항을 일반 목록에서 공지사항을 출력하지 않도록 합니다.";

View file

@ -33,7 +33,7 @@
// blah blah.. или чушь всякая... ;)
$lang->about_category_title = 'Пожалуйста, введите название категории';
$lang->about_expand = 'Если эта опция выбрана, расширение будут применено всегда';
$lang->about_category_group_srls = 'Только выбранная группа будет способна видеть ткущие категории. (Вручную откройте xml файл, чтобы сделать видимыми)';
$lang->about_category_group_srls = '선택하신 그룹만 현재 카테고리를 지정할 수 있도록 합니다';
$lang->about_layout_setup = 'Вы можете вручную изменять лейаут код блога. Вставляйте или управляйте кодом виджетов везде, где хотите';
$lang->about_board_category = 'Вы можете сделать категории блога.<br />Когда категория блога испорчена, попробуйте перепостроить файл кеша вручную.';
$lang->about_except_notice = "목록 상단에 늘 나타나는 공지사항을 일반 목록에서 공지사항을 출력하지 않도록 합니다.";

View file

@ -38,7 +38,7 @@
$lang->about_layout_setup = '可直接编辑博客布局代码。可以把控件代码插入到您喜欢的位置。';
$lang->about_board_category = '可以添加/删除分类项<br />分类有异常情况时,可以尝试重新生成缓冲文件。';
$lang->about_except_notice = "设置公告目录项不再重复显示到普通目录当中。";
$lang->about_board = "可生成管理版面的模块。\n生成版面后点击模块名即可对其详细设置。";
$lang->about_board = "可生成/管理版面的模块。\n生成版面后点击模块名即可对其详细设置。";
$lang->about_consultation = "咨询功能是指除有管理权限的会员以外,其他会员只能浏览自己发表的主题。\n使用咨询功能时系统将自动禁止非会员的发表主题权限。";
$lang->about_admin_mail = '有新的发表主题或评论时,将自动发电子邮件来通知管理员。<br />多数电子邮件由逗号(,)来分隔。';
$lang->about_admin_mail = '有新的主题或评论时,将自动发电子邮件来通知管理员。<br />多数电子邮件由逗号(,)来分隔。';
?>

View file

@ -40,10 +40,10 @@
<!--@end-->
</div>
<!--@if($comment->get('voted_count')!=0)-->
<!--@if($comment->get('voted_count')!=0 || $comment->get('blamed_count') != 0)-->
<div class="voted">
({$lang->voted_count}:
<strong>{$comment->get('voted_count')}</strong>)
<strong>{$comment->get('voted_count')?$comment->get('voted_count'):0}</strong> / <strong>{$comment->get('blamed_count')?$comment->get('blamed_count'):0}</strong>)
</div>
<!--@end-->

View file

@ -1,9 +1,17 @@
<!-- 이 파일은 extra_vars의 form을 출력하는 파일이며 다른 스킨에서 그대로 가져가서 css만 바꾸어 주면 된다 -->
<!-- calendar -->
<!--%import("../../../../common/js/calendar.js",optimized=false)-->
<!--%import("../../../../common/js/calendar.min.js",optimized=false)-->
<!--@if($lang_type == 'ko')-->
<!--%import("../../../../common/js/calendar-ko.js",optimized=false)-->
<!--@elseif($lang_type == 'es')-->
<!--%import("../../../../common/js/calendar-es.js",optimized=false)-->
<!--@elseif($lang_type == 'ge')-->
<!--%import("../../../../common/js/calendar-ge.js",optimized=false)-->
<!--@elseif($lang_type == 'ru')-->
<!--%import("../../../../common/js/calendar-ru.js",optimized=false)-->
<!--@elseif($lang_type == 'zh-CN')-->
<!--%import("../../../../common/js/calendar-zh-CN.js",optimized=false)-->
<!--@else-->
<!--%import("../../../../common/js/calendar-en.js",optimized=false)-->
<!--@end-->
@ -69,7 +77,7 @@
<div class="display_date" id="str_{$val->column_name}">{zdate($val->value,"Y-m-d")}</div>
<script type="text/javascript">
Calendar.setup( { firstDay : 0, inputField : "date_{$val->column_name}", ifFormat : "%Y%m%d", displayArea : "str_{$val->column_name}", daFormat : "%Y-%m-%d"});
DyCalendar.setup( { firstDay : 0, inputField : "date_{$val->column_name}", ifFormat : "%Y%m%d", displayArea : "str_{$val->column_name}", daFormat : "%Y-%m-%d"});
</script>
<!--@end-->

View file

@ -94,7 +94,7 @@
<li class="loginAndLogout"><a href="{getUrl('act','dispMemberLogout')}">{$lang->cmd_logout}</a></li>
<!--@end-->
<!-- 로그인 되어 있지 않고 레이아웃이 없으면 -->
<!-- 로그인 되어 있지 않고 회원정보 버튼 출력하도록 되어있으면 -->
<!--@elseif(!$is_logged && $module_info->display_login_info != 'N')-->
<li class="join"><a href="{getUrl('act','dispMemberSignUpForm')}">{$lang->cmd_signup}</a></li>
<li class="loginAndLogout"><a href="{getUrl('act','dispMemberLoginForm')}">{$lang->cmd_login}</a></li>

View file

@ -35,9 +35,9 @@
<div class="readedCount" title="{$lang->readed_count}">{$oDocument->get('readed_count')}</div>
<!--@if($oDocument->get('voted_count')!=0)-->
<!--@if($oDocument->get('voted_count')!=0 || $oDocument->get('blamed_count')!=0)-->
<div class="votedCount" title="{$lang->voted_count}">
<strong>{$oDocument->get('voted_count')}</strong>
<strong>{$oDocument->get('voted_count')} / {$oDocument->get('blamed_count')}</strong>
</div>
<!--@end-->

View file

@ -1,9 +1,17 @@
<!-- 이 파일은 extra_vars의 form을 출력하는 파일이며 다른 스킨에서 그대로 가져가서 css만 바꾸어 주면 된다 -->
<!-- calendar -->
<!--%import("../../../../common/js/calendar.js",optimized=false)-->
<!--%import("../../../../common/js/calendar.min.js",optimized=false)-->
<!--@if($lang_type == 'ko')-->
<!--%import("../../../../common/js/calendar-ko.js",optimized=false)-->
<!--@elseif($lang_type == 'es')-->
<!--%import("../../../../common/js/calendar-es.js",optimized=false)-->
<!--@elseif($lang_type == 'ge')-->
<!--%import("../../../../common/js/calendar-ge.js",optimized=false)-->
<!--@elseif($lang_type == 'ru')-->
<!--%import("../../../../common/js/calendar-ru.js",optimized=false)-->
<!--@elseif($lang_type == 'zh-CN')-->
<!--%import("../../../../common/js/calendar-zh-CN.js",optimized=false)-->
<!--@else-->
<!--%import("../../../../common/js/calendar-en.js",optimized=false)-->
<!--@end-->
@ -69,7 +77,7 @@
<div class="display_date" id="str_{$val->column_name}">{zdate($val->value,"Y-m-d")}</div>
<script type="text/javascript">
Calendar.setup( { firstDay : 0, inputField : "date_{$val->column_name}", ifFormat : "%Y%m%d", displayArea : "str_{$val->column_name}", daFormat : "%Y-%m-%d"});
DyCalendar.setup( { firstDay : 0, inputField : "date_{$val->column_name}", ifFormat : "%Y%m%d", displayArea : "str_{$val->column_name}", daFormat : "%Y-%m-%d"});
</script>
<!--@end-->

View file

@ -62,7 +62,7 @@
<div class="readBody">
<div class="contentBody">
<a name="document_{$oDocument->document_srl}" />
<a name="document_{$oDocument->document_srl}"></a>
<!--@if($oDocument->isSecret() && !$oDocument->isGranted())-->
<!--%import("filter/input_password.xml")-->

View file

@ -59,6 +59,16 @@
</tr>
<!--@foreach($skin_info->extra_vars as $key => $val)-->
<!--@if($val->group && ((!$group) || $group != $val->group))-->
{@$group = $val->group}
</table>
<table cellspacing="0" class="adminTable">
<col width="150" />
<col />
<caption>{$group}</caption>
<!--@end-->
<tr>
<th scope="row">{$val->title}</th>
<td class="left">
@ -110,6 +120,14 @@
</td>
</tr>
<!--@end-->
<!--@if($group)-->
</table>
<table cellspacing="0" class="adminTable">
<col width="150" />
<col />
<!--@end-->
<tr>
<th scope="row" colspan="2" class="button">
<span class="button"><input type="submit" value="{$lang->cmd_registration}" accesskey="s" /></span>

View file

@ -52,6 +52,10 @@
// 2008. 02. 22 모듈의 추가 설정에서 댓글 추가 설정 추가
if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'comment', 'view', 'triggerDispCommentAdditionSetup', 'before')) return true;
// 2008. 05. 14 blamed count 컬럼 추가
if(!$oDB->isColumnExists("comments", "blamed_count")) return true;
if(!$oDB->isColumnExists("comment_voted_log", "point")) return true;
return false;
}
@ -88,6 +92,14 @@
if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'comment', 'view', 'triggerDispCommentAdditionSetup', 'before'))
$oModuleController->insertTrigger('module.dispAdditionSetup', 'comment', 'view', 'triggerDispCommentAdditionSetup', 'before');
// 2008. 05. 14 blamed count 컬럼 추가
if(!$oDB->isColumnExists("comments", "blamed_count")) {
$oDB->addColumn('comments', 'blamed_count', 'number', 11, 0, true);
$oDB->addIndex('comments', 'idx_blamed_count', array('blamed_count'));
}
if(!$oDB->isColumnExists("comment_voted_log", "point"))
$oDB->addColumn('comment_voted_log', 'point', 'number', 11, 0, true);
return new Object(0, 'success_updated');
}

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