From f289e77261227802ff73aa4f3c33a46fe6cd664b Mon Sep 17 00:00:00 2001 From: haneul Date: Wed, 11 Nov 2009 11:16:05 +0000 Subject: [PATCH 01/51] #18429374 : fixed checking update git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6937 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/autoinstall/autoinstall.admin.view.php | 7 ++++--- modules/autoinstall/tpl/install.html | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/autoinstall/autoinstall.admin.view.php b/modules/autoinstall/autoinstall.admin.view.php index 4f3f56e42..24541ef4f 100644 --- a/modules/autoinstall/autoinstall.admin.view.php +++ b/modules/autoinstall/autoinstall.admin.view.php @@ -97,10 +97,10 @@ } else { $package->depends[$key]->installed = true; - $package->depends[$key]->cur_version = $packages[$dep->package_srl]->version; - if(version_compare($dep->version, $packages[$dep->package_srl]->version, ">")) + $package->depends[$key]->cur_version = $packages[$dep->package_srl]->current_version; + if(version_compare($dep->version, $packages[$dep->package_srl]->current_version, ">")) { - $package->need_update = true; + $package->depends[$key]->need_update = true; $package->package_srl .= ",". $dep->package_srl; } else @@ -109,6 +109,7 @@ } } } + debugPrint($package); } $installedPackage = $oModel->getInstalledPackage($package_srl); if($installedPackage) { diff --git a/modules/autoinstall/tpl/install.html b/modules/autoinstall/tpl/install.html index 65798ef2d..481a8c1da 100644 --- a/modules/autoinstall/tpl/install.html +++ b/modules/autoinstall/tpl/install.html @@ -8,7 +8,7 @@
{$lang->depending_programs} :
{$dep->title} ver. {$dep->version} - {$lang->current_version}: {$dep->cur_version} ({$lang->require_update}) {$lang->require_installation} - {$lang->download} ({$lang->path} : {$dep->path}) + {$lang->download} ({$lang->path} : {$dep->path})
From a2a57aeaa1e056105ed7710cab7460c66125c6e4 Mon Sep 17 00:00:00 2001 From: haneul Date: Sun, 15 Nov 2009 14:09:52 +0000 Subject: [PATCH 02/51] #18429537 : Using AJAX, make it working even if FTPport is wronly set to SFTP port git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6938 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/admin.admin.model.php | 38 +++++++++++++++++++++++++++++ modules/admin/admin.admin.view.php | 27 -------------------- modules/admin/conf/module.xml | 1 + modules/admin/tpl/config.html | 25 ++++++++++--------- modules/admin/tpl/css/admin.css | 2 +- modules/admin/tpl/js/config.js | 14 +++++++++++ 6 files changed, 67 insertions(+), 40 deletions(-) create mode 100644 modules/admin/admin.admin.model.php create mode 100644 modules/admin/tpl/js/config.js diff --git a/modules/admin/admin.admin.model.php b/modules/admin/admin.admin.model.php new file mode 100644 index 000000000..d02a46d4f --- /dev/null +++ b/modules/admin/admin.admin.model.php @@ -0,0 +1,38 @@ +ftp_connect('localhost', $ftp_info->ftp_port)){ + if($oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) { + $_list = $oFtp->ftp_rawlist($pwd); + $oFtp->ftp_quit(); + } + } + $list = array(); + if(count($_list) == 0 || !$_list[0]) { + $oFtp = new ftp(); + if($oFtp->ftp_connect($_SERVER['SERVER_NAME'], $ftp_info->ftp_port)){ + if($oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) { + $_list = $oFtp->ftp_rawlist($pwd); + $oFtp->ftp_quit(); + } + } + } + + if($_list){ + foreach($_list as $k => $v){ + if(strpos($v,'d') === 0) $list[] = substr(strrchr($v,' '),1) . '/'; + } + } + $this->add('list', $list); + } + } +?> diff --git a/modules/admin/admin.admin.view.php b/modules/admin/admin.admin.view.php index fbe939f1f..21305b246 100644 --- a/modules/admin/admin.admin.view.php +++ b/modules/admin/admin.admin.view.php @@ -271,33 +271,6 @@ $pwd = Context::get('pwd'); if(!$pwd) $pwd = '/'; Context::set('pwd',$pwd); - require_once(_XE_PATH_.'libs/ftp.class.php'); - - $ftp_info = Context::getFTPInfo(); - $oFtp = new ftp(); - if($oFtp->ftp_connect('localhost', $ftp_info->ftp_port)){ - if($oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) { - $_list = $oFtp->ftp_rawlist($pwd); - $oFtp->ftp_quit(); - } - } - $list = array(); - if(count($_list) == 0 || !$_list[0]) { - $oFtp = new ftp(); - if($oFtp->ftp_connect($_SERVER['SERVER_NAME'], $ftp_info->ftp_port)){ - if($oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) { - $_list = $oFtp->ftp_rawlist($pwd); - $oFtp->ftp_quit(); - } - } - } - if($_list){ - foreach($_list as $k => $v){ - if(strpos($v,'d') === 0) $list[] = substr(strrchr($v,' '),1) . '/'; - } - } - - Context::set('list',$list); Context::set('layout','none'); $this->setTemplateFile('config'); } diff --git a/modules/admin/conf/module.xml b/modules/admin/conf/module.xml index e292da3ba..c5a0470f4 100644 --- a/modules/admin/conf/module.xml +++ b/modules/admin/conf/module.xml @@ -8,5 +8,6 @@ + diff --git a/modules/admin/tpl/config.html b/modules/admin/tpl/config.html index 51b3da5c0..a17ac510c 100644 --- a/modules/admin/tpl/config.html +++ b/modules/admin/tpl/config.html @@ -6,6 +6,7 @@ +
@@ -120,7 +127,7 @@ -

{$lang->ftp_form_title}

+

{$lang->ftp_form_title}

{$lang->about_ftp_info}

@@ -143,7 +150,7 @@
-

{$lang->ftp_path_title}

+

{$lang->ftp_path_title}

@@ -161,17 +168,11 @@ - + - - - +
+ Waiting to load information +
diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index 1c3673e02..f16f8a808 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -200,4 +200,4 @@ .adminLeftContent { float:left; width:60%; margin-right:2%; _margin-right:1.9%;} .adminRightExtra { float:left; width:38%; } - +.serverresponse { background: #FFFFFF url(../../../../common/tpl/images/loading.gif) no-repeat scroll 5px 5px; height:30px; padding-left:25px; padding-top:5px; } diff --git a/modules/admin/tpl/js/config.js b/modules/admin/tpl/js/config.js new file mode 100644 index 000000000..739e59042 --- /dev/null +++ b/modules/admin/tpl/js/config.js @@ -0,0 +1,14 @@ +function completeGetFtpInfo(ret_obj) +{ + + var e = jQuery("#ftplist").empty(); + var list = ""; + for(var i=0;i"+v+""; + } + list = "
    "+list+"
"; + e.append(jQuery(list)); +} + From 1e0778beedec38de908ae2ea2b083ffc3f61498a Mon Sep 17 00:00:00 2001 From: haneul Date: Sun, 15 Nov 2009 14:36:08 +0000 Subject: [PATCH 03/51] #18430274 : not yet completed git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6939 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/admin.admin.view.php | 2 ++ modules/admin/lang/en.lang.php | 1 + modules/admin/lang/es.lang.php | 1 + modules/admin/lang/fr.lang.php | 1 + modules/admin/lang/jp.lang.php | 1 + modules/admin/lang/ko.lang.php | 1 + modules/admin/lang/ru.lang.php | 1 + modules/admin/lang/vi.lang.php | 1 + modules/admin/lang/zh-CN.lang.php | 1 + modules/admin/tpl/config.html | 10 +++++++++- modules/admin/tpl/filter/install_ftp_info.xml | 1 + 11 files changed, 20 insertions(+), 1 deletion(-) diff --git a/modules/admin/admin.admin.view.php b/modules/admin/admin.admin.view.php index 21305b246..df551d072 100644 --- a/modules/admin/admin.admin.view.php +++ b/modules/admin/admin.admin.view.php @@ -254,6 +254,8 @@ function dispAdminConfig() { $db_info = Context::getDBInfo(); + Context::set('sftp_support', function_exists(ftp_ssl_connect)); + Context::set('selected_lang', $db_info->lang_type); Context::set('default_url', $db_info->default_url); diff --git a/modules/admin/lang/en.lang.php b/modules/admin/lang/en.lang.php index 4546592ea..d4d5c1e93 100644 --- a/modules/admin/lang/en.lang.php +++ b/modules/admin/lang/en.lang.php @@ -78,4 +78,5 @@ $lang->about_server_ports = "If your web-server uses other than 80 for HTTP, 443 for HTTPS, you should specify server ports"; $lang->use_db_session = 'Use Session DB'; $lang->about_db_session = 'It will use php session with DB when authenticating.
Websites with infrequent usage of web server may expect faster response when this function is disabled.
However session DB will make it unable to get current users, so you cannot use related functions.'; + $lang->sftp = "Use SFTP"; ?> diff --git a/modules/admin/lang/es.lang.php b/modules/admin/lang/es.lang.php index a85ed7d5b..292a43ba5 100644 --- a/modules/admin/lang/es.lang.php +++ b/modules/admin/lang/es.lang.php @@ -80,4 +80,5 @@ $lang->about_server_ports = "80 de HTTP, HTTPS al puerto 443 si se utiliza otro que se especifique lo contrario, el puerto va a necesitar."; $lang->use_db_session = '인증 세션 DB 사용'; $lang->about_db_session = '인증시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.
웹서버의 사용율이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다
단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.'; + $lang->sftp = "Use SFTP"; ?> diff --git a/modules/admin/lang/fr.lang.php b/modules/admin/lang/fr.lang.php index d815ffee9..fe7562caa 100644 --- a/modules/admin/lang/fr.lang.php +++ b/modules/admin/lang/fr.lang.php @@ -79,4 +79,5 @@ $lang->about_server_ports = "Si l'on ne veut pas utiliser le port 80 pour HTTP mais un autre port, ou bien, si l'on ne veut pas utiliser le port 443 pour HTTPS mais un autre port, on doit déclarer les ports."; $lang->use_db_session = '인증 세션 DB 사용'; $lang->about_db_session = '인증시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.
웹서버의 사용율이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다
단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.'; + $lang->sftp = "Use SFTP"; ?> diff --git a/modules/admin/lang/jp.lang.php b/modules/admin/lang/jp.lang.php index ace53460e..0a9f5bc8b 100644 --- a/modules/admin/lang/jp.lang.php +++ b/modules/admin/lang/jp.lang.php @@ -78,4 +78,5 @@ $lang->about_server_ports = '一般的に使われているHTTPの80、HTTPSの443以外の他のポートを使うために、ポートを指定して下さい。'; $lang->use_db_session = 'DBで認証セッション管理'; $lang->about_db_session = '認証の時に使われるPHPセッションをDBで使う機能です。
ウェブサーバーの負荷が低いサイトではこの機能をオフにすることでむしろサイトのレスポンスが向上されることもあります。
また、この機能をオンにすると、「現在ログイン中の会員」の機能が不可になります。'; + $lang->sftp = "Use SFTP"; ?> diff --git a/modules/admin/lang/ko.lang.php b/modules/admin/lang/ko.lang.php index 7874c3c65..a9e030047 100644 --- a/modules/admin/lang/ko.lang.php +++ b/modules/admin/lang/ko.lang.php @@ -78,4 +78,5 @@ $lang->about_server_ports = 'HTTP는 80, HTTPS는 443 이 아닌, 다른 포트를 사용할 경우에 포트를 지정해 주어야 합니다.'; $lang->use_db_session = '인증 세션 DB 사용'; $lang->about_db_session = '인증 시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.
웹서버의 사용률이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다.
단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.'; + $lang->sftp = 'SFTP 사용'; ?> diff --git a/modules/admin/lang/ru.lang.php b/modules/admin/lang/ru.lang.php index 154213f68..af6478217 100644 --- a/modules/admin/lang/ru.lang.php +++ b/modules/admin/lang/ru.lang.php @@ -79,4 +79,5 @@ $lang->about_server_ports = "HTTP는 80, HTTPS는 443이외의 다른 포트를 사용하는 경우에 포트를 지정해주어야합니다."; $lang->use_db_session = '인증 세션 DB 사용'; $lang->about_db_session = '인증시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.
웹서버의 사용율이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다
단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.'; + $lang->sftp = "Use SFTP"; ?> diff --git a/modules/admin/lang/vi.lang.php b/modules/admin/lang/vi.lang.php index 6df31474c..d073b4b5f 100644 --- a/modules/admin/lang/vi.lang.php +++ b/modules/admin/lang/vi.lang.php @@ -80,4 +80,5 @@ $lang->about_server_ports = "Nếu Host của bạn sử dụng cổng khác cổng mặc định 80 cho HTTP, 443 cho HTTPS, bạn nên xác định và nhập chính xác cổng kết nối."; $lang->use_db_session = 'Xác nhận Database'; $lang->about_db_session = 'PHP sẽ xác nhận với Database. Có thể cải thiện được tốc độ của Website.'; + $lang->sftp = "Use SFTP"; ?> diff --git a/modules/admin/lang/zh-CN.lang.php b/modules/admin/lang/zh-CN.lang.php index 5e97abaa3..c28b31730 100644 --- a/modules/admin/lang/zh-CN.lang.php +++ b/modules/admin/lang/zh-CN.lang.php @@ -78,4 +78,5 @@ $lang->about_server_ports = "使用除HTTP(80), HTTPS(443)以外的端口时,必须得指定该服务器端口号。"; $lang->use_db_session = 'DB储存认证会话'; $lang->about_db_session = '用DB储存认证时的PHP会话。
服务器使用率较少的网站建议不要勾选此项(可提高网站访问速度)。
只是无法统计在线会员。'; + $lang->sftp = "Use SFTP"; ?> diff --git a/modules/admin/tpl/config.html b/modules/admin/tpl/config.html index a17ac510c..4ee7c4ad4 100644 --- a/modules/admin/tpl/config.html +++ b/modules/admin/tpl/config.html @@ -130,19 +130,27 @@

{$lang->ftp_form_title}

{$lang->about_ftp_info}

+ {@ $nCols = 3; } + + {@ $nCols += 1; } + + + + + - diff --git a/modules/admin/tpl/filter/install_ftp_info.xml b/modules/admin/tpl/filter/install_ftp_info.xml index f3bf175a8..05160bd69 100644 --- a/modules/admin/tpl/filter/install_ftp_info.xml +++ b/modules/admin/tpl/filter/install_ftp_info.xml @@ -3,6 +3,7 @@ + From 111d966f887391770e4ce06755c60c07151c1110 Mon Sep 17 00:00:00 2001 From: haneul Date: Sun, 15 Nov 2009 14:36:27 +0000 Subject: [PATCH 04/51] #18430274 : not yet complted git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6940 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/install/install.admin.controller.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/install/install.admin.controller.php b/modules/install/install.admin.controller.php index 7ae05930a..f330a0751 100644 --- a/modules/install/install.admin.controller.php +++ b/modules/install/install.admin.controller.php @@ -119,9 +119,11 @@ * @brief FTP 정보 등록 **/ function procInstallAdminSaveFTPInfo() { - $ftp_info = Context::gets('ftp_user','ftp_password','ftp_port','ftp_root_path'); + $ftp_info = Context::gets('ftp_user','ftp_password','ftp_port','ftp_root_path','sftp'); + debugPrint($ftp_info); $ftp_info->ftp_port = (int)$ftp_info->ftp_port; if(!$ftp_info->ftp_port) $ftp_info->ftp_port = 21; + if(!$ftp_info->sftp) $ftp_info->sftp = 'N'; $buff = ' $val) { $buff .= sprintf("\$ftp_info->%s = '%s';\n", $key, str_replace("'","\\'",$val)); From 214bcaf9f8e13b6b67936a7997dd1f212573fb3a Mon Sep 17 00:00:00 2001 From: ducduydaovn Date: Sun, 15 Nov 2009 14:49:33 +0000 Subject: [PATCH 05/51] Added Vietnamese language to Auto Install Module git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6941 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/autoinstall/conf/info.xml | 4 ++++ modules/autoinstall/lang/vi.lang.php | 30 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 modules/autoinstall/lang/vi.lang.php diff --git a/modules/autoinstall/conf/info.xml b/modules/autoinstall/conf/info.xml index b2b1575df..64f75582a 100644 --- a/modules/autoinstall/conf/info.xml +++ b/modules/autoinstall/conf/info.xml @@ -2,9 +2,11 @@ 쉬운 설치 Easy-Installation + Cài đặt tự động 在线安装 관리자 모드에서 클릭으로 모듈/스킨/레이아웃/위젯/위젯스타일 등을 설치하는 모듈입니다. With this module, you can install and upgrade your programs including modules, skins, layouts, etc., from www.xpressengine.com by one-click. + Với Module này, bạn có thể cập nhật và cài đặt các phiên bản một cách tự động. Bao gồm Module, Layout, Widget, Addon, ... từ trang chủ XE bằng một bấm chuột. 很方便的在管理页面一键安装XE相关模块(模块/皮肤/布局/控件/控件样式等)。 0.1 2009-11-11 @@ -13,10 +15,12 @@ haneul haneul haneul + haneul sol sol + sol sol diff --git a/modules/autoinstall/lang/vi.lang.php b/modules/autoinstall/lang/vi.lang.php new file mode 100644 index 000000000..5e142484a --- /dev/null +++ b/modules/autoinstall/lang/vi.lang.php @@ -0,0 +1,30 @@ +autoinstall = 'Cập nhật tự động'; + $lang->about_autoinstall = 'Nó sẽ giúp bạn Cài đặt / Nâng cấp phiên bản tự động từ trang chủ XE.'; + $lang->package_update = 'Cập nhật'; + $lang->package_downloaded_count = 'Lượt Download'; + $lang->need_update = "Danh sách phiên bản cần cập nhật."; + + $lang->order_newest = "Mới nhất"; + $lang->order_popular = "Phổ biến"; + $lang->order_download = "Download"; + $lang->success_installed = "Đã cài đặt thành công."; + $lang->view_all_package = "Xem tất cả"; + $lang->description_ftp_note = "Nếu bạn chưa thiết lập FTP, sẽ không thể cài đặt đặt hay cập nhật. Xin hãy thiết lập thông tin FTP."; + $lang->description_update = "Nếu bạn cập nhật hay cài đặt mà không sử dụng chương trình cập nhật tự động, xin hãy bấm 'Cập nhật' tại trang quản lý để giữ lại thông tin đã cập nhật của chương trình."; + $lang->install = "Cài đặt"; + $lang->update = "Cập nhật"; + $lang->current_version = "Phiên bản đang dùng"; + $lang->depending_programs = "Chương trình này phụ thuộc vào "; + $lang->require_update = "Yêu cầu cập nhật."; + $lang->require_installation = "Yêu cầu cài đặt."; + $lang->description_install = "Quá trình Cài đặt / Cập nhật này phụ thuộc vào "; + $lang->description_download = "Khi FTP không được mở, bạn nên tải về và giả nén, sau đó Upload theo đường dẫn. (Nếu đường dẫn là ./modules/board, thì giải nén vào ./modules)"; + $lang->path = "Đường dẫn"; +?> From c3687c1cf8273a5d33c0024011bc5f0c4c4072b1 Mon Sep 17 00:00:00 2001 From: misol Date: Sun, 15 Nov 2009 17:04:20 +0000 Subject: [PATCH 06/51] Encoding of entry should be UTF-8. This rev. will help the connection problem of URI with entry. git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6942 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/module/ModuleHandler.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php index 890abc6d7..c637016e5 100644 --- a/classes/module/ModuleHandler.class.php +++ b/classes/module/ModuleHandler.class.php @@ -51,7 +51,7 @@ if(!$module_srl) $this->module_srl = (int)Context::get('module_srl'); else $this->module_srl = (int)$module_srl; - $this->entry = Context::get('entry'); + $this->entry = Context::convertEncodingStr(Context::get('entry')); // Validate variables to prevent XSS if($this->module && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->module)) die(Context::getLang("msg_invalid_request")); From c8e91c581f5288e88cd25d9a1ea18f2e68e57b11 Mon Sep 17 00:00:00 2001 From: royallin Date: Mon, 16 Nov 2009 02:32:31 +0000 Subject: [PATCH 07/51] Add traditional Chinese language git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6943 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/autoinstall/conf/info.xml | 10 ++++++--- modules/autoinstall/lang/zh-TW.lang.php | 30 +++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 modules/autoinstall/lang/zh-TW.lang.php diff --git a/modules/autoinstall/conf/info.xml b/modules/autoinstall/conf/info.xml index 64f75582a..5b9dc54bf 100644 --- a/modules/autoinstall/conf/info.xml +++ b/modules/autoinstall/conf/info.xml @@ -3,24 +3,28 @@ 쉬운 설치 Easy-Installation Cài đặt tự động + 自動安裝 在线安装 - 관리자 모드에서 클릭으로 모듈/스킨/레이아웃/위젯/위젯스타일 등을 설치하는 모듈입니다. - With this module, you can install and upgrade your programs including modules, skins, layouts, etc., from www.xpressengine.com by one-click. + 관리자 모드에서 클릭으로 모듈/스킨/레이아웃/위젯/위젯스타일 등을 설치하는 모듈입니다. + With this module, you can install and upgrade your programs including modules, skins, layouts, etc., from www.xpressengine.com by one-click. Với Module này, bạn có thể cập nhật và cài đặt các phiên bản một cách tự động. Bao gồm Module, Layout, Widget, Addon, ... từ trang chủ XE bằng một bấm chuột. + 관리자 모드에서 클릭으로 모듈/스킨/레이아웃/위젯/위젯스타일 등을 설치하는 모듈입니다. 很方便的在管理页面一键安装XE相关模块(模块/皮肤/布局/控件/控件样式等)。 0.1 2009-11-11 system haneul - haneul haneul haneul + haneul + haneul sol sol sol + sol sol diff --git a/modules/autoinstall/lang/zh-TW.lang.php b/modules/autoinstall/lang/zh-TW.lang.php new file mode 100644 index 000000000..0d71fd533 --- /dev/null +++ b/modules/autoinstall/lang/zh-TW.lang.php @@ -0,0 +1,30 @@ +autoinstall = '쉬운 설치'; + $lang->about_autoinstall = 'XpressEngine의 여러 프로그램을 쉽게 설치/업그레이드할 수 있도록 도와주는 모듈입니다.'; + $lang->package_update = '최근 업데이트'; + $lang->package_downloaded_count = '전체 다운로드'; + $lang->need_update = "업데이트가 필요합니다."; + + $lang->order_newest = "신규 등록"; + $lang->order_popular = "인기"; + $lang->order_download = "다운로드"; + $lang->success_installed = "설치가 성공하였습니다."; + $lang->view_all_package = "전체 보기"; + $lang->description_ftp_note = "FTP 설정이 안되어있으면 설치가 진행되지 않습니다. FTP설정을 해주세요"; + $lang->description_update = "새로 설치한 모듈의 버전 정보등은 업데이트를 눌러주시면 반영됩니다."; + $lang->install = "설치"; + $lang->update = "업데이트"; + $lang->current_version = "현재 설치 버전"; + $lang->depending_programs = "의존하고 있는 프로그램"; + $lang->require_update = "업데이트가 필요합니다."; + $lang->require_installation = "설치가 필요합니다."; + $lang->description_install = "설치를 진행하면, 이 프로그램이 의존하고 있는 모든 프로그램을 업데이트/설치 합니다."; + $lang->description_download = "FTP를 이용할 수 없는 경우, 직접 다운로드 하여 해당 path에 설치하셔야 합니다. (한칸 상위에서 압축을 푸시면 됩니다. ./modules/board의 경우 ./modules에서 tar를 푸세요)"; + $lang->path = "설치경로"; +?> From 4d0d49df8cd0f81c15e497dfebad58bbd479be68 Mon Sep 17 00:00:00 2001 From: royallin Date: Mon, 16 Nov 2009 03:16:07 +0000 Subject: [PATCH 08/51] Modify CHT language git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6944 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/autoinstall/lang/zh-TW.lang.php | 48 ++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/modules/autoinstall/lang/zh-TW.lang.php b/modules/autoinstall/lang/zh-TW.lang.php index 0d71fd533..880f9c940 100644 --- a/modules/autoinstall/lang/zh-TW.lang.php +++ b/modules/autoinstall/lang/zh-TW.lang.php @@ -1,30 +1,30 @@ autoinstall = '쉬운 설치'; - $lang->about_autoinstall = 'XpressEngine의 여러 프로그램을 쉽게 설치/업그레이드할 수 있도록 도와주는 모듈입니다.'; - $lang->package_update = '최근 업데이트'; - $lang->package_downloaded_count = '전체 다운로드'; - $lang->need_update = "업데이트가 필요합니다."; + $lang->autoinstall = '自動安裝'; + $lang->about_autoinstall = '可幫助您安裝/更新XE程式及面板。'; + $lang->package_update = '最近更新日'; + $lang->package_downloaded_count = '全部下載'; + $lang->need_update = "需要更新。"; - $lang->order_newest = "신규 등록"; - $lang->order_popular = "인기"; - $lang->order_download = "다운로드"; - $lang->success_installed = "설치가 성공하였습니다."; - $lang->view_all_package = "전체 보기"; - $lang->description_ftp_note = "FTP 설정이 안되어있으면 설치가 진행되지 않습니다. FTP설정을 해주세요"; - $lang->description_update = "새로 설치한 모듈의 버전 정보등은 업데이트를 눌러주시면 반영됩니다."; - $lang->install = "설치"; - $lang->update = "업데이트"; - $lang->current_version = "현재 설치 버전"; - $lang->depending_programs = "의존하고 있는 프로그램"; - $lang->require_update = "업데이트가 필요합니다."; - $lang->require_installation = "설치가 필요합니다."; - $lang->description_install = "설치를 진행하면, 이 프로그램이 의존하고 있는 모든 프로그램을 업데이트/설치 합니다."; - $lang->description_download = "FTP를 이용할 수 없는 경우, 직접 다운로드 하여 해당 path에 설치하셔야 합니다. (한칸 상위에서 압축을 푸시면 됩니다. ./modules/board의 경우 ./modules에서 tar를 푸세요)"; - $lang->path = "설치경로"; + $lang->order_newest = "最新"; + $lang->order_popular = "熱門"; + $lang->order_download = "下載"; + $lang->success_installed = "安裝成功"; + $lang->view_all_package = "全部檢視"; + $lang->description_ftp_note = "請先將FTP設定好,否則無法執行自動安裝功能。"; + $lang->description_update = "如果您最近不是用自動安裝模組更新或安裝,請點擊更新按鈕更新。"; + $lang->install = "安裝"; + $lang->update = "更新"; + $lang->depending_programs = "This program depends on "; + $lang->require_update = "需要更新"; + $lang->require_installation = "需要安裝"; + $lang->description_install = "Installation process also install/update programs which this program depends on"; + $lang->current_version = "安裝版本"; + $lang->description_download = "When FTP is disabled, you should download it and extract it into target path. (if target path is ./modules/board, extract it at ./modules)"; + $lang->path = "路徑"; ?> From 43c948127c6fbb3a2e9cd240be51a8c61cf25f26 Mon Sep 17 00:00:00 2001 From: haneul Date: Mon, 16 Nov 2009 03:43:21 +0000 Subject: [PATCH 09/51] =?UTF-8?q?=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6945 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/autoinstall/autoinstall.admin.controller.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/autoinstall/autoinstall.admin.controller.php b/modules/autoinstall/autoinstall.admin.controller.php index a950767c4..528196f8f 100644 --- a/modules/autoinstall/autoinstall.admin.controller.php +++ b/modules/autoinstall/autoinstall.admin.controller.php @@ -83,7 +83,7 @@ return new Object(-1,'msg_ftp_invalid_auth_info'); } - $_list = $oFtp->ftp_rawlist($ftp_config->ftp_root_path); + $_list = $oFtp->ftp_rawlist($ftp_info->ftp_root_path); if(count($_list) == 0 || !$_list[0]) { $oFtp->ftp_quit(); $oFtp = new ftp(); @@ -94,8 +94,7 @@ } } - $ftp_config = Context::getFTPInfo(); - $target_dir = $ftp_config->ftp_root_path.$this->target_path; + $target_dir = $ftp_info->ftp_root_path.$this->target_path; foreach($file_list as $k => $file){ $org_file = $file; @@ -107,7 +106,7 @@ $path_list = explode('/', dirname($this->target_path."/".$file)); $real_path = "./"; - $ftp_path = $ftp_config->ftp_root_path; + $ftp_path = $ftp_info->ftp_root_path; for($i=0;$i Date: Mon, 16 Nov 2009 04:12:43 +0000 Subject: [PATCH 10/51] git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6946 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- addons/captcha/conf/info.xml | 114 ++++++++++++++++---------------- addons/smartphone/conf/info.xml | 4 +- 2 files changed, 59 insertions(+), 59 deletions(-) diff --git a/addons/captcha/conf/info.xml b/addons/captcha/conf/info.xml index 3ece27bcf..71a3409ef 100644 --- a/addons/captcha/conf/info.xml +++ b/addons/captcha/conf/info.xml @@ -34,130 +34,130 @@ zero - zero - zero + zero + zero zero - zero + zero zero Captcha 표시 대상 - 应用对象 - Captchaを表示する対象 - 選擇目標 + 应用对象 + Captchaを表示する対象 + 選擇目標 Captcha Target Mục tiêu Captcha hiển thị 글/댓글 등록시 captcha가 동작할 대상을 정할 수 있습니다. 관리자는 무조건 제외됩니다 - 可以指定验证码应用对象(管理员除外)。 - 管理者を除き、書き込み・コメントを入力する際にcaptchaイメージを見せる対象を設定します。 - 除了管理員,在發表主題或評論時,設定圖形驗證應用的對象。 + 可以指定验证码应用对象(管理员除外)。 + 管理者を除き、書き込み・コメントを入力する際にcaptchaイメージを見せる対象を設定します。 + 除了管理員,在發表主題或評論時,設定圖形驗證應用的對象。 You may specify targets CAPTCHA work. It's not applied when administrator writes. Khi gửi bài, bình luận, Capcha sẽ hiển thị để xác nhận hành động của người sử dụng. Chức năng này không hoạt động với người quản lý. 로그인하지 않은 사용자 - 非登录用户 - ログインしてないユーザー - 非用戶 + 非登录用户 + ログインしてないユーザー + 非用戶 Not logged-in users Người dùng chưa đăng nhập 모든 사용자 - 所有用户 - すべてのユーザー - 所有用戶 + 所有用户 + すべてのユーザー + 所有用戶 All users Tất cả mọi người 동작 방식 - 验证方式 - 動作方式 - 行為模式 + 验证方式 + 動作方式 + 行為模式 How it works Sử dụng "1번만 동작"을 선택하시면 1번만 동작후 상태를 저장해서 다음부터 물어보지 않고 그렇지 않으면 매번 물어보게 됩니다 - "一次"就是每个IP只出现一次验证。 - 「1回だけ表示」を選択すると、最初だけ動作した後、その情報を記憶して次回からはCaptchaを見せないようにします。また、もう一つのオプションは毎回Captchaを表示します。 - 選擇"單次",產生第一次動作後,下次不會再顯示;選擇"每次"則會一直顯示。 + "一次"就是每个IP只出现一次验证。 + 「1回だけ表示」を選択すると、最初だけ動作した後、その情報を記憶して次回からはCaptchaを見せないようにします。また、もう一つのオプションは毎回Captchaを表示します。 + 選擇"單次",產生第一次動作後,下次不會再顯示;選擇"每次"則會一直顯示。 If you choose "Once", CAPTCHA works only once for the user by storing status. Otherwise, this addon would show an image every time the user writes. Nếu chọn "Chỉ một lần" thì sau lần hiển thị đó Capcha sẽ không hiển thị với người sử dụng đó nữa. 1번만 동작 - 一次 - 1回だけ表示 - 單次 + 一次 + 1回だけ表示 + 單次 Chỉ một lần once 매번 동작 - 每次 - 毎回表示 - 每次 + 每次 + 毎回表示 + 每次 every time Luôn sử dụng - 비밀번호 찾기 적용 - 应用到查找密码功能 - 비밀번호 찾기 적용 - 비밀번호 찾기 적용 - applying to an action finding account - Khi lấy lại mật khẩu - 적용으로 하시면 비밀번호 찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. - 启用此项功能可以有效地拦截以查找密码名义发送的垃圾邮件。 - 적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. - 적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. - If you set this option as apply, CAPTCHA will work for finding account action, too. - Nếu áp dụng, khi thành viên cần lấy lại mật khẩu khi lỡ quên, Capcha sẽ hiện thị để xác nhận việc này. + 비밀번호 찾기 적용 + 应用到查找密码功能 + 비밀번호 찾기 적용 + 비밀번호 찾기 적용 + applying to an action finding account + Khi lấy lại mật khẩu + 적용으로 하시면 비밀번호 찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. + 启用此项功能可以有效地拦截以查找密码名义发送的垃圾邮件。 + 적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. + 적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. + If you set this option as apply, CAPTCHA will work for finding account action, too. + Nếu áp dụng, khi thành viên cần lấy lại mật khẩu khi lỡ quên, Capcha sẽ hiện thị để xác nhận việc này. 적용하지 않음 - 不启用 - 적용하지 않음 - 적용하지 않음 + 不启用 + 적용하지 않음 + 적용하지 않음 Not apply Không áp dụng 적용 - 启用 - 적용 - 적용 + 启用 + 적용 + 적용 Apply Áp dụng 인증 메일 재발송 적용 - 应用到认证邮件重新发送功能 - 인증 메일 재발송 적용 - 인증 메일 재발송 적용 + 应用到认证邮件重新发送功能 + 인증 메일 재발송 적용 + 인증 메일 재발송 적용 apply to an action resending authmail Khi lấy lại mã kích hoạt 적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. - 启用此项功能可以有效地拦截以重新发送认证邮件名义发送的垃圾邮件。 - 적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. - 적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. + 启用此项功能可以有效地拦截以重新发送认证邮件名义发送的垃圾邮件。 + 적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. + 적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. If you set this option as apply, CAPTCHA will work for resending authmail action, too. Nếu áp dụng, khi thành viên cần lấy lại mã kích hoạt thành viên, Capcha sẽ hiện thị để xác nhận việc này. 적용하지 않음 - 不启用 - 적용하지 않음 - 적용하지 않음 + 不启用 + 적용하지 않음 + 적용하지 않음 Not apply Không áp dụng 적용 - 启用 - 적용 - 적용 + 启用 + 적용 + 적용 Apply Áp dụng diff --git a/addons/smartphone/conf/info.xml b/addons/smartphone/conf/info.xml index 3c16e2adf..e0268a029 100644 --- a/addons/smartphone/conf/info.xml +++ b/addons/smartphone/conf/info.xml @@ -19,7 +19,7 @@ Addon này sẽ hiển thị Website trên màn hình iPhone một cách tốt nhất khi người dùng sử dụng SmartPhone để truy cập (iPhone cảm ứng) - 以 IPhone (touch) 和 smartphone 瀏覽時會以最適當的畫面顯示。 + 用iPhone(touch)和智慧型手機瀏覽時會以最適當的畫面顯示。 IPhone(touch)など、スマートフォンからアクセスした時、最適化されたインターフェースで表示させます。 @@ -29,7 +29,7 @@ haneul haneul - haneul + haneul haneul haneul haneul From c4fe618378092b2ed0f8f3141c76df93736c9a40 Mon Sep 17 00:00:00 2001 From: royallin Date: Mon, 16 Nov 2009 04:26:40 +0000 Subject: [PATCH 11/51] git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6947 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/zh-TW.lang.php | 6 ++--- layouts/xe_official/conf/info.xml | 24 +++++++++---------- modules/autoinstall/conf/info.xml | 2 +- modules/editor/lang/zh-TW.lang.php | 2 +- modules/editor/skins/xpresseditor/skin.xml | 20 ++++++++-------- modules/editor/styles/default/skin.xml | 7 +++++- modules/editor/styles/xeStyle/skin.xml | 14 +++++------ modules/editor/styles/xeStyleBlack/skin.xml | 12 +++++----- widgets/content/conf/info.xml | 10 ++++---- widgets/counter_status/conf/info.xml | 2 +- widgetstyles/simple/skin.xml | 26 ++++++++++----------- 11 files changed, 65 insertions(+), 60 deletions(-) diff --git a/common/lang/zh-TW.lang.php b/common/lang/zh-TW.lang.php index 1ceb1bdb2..d826b25fe 100644 --- a/common/lang/zh-TW.lang.php +++ b/common/lang/zh-TW.lang.php @@ -297,9 +297,9 @@ $lang->msg_ftp_chmod_fail = '修改資料夾權限失敗。請確認FTP主機設置。'; $lang->msg_ftp_connect_success = 'FTP連線成功。'; - $lang->ftp_path_title = 'FTP 경로 정보 입력'; - $lang->msg_ftp_installed_realpath = '설치된 XE의 절대경로'; - $lang->msg_ftp_installed_ftp_realpath = '설치된 XE의 FTP 절대경로 설정'; + $lang->ftp_path_title = '請輸入FTP路經'; + $lang->msg_ftp_installed_realpath = '請輸入安裝XE時的絕對路經'; + $lang->msg_ftp_installed_ftp_realpath = '請輸入安裝XE時的FTP絕對路經'; // 在xml filter中所使用的JavaScript警告訊息 diff --git a/layouts/xe_official/conf/info.xml b/layouts/xe_official/conf/info.xml index aa8a647f8..43b1dd343 100644 --- a/layouts/xe_official/conf/info.xml +++ b/layouts/xe_official/conf/info.xml @@ -89,7 +89,7 @@ Colorset Colorset Set de colores - Màu sắc + Màu sắc 원하시는 컬러셋을 선택해주세요. 希望するカラーセットを選択して下さい。 请选择颜色。 @@ -98,7 +98,7 @@ Bitte wählen Sie ein colorset Sie wollen. Выберите colorset хотите. Seleccione set de colores que desea. - Hãy chọn màu sắc bạn muốn. + Hãy chọn màu sắc bạn muốn. 기본 デフォルト @@ -108,7 +108,7 @@ Básico 默认 預設 - Cơ bản + Cơ bản 검은색 @@ -119,7 +119,7 @@ Negro 黑色 黑色 - Black + Black 하얀색 @@ -130,7 +130,7 @@ Blanco 白色 白色 - White + White @@ -142,7 +142,7 @@ Logobildes Изображения логотипа Imagen del logotipo - Hình Logo + Hình Logo 레이아웃의 상단에 표시될 로고이미지를 입력하세요. (세로길이가 23px인 투명이미지가 가장 어울립니다) レイアウトの上段に表示されるロゴイメージを入力して下さい。 (縦幅が23pxである透明イメージをお勧めします。。) 请输入显示在布局顶部的LOGO图片(高度为23px的透明图片为适)。 @@ -162,7 +162,7 @@ Homepage URL Домашняя страница URL URL de la página web - URL Trang chủ + URL Trang chủ 로고를 클릭시에 이동할 홈 페이지 URL을 입력해 주세요. ロゴをクリックした時に移動するホームページのURLを入力して下さい。 点击网站LOGO时要移动的页面URL。 @@ -171,7 +171,7 @@ Bitte geben Sie die URL umzuleiten, wenn Benutzer klickt das Logo Пожалуйста, введите URL для перенаправления, когда пользователь нажимает логотип Ingresar el URL de la página web para redireccionar al pulsar el logotipo - Hãy nhập địa chỉ bạn muốn chuyển đến khi bấm vào Logo + Hãy nhập địa chỉ bạn muốn chuyển đến khi bấm vào Logo 배경 이미지 @@ -182,7 +182,7 @@ Hintergrundbild Фоновое изображение Imagen de fondo - Hình nền + Hình nền 배경 이미지를 사용하시려면 등록해주세요. 背景イメージを使う場合は、登録して下さい。 要想使用背景图片请在这里上传。 @@ -191,7 +191,7 @@ Bitte geben Sie, wenn Sie verwenden wollen Hintergrundbild. Введите, если вы хотите использовать фоновое изображение. Ingresar imagen de fondo si desea usar. - Hãy nhập hình nền nếu bạn muốn sử dụng. + Hãy nhập hình nền nếu bạn muốn sử dụng. @@ -205,7 +205,7 @@ Top Menü Верхнее меню Menú Principal - Menu trên + Menu trên 하단 메뉴 @@ -216,7 +216,7 @@ Bottom-Menü Внизу меню Menú Inferior - Menu dưới + Menu dưới diff --git a/modules/autoinstall/conf/info.xml b/modules/autoinstall/conf/info.xml index 5b9dc54bf..34109790e 100644 --- a/modules/autoinstall/conf/info.xml +++ b/modules/autoinstall/conf/info.xml @@ -8,7 +8,7 @@ 관리자 모드에서 클릭으로 모듈/스킨/레이아웃/위젯/위젯스타일 등을 설치하는 모듈입니다. With this module, you can install and upgrade your programs including modules, skins, layouts, etc., from www.xpressengine.com by one-click. Với Module này, bạn có thể cập nhật và cài đặt các phiên bản một cách tự động. Bao gồm Module, Layout, Widget, Addon, ... từ trang chủ XE bằng một bấm chuột. - 관리자 모드에서 클릭으로 모듈/스킨/레이아웃/위젯/위젯스타일 등을 설치하는 모듈입니다. + With this module, you can install and upgrade your programs including modules, skins, layouts, etc., from www.xpressengine.com by one-click. 很方便的在管理页面一键安装XE相关模块(模块/皮肤/布局/控件/控件样式等)。 0.1 2009-11-11 diff --git a/modules/editor/lang/zh-TW.lang.php b/modules/editor/lang/zh-TW.lang.php index 7aac102f2..0f003ed85 100644 --- a/modules/editor/lang/zh-TW.lang.php +++ b/modules/editor/lang/zh-TW.lang.php @@ -218,7 +218,7 @@ $lang->edit->materials = '글감보관함'; $lang->edit->temporary_savings = '暫存檔列表'; - $lang->edit->drag_here = '아래의 단락추가 툴바에서 원하는 유형의 단락을 추가해 글 쓰기를 시작하세요.
글감 보관함에 글이 있으면 이곳으로 끌어 넣기 할 수 있습니다.'; + $lang->edit->drag_here = 'You can start writting with a selected paragraph from paragraph toolbar below.
如果有暫存文章,可直接拖曳進行編輯。'; $lang->edit->paging_prev = '前頁'; $lang->edit->paging_next = '次頁'; diff --git a/modules/editor/skins/xpresseditor/skin.xml b/modules/editor/skins/xpresseditor/skin.xml index 53a8e5d73..72b14f803 100644 --- a/modules/editor/skins/xpresseditor/skin.xml +++ b/modules/editor/skins/xpresseditor/skin.xml @@ -6,7 +6,7 @@ XpressEditor Skin XpressEditorスキン XpressEditor皮肤 - XpressEditor面板  + XpressEditor面板 XpressEditor based on SmartEditor Basic by 행복한고니 @@ -32,11 +32,11 @@ 2009-03-22 행복한고니 - gony - gony + gony + gony gony gony - gony + gony gony @@ -67,7 +67,7 @@ White Text Editor(Auto Line Break) Editor de texto en blanco (Auto de línea) 白色文本编辑器(使用HTML,自动换行) - 白色文字編輯器(Auto Line Break) + 白色文字編輯器(使用HTML,自動換行) 검은색 텍스트편집기(HTML 사용, 자동 줄 바꿈) @@ -77,7 +77,7 @@ Black Text Editor(Auto Line Break) Editor de texto negro (salto de línea automático) 黑色文本编辑器(使用HTML,自动换行) - 黑色文字編輯器(Auto Line Break) + 黑色文字編輯器(使用HTML,自動換行) 하얀색 텍스트편집기(HTML 사용, 자동 줄 바꿈 안함) @@ -87,7 +87,7 @@ White Text Editor(Use HTML) Editor de texto en blanco (Uso de HTML) 白色文本编辑器(使用HTML,不自动换行) - 白色文字編輯器(Use HTML) + 白色文字編輯器(使用HTML,不自動換行) 검은색 텍스트편집기(HTML 사용, 자동 줄 바꿈 안함) @@ -97,7 +97,7 @@ Black Text Editor(Use HTML) Editor de texto negro (Uso de HTML) 黑色文本编辑器(使用HTML,不自动换行) - 黑色文字編輯器(Use HTML) + 黑色文字編輯器(使用HTML,不自動換行) 하얀색 텍스트편집기(HTML 사용 안함, 자동 줄 바꿈) @@ -107,7 +107,7 @@ White Text Editor(No HTML) Editor de texto en blanco (no HTML) 白色文本编辑器(不使用HTML,自动换行) - 白色文字編輯器(No HTML) + 白色文字編輯器(不使用HTML,自動換行) 검은색 텍스트편집기(HTML 사용 안함, 자동 줄 바꿈) @@ -117,7 +117,7 @@ Black Text Editor(No HTML) Editor de texto negro (no HTML) 黑色文本编辑器(不使用HTML,自动换行) - 黑色文字編輯器(No HTML) + 黑色文字編輯器(不使用HTML,自動換行) diff --git a/modules/editor/styles/default/skin.xml b/modules/editor/styles/default/skin.xml index 2ec500816..25e1b6f61 100644 --- a/modules/editor/styles/default/skin.xml +++ b/modules/editor/styles/default/skin.xml @@ -14,6 +14,10 @@ XE默认样式。 主题显示及编辑不会受到任何影响,即原样输出。 + + XE預設樣式。 + 主題顯示和編輯不會受到影響。 + XEの基本ドキュメント書式です。 そのまま表示されるだけで、編集・出力には影響しません。 @@ -29,7 +33,8 @@ 2009-05-23 정찬명 - Chan-Myung Jeong + Chan-Myung Jeong + Chan-Myung Jeong Chan-Myung Jeong Chan-Myung Jeong Chan-Myung Jeong diff --git a/modules/editor/styles/xeStyle/skin.xml b/modules/editor/styles/xeStyle/skin.xml index 6112df29e..5d3df4b64 100644 --- a/modules/editor/styles/xeStyle/skin.xml +++ b/modules/editor/styles/xeStyle/skin.xml @@ -2,9 +2,9 @@ XE 기본 서식 (하얀 배경) XE默认样式(白色背景) + XE預設樣式(白色背景) XE Mặc định (Nền sáng) XEデフォルトスタイル(白色背景) - XE預設樣式(白色背景) XE 기본 문서 서식입니다. 문서 수정중에는 각 요소들이 구분되어 보입니다. @@ -13,6 +13,10 @@ XE默认样式。 在编辑文档时,可清晰地区分各标签区域。 + + XE編輯器預設樣式。 + 編輯檔案時,可以清楚地區分各標籤。 + Trang mẫu mặc định của XE. Nó sẽ hiển thị trong phần sửa đổi bài viết. @@ -21,17 +25,13 @@ XEのデフォルトドキュメントのスタイルです。 ドキュメント編集中には、各要素が区分されて見えます。 - - XE編輯器預設樣式。 - 문서 수정중에는 각 요소들이 구분되어 보입니다. - 0.0.1 2009-04-17 정찬명 - Chan-Myung Jeong + Chan-Myung Jeong + Chan-Myung Jeong Chan-Myung Jeong Chan-Myung Jeong - Chan-Myung Jeong diff --git a/modules/editor/styles/xeStyleBlack/skin.xml b/modules/editor/styles/xeStyleBlack/skin.xml index 22aea761c..20cd507c5 100644 --- a/modules/editor/styles/xeStyleBlack/skin.xml +++ b/modules/editor/styles/xeStyleBlack/skin.xml @@ -2,9 +2,9 @@ XE 기본 서식 (검은 배경) XE默认格式(黑色背景) + XE預設樣式(黑色背景) XE Mặc định (Nền tối) XEデフォルトスタイル(黒色背景) - XE預設樣式(黑色背景) XE 기본 문서 서식입니다. 문서 수정중에는 각 요소들이 구분되어 보입니다. @@ -13,6 +13,10 @@ XE默认格式。 在编辑文档时,可清晰地区分各标签区域。 + + XE編輯器預設樣式。 + 編輯檔案時,可清楚地區分各標籤。 + Mẫu mặc định của XE. Nó sẽ hiển thị trong phần sửa đổi bài viết. @@ -21,17 +25,13 @@ XEのデフォルトドキュメントのスタイルです。 ドキュメント編集中には、各要素が区分されて見えます。 - - XE編輯器預設樣式。 - 문서 수정중에는 각 요소들이 구분되어 보입니다. - 0.0.1 2009-04-17 정찬명 Chan-Myung Jeong + Chan-Myung Jeong Chan-Myung Jeong Chan-Myung Jeong - Chan-Myung Jeong diff --git a/widgets/content/conf/info.xml b/widgets/content/conf/info.xml index a709da03b..3a4828196 100644 --- a/widgets/content/conf/info.xml +++ b/widgets/content/conf/info.xml @@ -41,7 +41,7 @@ Article Bài viết 主题 - 主題 + 主題 書き込み @@ -50,7 +50,7 @@ Comment Bình luận 评论 - 評論 + 評論 コメント @@ -59,7 +59,7 @@ Attached Image Hình đính kèm 图片 - 圖片 + 圖片 添付イメージ @@ -68,7 +68,7 @@ Trackback Liên kết Web 引用 - 引用 + 引用 トラックバック @@ -77,7 +77,7 @@ Feed (RSS/ATOM) Feed (RSS/ATOM) Feed (RSS/ATOM) - Feed (RSS/ATOM) + Feed (RSS/ATOM) Feed (RSS/ATOM) diff --git a/widgets/counter_status/conf/info.xml b/widgets/counter_status/conf/info.xml index 211ef4c46..63cba96e5 100644 --- a/widgets/counter_status/conf/info.xml +++ b/widgets/counter_status/conf/info.xml @@ -55,6 +55,6 @@ zero zero zero - zero + zero diff --git a/widgetstyles/simple/skin.xml b/widgetstyles/simple/skin.xml index 77fa30e58..46eaff502 100644 --- a/widgetstyles/simple/skin.xml +++ b/widgetstyles/simple/skin.xml @@ -19,7 +19,7 @@ sol sol - sol + sol sol sol sol @@ -29,20 +29,20 @@ 컬러셋 Colorset - Tạo màu + Tạo màu 颜色 顏色 カラーセット 컬러셋을 지정해주세요 Choose colorset - Lựa chọn màu sắc + Lựa chọn màu sắc 请指定适当的颜色。 請選擇顏色。 カラーセットを指定して下さい。 하얀색 White - White + White 白色 白色 @@ -51,7 +51,7 @@ 검은색 Black - Black + Black 黑色 黑色 @@ -61,13 +61,13 @@ 제목 Title - Tiêu đề + Tiêu đề 栏目名 標題 タイトル 제목 텍스트 Title text - Chữ của tiêu đề + Chữ của tiêu đề 请输入栏目名。 請輸入標題。 「タイトル」のテキスト @@ -75,28 +75,28 @@ 더보기 URL more URL - URL của Xem thêm + URL của Xem thêm 查看更多(链接) more URL 「もっと見る」URL http:// 포함한 URL를 등록합니다. - 请输入包含http://的URL地址。 - 請輸入http://以外的URL網址。 + 请输入包含http://的URL地址。 + 請輸入http://以外的URL網址。 Destination of a link 'more'. Register an URL including http:// - Địa chỉ trang sẽ chuyển đến khi bấm vào Xem thêm (Bao gồm cả http://) + Địa chỉ trang sẽ chuyển đến khi bấm vào Xem thêm (Bao gồm cả http://) 「http://」を含んだURLを登録します。 더보기 텍스트 more Text - Chữ của Xem thêm + Chữ của Xem thêm 查看更多(文本) more TEXT 「もっと見る」テキスト 더보기 텍스트 Text for a link 'more' 文本格式的"查看更多"。 - Có thể dùng những từ khác thay cho từ Xem thêm + Có thể dùng những từ khác thay cho từ Xem thêm 純文字格式。 「もっと見る」テキスト From 51e758fd396acc35f6fc66b195b1257f5224b6ce Mon Sep 17 00:00:00 2001 From: haneul Date: Mon, 16 Nov 2009 04:35:29 +0000 Subject: [PATCH 12/51] #18430274 : support SFTP git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6948 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/admin.admin.model.php | 41 +++++++++++- modules/admin/admin.admin.view.php | 18 ++++-- modules/admin/tpl/config.html | 3 +- .../autoinstall.admin.controller.php | 63 ++++++++++++++++--- .../autoinstall/autoinstall.admin.view.php | 1 - modules/install/install.admin.controller.php | 1 - modules/install/install.controller.php | 30 ++++++--- 7 files changed, 131 insertions(+), 26 deletions(-) diff --git a/modules/admin/admin.admin.model.php b/modules/admin/admin.admin.model.php index d02a46d4f..1a0f55e21 100644 --- a/modules/admin/admin.admin.model.php +++ b/modules/admin/admin.admin.model.php @@ -2,17 +2,52 @@ class adminAdminModel extends admin { + var $pwd; + + function getSFTPList() + { + $ftp_info = Context::getFTPInfo(); + $connection = ssh2_connect('localhost', $ftp_info->ftp_port); + if(!ssh2_auth_password($connection, $ftp_info->ftp_user, $ftp_info->ftp_password)) + { + return new Object(-1,'msg_ftp_invalid_auth_info'); + } + + $sftp = ssh2_sftp($connection); + $curpwd = "ssh2.sftp://$sftp".$this->pwd; + $dh = opendir($curpwd); + $list = array(); + while(($file = readdir($dh)) !== false) { + if(is_dir($curpwd.$file)) + { + $file .= "/"; + } + else + { + continue; + } + $list[] = $file; + } + closedir($dh); + $this->add('list', $list); + } + function getAdminFTPList() { set_time_limit(5); require_once(_XE_PATH_.'libs/ftp.class.php'); $ftp_info = Context::getFTPInfo(); - $pwd = Context::get('pwd'); + $this->pwd = Context::get('pwd'); + + if($ftp_info->sftp == 'Y') + { + return $this->getSFTPList(); + } $oFtp = new ftp(); if($oFtp->ftp_connect('localhost', $ftp_info->ftp_port)){ if($oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) { - $_list = $oFtp->ftp_rawlist($pwd); + $_list = $oFtp->ftp_rawlist($this->pwd); $oFtp->ftp_quit(); } } @@ -21,7 +56,7 @@ $oFtp = new ftp(); if($oFtp->ftp_connect($_SERVER['SERVER_NAME'], $ftp_info->ftp_port)){ if($oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) { - $_list = $oFtp->ftp_rawlist($pwd); + $_list = $oFtp->ftp_rawlist($this->pwd); $oFtp->ftp_quit(); } } diff --git a/modules/admin/admin.admin.view.php b/modules/admin/admin.admin.view.php index df551d072..015112d50 100644 --- a/modules/admin/admin.admin.view.php +++ b/modules/admin/admin.admin.view.php @@ -254,7 +254,7 @@ function dispAdminConfig() { $db_info = Context::getDBInfo(); - Context::set('sftp_support', function_exists(ftp_ssl_connect)); + Context::set('sftp_support', function_exists(ssh2_sftp)); Context::set('selected_lang', $db_info->lang_type); @@ -263,15 +263,25 @@ Context::set('langs', Context::loadLangSupported()); Context::set('lang_selected', Context::loadLangSelected()); - - Context::set('ftp_info', Context::getFTPInfo()); + + $ftp_info = Context::getFTPInfo(); + Context::set('ftp_info', $ftp_info); $site_args->site_srl = 0; $output = executeQuery('module.getSiteInfo', $site_args); Context::set('start_module', $output->data); $pwd = Context::get('pwd'); - if(!$pwd) $pwd = '/'; + if(!$pwd) { + if($ftp_info->sftp == 'Y') + { + $pwd = _XE_PATH_; + } + else + { + $pwd = '/'; + } + } Context::set('pwd',$pwd); Context::set('layout','none'); $this->setTemplateFile('config'); diff --git a/modules/admin/tpl/config.html b/modules/admin/tpl/config.html index 4ee7c4ad4..9898ac867 100644 --- a/modules/admin/tpl/config.html +++ b/modules/admin/tpl/config.html @@ -146,7 +146,7 @@
- + @@ -163,6 +163,7 @@ +
+ sftp=="Y")-->checked="checked" />
diff --git a/modules/autoinstall/autoinstall.admin.controller.php b/modules/autoinstall/autoinstall.admin.controller.php index 528196f8f..43bca2f2b 100644 --- a/modules/autoinstall/autoinstall.admin.controller.php +++ b/modules/autoinstall/autoinstall.admin.controller.php @@ -14,11 +14,6 @@ var $url; var $download_path; - function ModuleInstaller(&$package) - { - $this->package =& $package; - } - function _download() { if($this->package->path == ".") @@ -70,6 +65,53 @@ return $file_list; } + } + + class SFTPModuleInstaller extends ModuleInstaller { + function SFTPModuleInstaller(&$package) + { + $this->package =& $package; + } + + function _copyDir(&$file_list){ + $ftp_info = Context::getFTPInfo(); + if(!$ftp_info->ftp_user || !$ftp_info->ftp_password || !$ftp_info->sftp || $ftp_info->sftp != 'Y') return new Object(-1,'msg_ftp_invalid_auth_info'); + + $connection = ssh2_connect('localhost', $ftp_info->ftp_port); + if(!ssh2_auth_password($connection, $ftp_info->ftp_user, $ftp_info->ftp_password)) + { + return new Object(-1,'msg_ftp_invalid_auth_info'); + } + + $sftp = ssh2_sftp($connection); + + $target_dir = $ftp_info->ftp_root_path.$this->target_path; + + foreach($file_list as $k => $file){ + $org_file = $file; + if($this->package->path == ".") + { + $file = substr($file,3); + } + $path = FileHandler::getRealPath("./".$this->target_path."/".$file); + $pathname = dirname($target_dir."/".$file); + + if(!file_exists(FileHandler::getRealPath($real_path))) + { + ssh2_sftp_mkdir($sftp, $pathname, 0755, true); + } + + ssh2_scp_send($connection, FileHandler::getRealPath($this->download_path."/".$org_file), $target_dir."/".$file); + } + } + } + + class FTPModuleInstaller extends ModuleInstaller { + function FTPModuleInstaller(&$package) + { + $this->package =& $package; + } + function _copyDir(&$file_list){ $ftp_info = Context::getFTPInfo(); if(!$ftp_info->ftp_user || !$ftp_info->ftp_password) return new Object(-1,'msg_ftp_invalid_auth_info'); @@ -125,7 +167,6 @@ return new Object(); } - } class autoinstallAdminController extends autoinstall { @@ -235,10 +276,18 @@ $package_srls = Context::get('package_srl'); $oModel =& getModel('autoinstall'); $packages = explode(',', $package_srls); + $ftp_info = Context::getFTPInfo(); foreach($packages as $package_srl) { $package = $oModel->getPackage($package_srl); - $oModuleInstaller = new ModuleInstaller($package); + if($ftp_info->sftp && $ftp_info->sftp == 'Y') + { + $oModuleInstaller = new SFTPModuleInstaller($package); + } + else + { + $oModuleInstaller = new FTPModuleInstaller($package); + } $oModuleInstaller->install(); } $this->setMessage('success_installed'); diff --git a/modules/autoinstall/autoinstall.admin.view.php b/modules/autoinstall/autoinstall.admin.view.php index 24541ef4f..c1366fa43 100644 --- a/modules/autoinstall/autoinstall.admin.view.php +++ b/modules/autoinstall/autoinstall.admin.view.php @@ -109,7 +109,6 @@ } } } - debugPrint($package); } $installedPackage = $oModel->getInstalledPackage($package_srl); if($installedPackage) { diff --git a/modules/install/install.admin.controller.php b/modules/install/install.admin.controller.php index f330a0751..41a670eee 100644 --- a/modules/install/install.admin.controller.php +++ b/modules/install/install.admin.controller.php @@ -120,7 +120,6 @@ **/ function procInstallAdminSaveFTPInfo() { $ftp_info = Context::gets('ftp_user','ftp_password','ftp_port','ftp_root_path','sftp'); - debugPrint($ftp_info); $ftp_info->ftp_port = (int)$ftp_info->ftp_port; if(!$ftp_info->ftp_port) $ftp_info->ftp_port = 21; if(!$ftp_info->sftp) $ftp_info->sftp = 'N'; diff --git a/modules/install/install.controller.php b/modules/install/install.controller.php index 4d4f75e0a..022c3f233 100644 --- a/modules/install/install.controller.php +++ b/modules/install/install.controller.php @@ -117,22 +117,34 @@ } function procInstallCheckFtp() { - $ftp_info = Context::gets('ftp_user','ftp_password','ftp_port'); + $ftp_info = Context::gets('ftp_user','ftp_password','ftp_port','sftp'); $ftp_info->ftp_port = (int)$ftp_info->ftp_port; if(!$ftp_info->ftp_port) $ftp_info->ftp_port = 21; + if(!$ftp_info->sftp) $ftp_info->sftp = 'N'; if(!$ftp_info->ftp_user || !$ftp_info->ftp_password) return new Object(-1,'msg_safe_mode_ftp_needed'); - require_once(_XE_PATH_.'libs/ftp.class.php'); - $oFtp = new ftp(); - if(!$oFtp->ftp_connect('localhost', $ftp_info->ftp_port)) return new Object(-1,'msg_ftp_not_connected'); - - if(!$oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) { - $oFtp->ftp_quit(); - return new Object(-1,'msg_ftp_invalid_auth_info'); + if($ftp_info->sftp == 'Y') + { + $connection = ssh2_connect('localhost', $ftp_info->ftp_port); + if(!ssh2_auth_password($connection, $ftp_info->ftp_user, $ftp_info->ftp_password)) + { + return new Object(-1,'msg_ftp_invalid_auth_info'); + } } + else + { + require_once(_XE_PATH_.'libs/ftp.class.php'); + $oFtp = new ftp(); + if(!$oFtp->ftp_connect('localhost', $ftp_info->ftp_port)) return new Object(-1,'msg_ftp_not_connected'); - $oFtp->ftp_quit(); + if(!$oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) { + $oFtp->ftp_quit(); + return new Object(-1,'msg_ftp_invalid_auth_info'); + } + + $oFtp->ftp_quit(); + } $this->setMessage('msg_ftp_connect_success'); } From 90f8534df4b1daecc33ef662c02402e4eecde94b Mon Sep 17 00:00:00 2001 From: mglclub Date: Mon, 16 Nov 2009 07:57:38 +0000 Subject: [PATCH 13/51] git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6949 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/lang.info | 1 + common/lang/mn.lang.php | 313 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 314 insertions(+) create mode 100644 common/lang/mn.lang.php diff --git a/common/lang/lang.info b/common/lang/lang.info index 68b9ca520..7214cdc30 100644 --- a/common/lang/lang.info +++ b/common/lang/lang.info @@ -7,3 +7,4 @@ ru,Русский fr,Français zh-TW,中文(臺灣) vi,Tiếng Việt +mn,Mongolian diff --git a/common/lang/mn.lang.php b/common/lang/mn.lang.php new file mode 100644 index 000000000..67ac17dab --- /dev/null +++ b/common/lang/mn.lang.php @@ -0,0 +1,313 @@ +cmd_write = 'Бичих'; + $lang->cmd_reply = 'Хариу'; + $lang->cmd_delete = 'Устгах'; + $lang->cmd_modify = 'Засах'; + $lang->cmd_edit = 'Өөрчлөх'; + $lang->cmd_view = 'Харах'; + $lang->cmd_view_all = 'Бүгдийг харах'; + $lang->cmd_list = 'Жагсаалт'; + $lang->cmd_prev = 'Өмнөх'; + $lang->cmd_next = 'Дараах'; + $lang->cmd_send_trackback = 'Холбоотой бичлэг илгээх'; + $lang->cmd_registration = $lang->cmd_submit = 'Оруулах'; + $lang->cmd_comment_registration = 'Коммент бичих'; + $lang->cmd_insert = 'Нэмэх'; + $lang->cmd_save = 'Хадгалах'; + $lang->cmd_load = 'Дуудах'; + $lang->cmd_input = 'Оруулах'; + $lang->cmd_search = 'Хайх'; + $lang->cmd_find = 'Хайх'; + $lang->cmd_replace = 'Солих'; + $lang->cmd_confirm = 'ОК'; + $lang->cmd_cancel = 'Устгах'; + $lang->cmd_back = 'Буцах'; + $lang->cmd_vote = 'Санал болгох'; + $lang->cmd_vote_down = 'Санал болгохгүй'; + $lang->cmd_declare = 'Мэдээлэх'; + $lang->cmd_cancel_declare = 'Мэдэгдлийг устгах'; + $lang->cmd_declared_list = 'Мэдээлсэн жагсаалт'; + $lang->cmd_copy = 'Хуулах'; + $lang->cmd_move = 'Шилжих'; + $lang->cmd_move_up = 'Дээш'; + $lang->cmd_move_down = 'Доош'; + $lang->cmd_add_indent = 'Нэмж оруулах'; + $lang->cmd_remove_indent = 'Хасах'; + $lang->cmd_management = 'Удирдах'; + $lang->cmd_make = 'Харуулах'; + $lang->cmd_select = 'Сонгох'; + $lang->cmd_select_all = 'Бүгдийг сонгох'; + $lang->cmd_unselect_all = 'Сонголтыг болих'; + $lang->cmd_reverse_all = "Дахин сонгох"; + $lang->cmd_close_all = 'Бүгдийг хаах'; + $lang->cmd_open_all = 'Бүгдийг нээх'; + $lang->cmd_reload = 'Дахин унших'; + $lang->cmd_close = 'Хаах'; + $lang->cmd_open = 'Нээх'; + $lang->cmd_setup = 'Тохируулга'; + $lang->cmd_addition_setup = 'Нэмэлт тохируулга'; + $lang->cmd_option = 'Опшион'; + $lang->cmd_apply = 'Хэрэгжүүлэх'; + $lang->cmd_open_calendar = 'Календар сонгох'; + $lang->cmd_send = 'Илгээх'; + $lang->cmd_print = 'Хэвлэх'; + $lang->cmd_scrap = 'Скрап'; + $lang->cmd_preview = 'Урьдчилан харах'; + $lang->cmd_reset = 'Дахин тохируулах'; + $lang->cmd_remake_cache = "cache файл дахин хийх"; + $lang->cmd_publish = "Олгох"; + $lang->cmd_layout_setup = 'Лэйаут тохируулах'; + $lang->cmd_layout_edit = 'Лэйаут өөрчлөх'; + $lang->cmd_search_by_ipaddress = 'IP хаягаар хайх'; + $lang->cmd_add_ip_to_spamfilter = 'Спэм филтерт IPнэмэх'; + + $lang->enable = 'Боломжтой'; + $lang->disable = 'Боломжгүй'; + + // 기본 단어 + $lang->menu = 'Menu'; + $lang->no = 'Дугаар'; + $lang->notice = 'Зарлал'; + $lang->secret = 'Нууц'; + $lang->category = $lang->category_srl = 'Категори'; + $lang->none_category = 'Категори байхгүй'; + $lang->none_image = 'No image'; + $lang->document_srl = 'Баримтын дугаар'; + $lang->user_id = 'ID'; + $lang->author = 'Бичсэн'; + $lang->password = 'Нууц дугаар'; + $lang->password1 = 'Нууц дугаар'; + $lang->password2 = 'Нууц дугаар шалгах'; + $lang->admin_id = 'Хариуцагч ID'; + // $lang->writer = 'Бичлэг оруулагч'; + $lang->writer = 'Нэр'; + $lang->user_name = 'Нэр'; + $lang->nick_name = 'Ник'; + $lang->email_address = 'Мэйл хаяг'; + $lang->homepage = 'Вебхуудас'; + $lang->blog = 'Блог'; + $lang->birthday = 'Төрсөн өдөр'; + $lang->browser_title = 'Browser гарчиг'; + $lang->title = 'Гарчиг'; + $lang->title_content = 'Гарчиг+ Агуулга'; + $lang->topic = 'Сэдэв'; + $lang->replies = 'Хариулах'; + $lang->content = 'Агуулга'; + $lang->document = 'Бичлэг'; + $lang->comment = 'Коммент'; + $lang->description = 'Тайлбар'; + $lang->trackback = 'Холбоотой бичлэг'; + $lang->tag = 'tag'; + $lang->allow_comment = 'Коммент зөвшөөрнө'; + $lang->lock_comment = 'Коммент түгжих'; + $lang->allow_trackback = 'Холбоотой бичлэг зөвшөөрнө'; + $lang->uploaded_file = 'Файл оруулах'; + $lang->grant = 'Эрх'; + $lang->target = 'Зорилго'; + $lang->total = 'Нийт'; + $lang->total_count = 'Нийт тоо'; + $lang->ipaddress = 'IP хаяг'; + $lang->path = 'Байрлал'; + $lang->cart = 'Сонгосон төрөл'; + $lang->friend = 'Найз'; + $lang->notify = 'Мэдээлэх'; + $lang->order_target = 'Цэгцлэх зорилго'; + $lang->order_type = 'Цэгцлэх арга'; + $lang->order_asc = 'Багаас ихрүү'; + $lang->order_desc = 'Ихээс бага руу'; + $lang->file = 'file'; + + + $lang->mid = 'Модиул нэр'; + $lang->sid = 'Тvр сайтын нэр'; + $lang->layout = 'Лэйаут'; + $lang->widget = 'Вижет '; + $lang->module = 'Модиул'; + $lang->skin = 'Скин'; + $lang->colorset = 'Өнгө тохируулах'; + $lang->extra_vars = 'Өргөжүүлэх тоо'; + $lang->domain = 'Domain'; + $lang->url = 'URL'; + $lang->document_url = 'Бичлэгийн хаяг'; + $lang->trackback_url = 'Холбоотой бичлэгний хаяг'; + $lang->blog_name = 'Блог нэр'; + $lang->excerpt = 'excerpt'; + + $lang->document_count = 'Бичлэгийн тоо'; + $lang->page_count = 'Хуудасны тоо'; + $lang->list_count = 'Жагсаалтын тоо'; + $lang->search_list_count = 'Хайлтын жагсаалт'; + $lang->readed_count = 'Уншсан'; + $lang->voted_count = 'vote'; + $lang->comment_count = 'Комментын тоо'; + $lang->member_count = 'Гишүүдийн тоо'; + $lang->date = 'Date'; + $lang->regdate = 'Оруулсан өдөр'; + $lang->last_update = 'Сүүлд засварласан өдөр'; + $lang->last_post = 'Хамгийн сүүлд оруулсан'; + $lang->signup_date = 'Бүртгүүлсэн өдөр'; + $lang->last_login = 'Хамгийн сүүлд нэвтэрсэн'; + $lang->first_page = 'Эхний хуудас'; + $lang->last_page = 'Сүүлчийн хуудас'; + $lang->search_target = 'Хайх зорилго'; + $lang->search_keyword = 'Хайх үг'; + $lang->is_default = 'Үндсэн'; + + $lang->no_documents = 'Оруулсан бичлэг байхгүй'; + + $lang->board_manager = 'Board удирдах'; + $lang->member_manager = 'Гишүүн удирдах'; + $lang->layout_manager = 'Лэйаут удирдах'; + + $lang->use = 'Хэрэглэх'; + $lang->notuse = 'Хэрэглэхгүй'; + $lang->not_exists = 'Байхгүй'; + + $lang->public = 'Нийтийн'; + $lang->private = 'Нууцлах'; + + $lang->unit_sec = 'Секунд'; + $lang->unit_min = 'Минут'; + $lang->unit_hour = 'Цаг'; + $lang->unit_day = 'Өдөр'; + $lang->unit_week = 'Долоо хоног'; + $lang->unit_month = 'Сар'; + $lang->unit_year = 'Жил'; + + $lang->unit_week = array( + 'Monday' => 'Да', + 'Tuesday' => 'Мя', + 'Wednesday' => 'Лха', + 'Thursday' => 'Пv', + 'Friday' => 'Ба', + 'Saturday' => 'Бя', + 'Sunday' => 'Ня', + + ); + + $lang->unit_meridiem = array( + 'am' => 'eглee', + 'pm' => 'орой', + 'AM' => 'eглee', + 'PM' => 'орой', + ); + + + $lang->time_gap = array( + 'min' => '%d минутын eмнe', + 'mins' => '%d минутын eмнe', + 'hour' => '%d цагийн eмнe', + 'hours' => '%d цагийн eмнe', + ); + + // 설명 관련 + $lang->about_tag = 'tag оруулахдаа таслал ашиглавал давтан оруулж болно'; + $lang->about_layout = 'Лэйаут нь модиулын гадаад байдлыг чимж өгнө. Дээрх лэйаут менюнээс удирдаж болно'; + + // 메세지 관련 + $lang->msg_call_server = 'Сервер ачаалж байна. Түр хүлээнэ үү.'; + $lang->msg_db_not_setted = 'DB тохируулга хийгдээгүй байна.'; + $lang->msg_invalid_queryid = 'Query ID буруу бичигдсэн байна.'; + $lang->msg_not_permitted = 'Эрх байхгүй байна'; + $lang->msg_input_password = 'Нууц дугаараа оруулна уу'; + $lang->msg_invalid_document = 'Бичлэгийн дугаар буруу байна'; + $lang->msg_invalid_request = 'Буруу шаардлага байна'; + $lang->msg_invalid_password = 'Нууц дугаар буруу байна'; + $lang->msg_error_occured = 'Алдаа гарлаа'; + $lang->msg_not_founded = 'Зорилгыг олж чадсангүйү'; + $lang->msg_no_result = 'Хайлтын үр дүн байхгүй байна'; + $lang->msg_fail_to_request_open = 'Холболт амжилтгvй боллоо.'; + $lang->msg_invalid_format = 'Буруу хэлбэр байна.'; + + $lang->msg_not_permitted_act = 'Хүсэлт гаргасан үйлдлийг хэрэгжүүлэх эрх байхгүй.'; + $lang->msg_module_is_not_exists = 'Хүссэн модиулыг олж чадсангүй'; + $lang->msg_module_is_not_standalone = 'Хүсэлт гаргасан модиул нь бие даан хэрэгжих боломжгүй'; + + $lang->success_registed = 'Бүртгэгдсэн'; + $lang->success_declared = 'Мэдээлэгдсэн'; + $lang->success_updated = 'Засварлагдсан'; + $lang->success_deleted = 'Устгагдсан'; + $lang->success_voted = 'Санал болгогдсон'; + $lang->success_blamed = 'Санал болгогдоогүй'; + $lang->success_moved = 'Шилжсэн'; + $lang->success_sended = 'Илгээгдсэн'; + $lang->success_reset = 'Reset'; + $lang->success_leaved = 'Гишүүнээс гарсан'; + $lang->success_saved = 'Хадгалагдсан'; + + $lang->fail_to_delete = 'Устгалт амжилтгүй боллоо'; + $lang->fail_to_move = 'Шилжилт амжилтгүй боллоо'; + + $lang->failed_voted = 'Санал болгох боломжгүй'; + $lang->failed_blamed = 'Санал болгохгүй байх боломжгүй'; + $lang->failed_declared = 'Мэдээлэх боломжгүй'; + $lang->fail_to_delete_have_children = 'Хариулт бичлэг байгаа тул устгах боломжгүй'; + + $lang->confirm_submit = 'Оруулах уу?'; + $lang->confirm_logout = 'Гарах уу?'; + $lang->confirm_vote = 'Санал болгох уу?'; + $lang->confirm_delete = 'Устгах уу?'; + $lang->confirm_move = 'Шилжих үү?'; + $lang->confirm_reset = 'Reset хийх үү?'; + $lang->confirm_leave = 'Гишүүнээс гарах уу?'; + + $lang->column_type = 'Хэлбэр'; + $lang->column_type_list['text'] = 'Нэг мөрөөр оруулах (text)'; + $lang->column_type_list['homepage'] = 'Веб хуудас хэлбэр (url)'; + $lang->column_type_list['email_address'] = 'Мэйл хэлбэр (email)'; + $lang->column_type_list['tel'] = 'Утасны дугаар хэлбэр (phone)'; + $lang->column_type_list['textarea'] = 'Олон мөрөөр оруулах (textarea)'; + $lang->column_type_list['checkbox'] = 'Олон сонголт хийх (checkbox)'; + $lang->column_type_list['select'] = 'Ганц сонголт хийх (select)'; + $lang->column_type_list['radio'] = 'Нэг eдeр сонгох(radio)'; + $lang->column_type_list['kr_zip'] = 'Солонгос хаяг (zip)'; + $lang->column_type_list['date'] = 'Онсар (Жил сар өдөр)'; + //$lang->column_type_list['jp_zip'] = '일본주소 (zip)'; + + $lang->column_name = 'Баганын нэр'; + $lang->column_title = 'Баганын гарчиг'; + $lang->default_value = 'Үндсэн байдал'; + $lang->is_active = 'Идэвхжүүлэх'; + $lang->is_required = 'Заавал бөглөх'; + $lang->eid = 'eгeдлийн нэр'; + + // ftp 관련 + $lang->ftp_form_title = 'FTP мэдээлэл оруулах'; + $lang->ftp = 'FTP'; + $lang->ftp_port = 'FTP port'; + $lang->cmd_check_ftp_connect = 'FTP холболт шалгах'; + $lang->about_ftp_info = " + FTP мэдээлэл нь дараах тохиолдолд хэрэглэгдэх боломжтой.
+ 1. PHP의 safe_mode=Onбайх тохиолдолд , FTP мэдээллийг ашиглан XE-г бvрэн ажиллуулахаар болгож болно.
+ 2. Автомат опдэйт хийх зэрэгт FTP мэдээллийг ашиглаж болно.
+ Тус FTP мэпээлэл нь files/config/ftp.config.php файл дотор хадгалагдна.
+ Идэвхжvvлсэний дараа хариуцагчийн хуудаснаас FTP мэдээллийг eeрчлeх болон устгаж болно.
+ "; + $lang->msg_safe_mode_ftp_needed = 'PHP의 safe_mode가 Onбайх тохиолдолд , FTP мэдээллийг заавал оруулснаар XE идэвжvvлэх болон хэрэглэх боломжтой болно.'; + $lang->msg_ftp_not_connected = 'localhost-ын FTP холболт амжилтгvй боллоо. FTP дугаараа шалгах буюу эсвэл FTP vйлчилгээг ашиглах боломжтой эсэхээ шалгана уу.'; + $lang->msg_ftp_invalid_auth_info = 'Таны оруулсан FTP мэдээллээр нэвтэрч чадсангvй. FTPмэдээллээ шалгана уу.'; + $lang->msg_ftp_mkdir_fail = 'FTP-г ашиглан eгсeн eгeгдлийг биелvvлж чадсангvй. FTP серверийн идэвхжvvлэлтээ шалгана уу.'; + $lang->msg_ftp_chmod_fail = 'FTP-г ашиглан eeрчлeлтийг хийж чадсангvй. FTP серверийн идэвхжvvлэлтээ шалгана уу.'; + $lang->msg_ftp_connect_success = 'FTP холболт болон баталгаажуулалт хийгдлээ.'; + + + // xml filter에서 사용되는 javascript용 alert msg + $lang->filter->isnull = '%s-ийг оруулна уу'; + $lang->filter->outofrange = '%s-ийн үсгийн тоог тааруулна уу.'; + $lang->filter->equalto = '%s-ыг буруу оруулсан байна.'; + $lang->filter->invalid_email = '%s-ын хэлбэрийг буруу оруулсан байна. (Жнь: zbxe@zeroboard.com)'; + $lang->filter->invalid_user_id = $lang->filter->invalid_userid = "%s-ын хэлбэр буруу байна. .\\n Латин vсэг, тоо болон '_'-р оруулж болох бeгeeд эхлэл нь vсэг байх шаардлагатай. "; + $lang->filter->invalid_homepage = '%s-ын хэлбэр буруу байна.. (Жнь: http://www.zeroboard.com)'; + $lang->filter->invalid_korean = '%s-ын хэлбэр буруу байна. Солонгосоор оруулах ёстой'; + $lang->filter->invalid_korean_number = '%s-ын хэлбэр буруу байна. Солонгос үсэг болон тоогоор оруулах хэрэгтэй.'; + $lang->filter->invalid_alpha = '%s-ын хэлбэр буруу байна. Зөвхөн латин үсгээр оруулах ёстой'; + $lang->filter->invalid_alpha_number = '%s-ын хэлбэр буруу байна. Зөвхөн латин үсэг болон тоогоор л оруулах ёстой.'; + $lang->filter->invalid_number = '%s-ын хэлбэр буруу байна. Зөвхөн тоогоор оруулах ёстой.'; +?> \ No newline at end of file From 75a45b4bb87ee1508675608e92a67c1734ef7bc5 Mon Sep 17 00:00:00 2001 From: ngleader Date: Tue, 17 Nov 2009 02:09:58 +0000 Subject: [PATCH 14/51] =?UTF-8?q?require=5Fonce()=EB=A5=BC=20=EC=83=81?= =?UTF-8?q?=ED=99=A9=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EC=86=8D=EB=8F=84?= =?UTF-8?q?=EA=B0=80=20=EB=B9=A0=EB=A5=B8=20require()=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6950 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- config/config.inc.php | 34 +++++++++++++++++----------------- index.php | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/config/config.inc.php b/config/config.inc.php index ee8e6d42b..7213792d1 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -110,7 +110,7 @@ /** * @brief 간단하게 사용하기 위한 함수 정의한 파일 require **/ - require_once(_XE_PATH_.'config/func.inc.php'); + require(_XE_PATH_.'config/func.inc.php'); if(__DEBUG__) define('__StartTime__', getMicroTime()); @@ -120,21 +120,21 @@ * @TODO : PHP5 기반으로 바꾸게 되면 _autoload()를 이용할 수 있기에 제거 대상 **/ if(__DEBUG__) define('__ClassLoadStartTime__', getMicroTime()); - require_once(_XE_PATH_.'classes/object/Object.class.php'); - require_once(_XE_PATH_.'classes/extravar/Extravar.class.php'); - require_once(_XE_PATH_.'classes/handler/Handler.class.php'); - require_once(_XE_PATH_.'classes/xml/XmlParser.class.php'); - require_once(_XE_PATH_.'classes/xml/XmlJsFilter.class.php'); - require_once(_XE_PATH_.'classes/context/Context.class.php'); - require_once(_XE_PATH_.'classes/db/DB.class.php'); - require_once(_XE_PATH_.'classes/file/FileHandler.class.php'); - require_once(_XE_PATH_.'classes/widget/WidgetHandler.class.php'); - require_once(_XE_PATH_.'classes/editor/EditorHandler.class.php'); - require_once(_XE_PATH_.'classes/module/ModuleObject.class.php'); - require_once(_XE_PATH_.'classes/module/ModuleHandler.class.php'); - require_once(_XE_PATH_.'classes/display/DisplayHandler.class.php'); - require_once(_XE_PATH_.'classes/template/TemplateHandler.class.php'); - require_once(_XE_PATH_.'classes/mail/Mail.class.php'); - require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); + require(_XE_PATH_.'classes/object/Object.class.php'); + require(_XE_PATH_.'classes/extravar/Extravar.class.php'); + require(_XE_PATH_.'classes/handler/Handler.class.php'); + require(_XE_PATH_.'classes/xml/XmlParser.class.php'); + require(_XE_PATH_.'classes/xml/XmlJsFilter.class.php'); + require(_XE_PATH_.'classes/context/Context.class.php'); + require(_XE_PATH_.'classes/db/DB.class.php'); + require(_XE_PATH_.'classes/file/FileHandler.class.php'); + require(_XE_PATH_.'classes/widget/WidgetHandler.class.php'); + require(_XE_PATH_.'classes/editor/EditorHandler.class.php'); + require(_XE_PATH_.'classes/module/ModuleObject.class.php'); + require(_XE_PATH_.'classes/module/ModuleHandler.class.php'); + require(_XE_PATH_.'classes/display/DisplayHandler.class.php'); + require(_XE_PATH_.'classes/template/TemplateHandler.class.php'); + require(_XE_PATH_.'classes/mail/Mail.class.php'); + require(_XE_PATH_.'classes/page/PageHandler.class.php'); if(__DEBUG__) $GLOBALS['__elapsed_class_load__'] = getMicroTime() - __ClassLoadStartTime__; ?> diff --git a/index.php b/index.php index 628d528b4..c7be61a82 100644 --- a/index.php +++ b/index.php @@ -36,7 +36,7 @@ /** * @brief 필요한 설정 파일들을 include **/ - require_once('./config/config.inc.php'); + require('./config/config.inc.php'); /** * @brief Context 객체를 생성하여 초기화 From f342884b246dfa5562dec783eb19a3be7d9f4597 Mon Sep 17 00:00:00 2001 From: haneul Date: Tue, 17 Nov 2009 09:15:35 +0000 Subject: [PATCH 15/51] #18405063 : fixed a bug that updating member removes information from all virtual sites git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6951 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.controller.php | 1 + modules/member/queries/deleteMemberGroupMember.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index 08a928dc2..c3e70b62b 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -1692,6 +1692,7 @@ // 그룹 정보가 있으면 그룹 정보를 변경 if($args->group_srl_list) { $group_srl_list = explode('|@|', $args->group_srl_list); + $args->site_srl = 0; // 일단 해당 회원의 모든 그룹 정보를 삭제 $output = executeQuery('member.deleteMemberGroupMember', $args); diff --git a/modules/member/queries/deleteMemberGroupMember.xml b/modules/member/queries/deleteMemberGroupMember.xml index f238e0148..391093d3f 100644 --- a/modules/member/queries/deleteMemberGroupMember.xml +++ b/modules/member/queries/deleteMemberGroupMember.xml @@ -5,5 +5,6 @@ + From 4a52404bb71c7761f41d975825bd0da1d7d18742 Mon Sep 17 00:00:00 2001 From: ysnglee2000 Date: Tue, 17 Nov 2009 13:31:46 +0000 Subject: [PATCH 16/51] =?UTF-8?q?#18441793:=20DBCubrid=20Class=EC=97=90?= =?UTF-8?q?=EC=84=9C=20SELECT=20=EC=BF=BC=EB=A6=AC=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=8B=9C=20=EC=BB=AC=EB=9F=BC=EB=AA=85=EC=9D=84=20=ED=81=B0?= =?UTF-8?q?=EB=94=B0=EC=9D=8C=ED=91=9C=EB=A1=9C=20=EB=AC=B6=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95=ED=95=A8.(=EC=9D=BC=EB=B6=80=20?= =?UTF-8?q?=EC=98=88=EC=95=BD=EC=96=B4=EC=99=80=20=EC=B6=A9=EB=8F=8C?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B2=83=EC=9D=84=20=EB=B0=A9=EC=A7=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6952 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DBCubrid.class.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/classes/db/DBCubrid.class.php b/classes/db/DBCubrid.class.php index 803f7195c..41eb81beb 100644 --- a/classes/db/DBCubrid.class.php +++ b/classes/db/DBCubrid.class.php @@ -584,28 +584,28 @@ foreach($output->columns as $key => $val) { $name = $val['name']; - $click_count = '%s'; - if($val['click_count'] && count($output->conditions)>0){ - $click_count = 'incr(%s)'; - } + $click_count = '%s'; + if($val['click_count'] && count($output->conditions)>0) { + $click_count = 'incr(%s)'; + } $alias = $val['alias'] ? sprintf('"%s"',$val['alias']) : null; if(substr($name,-1) == '*') { $column_list[] = $name; } elseif(strpos($name,'.')===false && strpos($name,'(')===false) { - $name = sprintf($click_count,$name); - if($alias) $column_list[] = sprintf('%s as %s', $name, $alias); - else $column_list[] = sprintf('%s',$name); + $name = sprintf($click_count,$name); + if($alias) $column_list[] = sprintf('"%s" as %s', $name, $alias); + else $column_list[] = sprintf('"%s"',$name); } else { if(strpos($name,'.')!=false) { list($prefix, $name) = explode('.',$name); $prefix = sprintf('"%s"',$prefix); $name = ($name == '*') ? $name : sprintf('"%s"',$name); - $column_list[] = sprintf($click_count,sprintf('%s.%s', $prefix, $name)) . ($alias ? sprintf(' as %s',$alias) : ''); + $column_list[] = sprintf($click_count,sprintf('%s.%s', $prefix, $name)) . ($alias ? sprintf(' as %s',$alias) : ''); } else { - $column_list[] = sprintf($click_count,$name) . ($alias ? sprintf(' as %s',$alias) : ''); + $column_list[] = sprintf($click_count,$name) . ($alias ? sprintf(' as %s',$alias) : ''); } } } From 6ab07bbaa529dc29a9ad07b46af9ea2d5648c158 Mon Sep 17 00:00:00 2001 From: ngleader Date: Thu, 19 Nov 2009 04:39:27 +0000 Subject: [PATCH 17/51] fix MySQLi class git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6953 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DBMysqli.class.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/classes/db/DBMysqli.class.php b/classes/db/DBMysqli.class.php index 826ddd103..ba2b5613f 100644 --- a/classes/db/DBMysqli.class.php +++ b/classes/db/DBMysqli.class.php @@ -73,7 +73,7 @@ // db 정보가 없으면 무시 if(!$this->hostname || !$this->userid || !$this->password || !$this->database) return; - // 접속시도 + // 접속시도 if($this->port){ $this->fd = mysqli_connect($this->hostname, $this->userid, $this->password, $this->database, $this->port); }else{ @@ -421,22 +421,20 @@ $table_list[] = '`'.$this->prefix.$val.'`'; } - // 컬럼 정리 + // 컬럼 정리 foreach($output->columns as $key => $val) { $name = $val['name']; $value = $val['value']; - $value_list = array(); if($output->column_type[$name]!='number') { $value = "'".$this->addQuotes($value)."'"; if(!$value) $value = 'null'; } elseif(!$value || is_numeric($value)) $value = (int)$value; - $column_list[] = '`'.$name.'`'; $value_list[] = $value; } - $query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $value_list)); + $query = sprintf("insert into %s (%s) values (%s)", implode(',',$table_list), implode(',',$column_list), implode(',', $value_list)); return $this->_query($query); } @@ -450,7 +448,7 @@ $table_list[] = '`'.$this->prefix.$val.'` as '.$key; } - // 컬럼 정리 + // 컬럼 정리 foreach($output->columns as $key => $val) { if(!isset($val['value'])) continue; $name = $val['name']; From a5a1f44a18f9349aa53b51e716b9880c9b5b07cb Mon Sep 17 00:00:00 2001 From: royallin Date: Fri, 20 Nov 2009 10:09:43 +0000 Subject: [PATCH 18/51] Modify CHT language git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6954 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/lang/zh-TW.lang.php | 3 ++- modules/autoinstall/lang/zh-TW.lang.php | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/admin/lang/zh-TW.lang.php b/modules/admin/lang/zh-TW.lang.php index d99342c6e..05edaceff 100644 --- a/modules/admin/lang/zh-TW.lang.php +++ b/modules/admin/lang/zh-TW.lang.php @@ -35,7 +35,7 @@ $lang->current_version = "安裝版本"; $lang->current_path = "安裝路徑"; $lang->released_version = "最新版本"; - $lang->about_download_link = "官方網站已發佈新版本。\n請按[下載]下載最新版本。"; + $lang->about_download_link = "官方網站已發佈最新版本。\n請按[下載]下載最新版本。"; $lang->item_module = "模組列表"; $lang->item_addon = "元件列表"; @@ -79,4 +79,5 @@ $lang->about_server_ports = "HTTP預設埠口是『80』、HTTPS是『443』,如果想使用其他的埠口的話,請自行設定。"; $lang->use_db_session = 'DB session認證'; $lang->about_db_session = '인증시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.
웹서버의 사용율이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다
단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.'; + $lang->sftp = "使用 SFTP"; ?> diff --git a/modules/autoinstall/lang/zh-TW.lang.php b/modules/autoinstall/lang/zh-TW.lang.php index 880f9c940..f6ea19dfd 100644 --- a/modules/autoinstall/lang/zh-TW.lang.php +++ b/modules/autoinstall/lang/zh-TW.lang.php @@ -2,16 +2,16 @@ /** * @file zh-TW.lang.php * @author sol (sol@ngleader.com) 翻譯:royallin - * @brief 自動安裝(autoinstall)模組正體中文語言 + * @brief 自動安裝(autoinstall)模組正體中文語言 **/ $lang->autoinstall = '自動安裝'; $lang->about_autoinstall = '可幫助您安裝/更新XE程式及面板。'; - $lang->package_update = '最近更新日'; - $lang->package_downloaded_count = '全部下載'; + $lang->package_update = '最近更新'; + $lang->package_downloaded_count = '下載次數'; $lang->need_update = "需要更新。"; - $lang->order_newest = "最新"; + $lang->order_newest = "最新發表"; $lang->order_popular = "熱門"; $lang->order_download = "下載"; $lang->success_installed = "安裝成功"; From c5bd982447befb052d39d3a1c3e3b3e985898d4c Mon Sep 17 00:00:00 2001 From: misol Date: Sat, 21 Nov 2009 17:45:44 +0000 Subject: [PATCH 19/51] =?UTF-8?q?=ED=86=B5=ED=95=A9=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EC=97=90=20=ED=8F=AC=ED=95=A8=20=EC=97=AC=EB=B6=80=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=20=EA=B4=80=EB=A6=AC=EC=9E=90=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=EC=97=90=EC=84=9C=20=ED=8E=B8=EB=A6=AC=ED=95=98?= =?UTF-8?q?=EA=B2=8C=20=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D?= =?UTF-8?q?=20=EA=B4=80=EB=A6=AC=EC=9E=90=20=ED=8E=98=EC=9D=B4=EC=A7=80?= =?UTF-8?q?=EC=97=90=20=EB=B2=84=ED=8A=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6955 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/rss/conf/module.xml | 3 ++- modules/rss/rss.admin.controller.php | 24 ++++++++++++++++++++++++ modules/rss/tpl/js/rss.js | 17 +++++++++++++++++ modules/rss/tpl/rss_admin_index.html | 5 +++-- 4 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 modules/rss/tpl/js/rss.js diff --git a/modules/rss/conf/module.xml b/modules/rss/conf/module.xml index 8fa1bba28..5db36db82 100644 --- a/modules/rss/conf/module.xml +++ b/modules/rss/conf/module.xml @@ -1,4 +1,4 @@ - + @@ -6,6 +6,7 @@ + diff --git a/modules/rss/rss.admin.controller.php b/modules/rss/rss.admin.controller.php index 364710c06..5645656d9 100644 --- a/modules/rss/rss.admin.controller.php +++ b/modules/rss/rss.admin.controller.php @@ -114,6 +114,30 @@ } + /** + * @brief Feed 전체 포함/미포함 체인지 + **/ + function procRssAdminToggleActivate() { + $oRssModel = &getModel('rss'); + + // mid값을 받아옴 + $module_srl = Context::get('module_srl'); + if($module_srl) { + $config = $oRssModel->getRssModuleConfig($module_srl); + if($config->open_total_feed == 'T_N') { + $this->setRssModuleConfig($module_srl, $config->open_rss, 'T_Y', $config->feed_description, $config->feed_copyright); + $this->add("open_total_feed", 'T_Y'); + } + else { + $this->setRssModuleConfig($module_srl, $config->open_rss, 'T_N', $config->feed_description, $config->feed_copyright); + $this->add("open_total_feed", 'T_N'); + } + } + + $this->add("module_srl", $module_srl); + } + + /** * @brief RSS모듈의 전체 Feed 설정용 함수 **/ diff --git a/modules/rss/tpl/js/rss.js b/modules/rss/tpl/js/rss.js new file mode 100644 index 000000000..10f2b3e50 --- /dev/null +++ b/modules/rss/tpl/js/rss.js @@ -0,0 +1,17 @@ + +function doToggleRss(module_srl) { + var params = new Array(); + params['module_srl'] = module_srl; + + var response_tags = new Array('error','message','module_srl','open_total_feed'); + exec_xml('rss','procRssAdminToggleActivate',params, doChangeIcon ,response_tags ); +} + +function doChangeIcon(ret_obj, response_tags) { + var obj = document.getElementById('dotogglerss_'+ret_obj['module_srl']); + if(ret_obj['open_total_feed'] == 'T_N') { + obj.className = "buttonSet buttonDisable"; + } else { + obj.className = "buttonSet buttonActive"; + } +} \ No newline at end of file diff --git a/modules/rss/tpl/rss_admin_index.html b/modules/rss/tpl/rss_admin_index.html index 326469b49..9d079efa9 100644 --- a/modules/rss/tpl/rss_admin_index.html +++ b/modules/rss/tpl/rss_admin_index.html @@ -1,3 +1,4 @@ +

{$lang->total_feed} {$lang->cmd_management}

@@ -69,11 +70,11 @@
- + - + From 624e734eeaeddc52226a120b0f18447dd4d6ddc8 Mon Sep 17 00:00:00 2001 From: misol Date: Sat, 21 Nov 2009 18:39:54 +0000 Subject: [PATCH 20/51] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=97=90=EC=84=9C=20RSS=20=EB=B0=94=EB=A1=9C?= =?UTF-8?q?=20=ED=99=95=EC=9D=B8=20=ED=95=A0=20=EC=88=98=20=EC=9E=88?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6956 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/rss/rss.admin.view.php | 5 +++++ modules/rss/rss.controller.php | 18 ++---------------- modules/rss/rss.model.php | 19 +++++++++++++++++++ modules/rss/tpl/rss_admin_index.html | 2 +- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/modules/rss/rss.admin.view.php b/modules/rss/rss.admin.view.php index 4f4c68985..ab519bc08 100644 --- a/modules/rss/rss.admin.view.php +++ b/modules/rss/rss.admin.view.php @@ -22,11 +22,16 @@ $oModuleModel = &getModel('module'); $rss_config = $oModuleModel->getModulePartConfigs('rss'); $total_config = $oModuleModel->getModuleConfig('rss'); + $oRssModel = &getModel('rss'); if($rss_config) { foreach($rss_config as $module_srl => $config) { if($config) { $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + $site = $oModuleModel->getSiteInfo($module_info->site_srl); + if(!strpos($site->domain, '.')) $vid = $site->domain; + else $site = null; + if($site) $feed_config[$module_srl]['url'] = $oRssModel->getModuleFeedUrl($vid, $module_info->mid, 'rss'); $feed_config[$module_srl]['mid'] = $module_info->mid; $feed_config[$module_srl]['open_feed'] = $config->open_rss; $feed_config[$module_srl]['open_total_feed'] = $config->open_total_feed; diff --git a/modules/rss/rss.controller.php b/modules/rss/rss.controller.php index 4677a02a4..11d857683 100644 --- a/modules/rss/rss.controller.php +++ b/modules/rss/rss.controller.php @@ -37,22 +37,8 @@ $rss_config = $oRssModel->getRssModuleConfig($current_module_srl); if($rss_config->open_rss != 'N') { - if(Context::isAllowRewrite()) { - $request_uri = Context::getRequestUri(); - // 가상 사이트 변수가 있고 이 변수가 mid와 다를때. (vid와 mid는 같을 수 없다고 함) - if(Context::get('vid') && Context::get('vid') != Context::get('mid')) { - Context::set('rss_url', Context::getRequestUri().Context::get('vid').'/'.Context::get('mid').'/rss'); - Context::set('atom_url', Context::getRequestUri().Context::get('vid').'/'.Context::get('mid').'/atom'); - } - else { - Context::set('rss_url', $request_uri.Context::get('mid').'/rss'); - Context::set('atom_url', $request_uri.Context::get('mid').'/atom'); - } - } - else { - Context::set('rss_url', getUrl('','mid',Context::get('mid'),'act','rss')); - Context::set('atom_url', getUrl('','mid',Context::get('mid'),'act','atom')); - } + Context::set('rss_url', $oRssModel->getModuleFeedUrl(Context::get('vid'), Context::get('mid'), 'rss')); + Context::set('atom_url', $oRssModel->getModuleFeedUrl(Context::get('vid'), Context::get('mid'), 'atom')); } if(Context::isInstalled() && $site_module_info->mid == Context::get('mid') && $total_config->use_total_feed != 'N') { diff --git a/modules/rss/rss.model.php b/modules/rss/rss.model.php index b89e4e323..ed19a57ac 100644 --- a/modules/rss/rss.model.php +++ b/modules/rss/rss.model.php @@ -9,6 +9,25 @@ **/ class rssModel extends rss { + /** + * @brief Feed url 생성. + **/ + function getModuleFeedUrl($vid = null, $mid, $format) { + if(Context::isAllowRewrite()) { + $request_uri = Context::getRequestUri(); + // 가상 사이트 변수가 있고 이 변수가 mid와 다를때. (vid와 mid는 같을 수 없다고 함) + if($vid && $vid != $mid) { + return $request_uri.$vid.'/'.$mid.'/'.$format; + } + else { + return $request_uri.$mid.'/'.$format; + } + } + else { + return getUrl('','mid',$mid,'act',$format); + } + } + /** * @brief 특정 모듈의 rss 설정을 return diff --git a/modules/rss/tpl/rss_admin_index.html b/modules/rss/tpl/rss_admin_index.html index 9d079efa9..1fb4922e6 100644 --- a/modules/rss/tpl/rss_admin_index.html +++ b/modules/rss/tpl/rss_admin_index.html @@ -72,7 +72,7 @@ - + From 0bd0cc39668dae35abb9486637315e282f21f35e Mon Sep 17 00:00:00 2001 From: misol Date: Sun, 22 Nov 2009 11:12:42 +0000 Subject: [PATCH 21/51] =?UTF-8?q?rss.admin.view.php=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=20=EC=9D=B8=EC=BD=94=EB=94=A9=20euc-kr=EC=97=90=EC=84=9C=20UTF?= =?UTF-8?q?-8=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6957 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/rss/rss.admin.view.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/rss/rss.admin.view.php b/modules/rss/rss.admin.view.php index ab519bc08..fe73928eb 100644 --- a/modules/rss/rss.admin.view.php +++ b/modules/rss/rss.admin.view.php @@ -1,22 +1,22 @@ setTemplatePath($this->module_path.'tpl'); } /** - * @brief ʱȭ + * @brief 관리자 페이지 초기화면 **/ function dispRssAdminIndex() { $oModuleModel = &getModel('module'); From 7ccf96fda45971e385fda1c32160374a22e9a5b0 Mon Sep 17 00:00:00 2001 From: haneul Date: Mon, 23 Nov 2009 06:38:45 +0000 Subject: [PATCH 22/51] #18454344 : modify link to parent directory git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6958 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/config.html | 2 +- modules/admin/tpl/js/config.js | 23 ++++++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/modules/admin/tpl/config.html b/modules/admin/tpl/config.html index 9898ac867..5aaa6c305 100644 --- a/modules/admin/tpl/config.html +++ b/modules/admin/tpl/config.html @@ -174,7 +174,7 @@ diff --git a/modules/admin/tpl/js/config.js b/modules/admin/tpl/js/config.js index 739e59042..d0cd2ef1a 100644 --- a/modules/admin/tpl/js/config.js +++ b/modules/admin/tpl/js/config.js @@ -6,7 +6,28 @@ function completeGetFtpInfo(ret_obj) for(var i=0;i"+v+""; + if(v == "../") + { + if(pwd == "/") + { + continue; + } + + arr = pwd.split("/"); + arr.pop(); + arr.pop(); + arr.push(""); + target = arr.join("/"); + list = list + "
  • "+v+"
  • "; + } + else if( v == "./") + { + continue; + } + else + { + list = list + "
  • "+v+"
  • "; + } } list = "
    "; e.append(jQuery(list)); From 3a9f49d642449a8e32fb4d56b7332288778eb219 Mon Sep 17 00:00:00 2001 From: haneul Date: Mon, 23 Nov 2009 07:07:00 +0000 Subject: [PATCH 23/51] #18442364 : fixed a bug that paging in administration page of attachment causes removing module_srl git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6959 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/file/tpl/file_list.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/file/tpl/file_list.html b/modules/file/tpl/file_list.html index e943e4834..2a6eb1d18 100644 --- a/modules/file/tpl/file_list.html +++ b/modules/file/tpl/file_list.html @@ -119,14 +119,14 @@ From b53dded298caf0431e03c6d6bf9c041e8fa50743 Mon Sep 17 00:00:00 2001 From: haneul Date: Mon, 23 Nov 2009 08:16:40 +0000 Subject: [PATCH 24/51] #18326751 : fixed a bug that file name in unicode is missing with some environments git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6960 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/file/FileHandler.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/classes/file/FileHandler.class.php b/classes/file/FileHandler.class.php index c8a94369f..e292cf59d 100644 --- a/classes/file/FileHandler.class.php +++ b/classes/file/FileHandler.class.php @@ -62,6 +62,7 @@ * @return none **/ function copyFile($source, $target, $force='Y'){ + setlocale(LC_CTYPE, 'en_US.UTF8', 'ko_KR.UTF8'); $source = FileHandler::getRealPath($source); $target_dir = FileHandler::getRealPath(dirname($target)); $target = basename($target); From be661b7b530f89a14abff4093ddb36e4f4b1a362 Mon Sep 17 00:00:00 2001 From: haneul Date: Mon, 23 Nov 2009 11:41:36 +0000 Subject: [PATCH 25/51] #18360355 git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6961 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- addons/smartphone/classes/smartphone.class.php | 7 ++++++- addons/smartphone/smartphone.addon.php | 11 ++++++++++- addons/smartphone/tpl/layout.html | 5 +++++ addons/smartphone/tpl/smartphone.css | 11 +++++++++++ addons/smartphone/tpl/smartphone.js | 4 ++++ 5 files changed, 36 insertions(+), 2 deletions(-) diff --git a/addons/smartphone/classes/smartphone.class.php b/addons/smartphone/classes/smartphone.class.php index 201ebb12d..c44db018a 100644 --- a/addons/smartphone/classes/smartphone.class.php +++ b/addons/smartphone/classes/smartphone.class.php @@ -11,7 +11,12 @@ var $content = null; function isFromSmartPhone() { - return Context::get('smartphone') || preg_match('/(iPod|iPhone|SCH\-M[0-9]+)/',$_SERVER['HTTP_USER_AGENT']); + if(Context::get('full_browse') || $_COOKIE["FullBrowse"]) + { + return false; + } + + return Context::get('smartphone') || preg_match('/(iPod|iPhone|SCH\-M[0-9]+)/',$_SERVER['HTTP_USER_AGENT']); } function haveSmartphoneModule($module) { diff --git a/addons/smartphone/smartphone.addon.php b/addons/smartphone/smartphone.addon.php index f4d9a3190..b95a9bb8b 100644 --- a/addons/smartphone/smartphone.addon.php +++ b/addons/smartphone/smartphone.addon.php @@ -3,7 +3,16 @@ if(Context::get('module')=='admin') return; - require_once(_XE_PATH_.'addons/smartphone/classes/smartphone.class.php'); + if($called_position == "before_module_init") + { + require(_XE_PATH_.'addons/smartphone/classes/smartphone.class.php'); + + if(Context::get('full_browse')) + { + setcookie("FullBrowse", 1); + } + } + if(!smartphoneXE::isFromSmartPhone()) return; if($called_position == 'after_module_proc' ) { diff --git a/addons/smartphone/tpl/layout.html b/addons/smartphone/tpl/layout.html index bf8cec8c0..1ef96cd81 100644 --- a/addons/smartphone/tpl/layout.html +++ b/addons/smartphone/tpl/layout.html @@ -10,6 +10,7 @@
    +
    Top @@ -18,4 +19,8 @@ Next Menu +
    +
    + Full +
    diff --git a/addons/smartphone/tpl/smartphone.css b/addons/smartphone/tpl/smartphone.css index 3a356caf8..ea9a39ccf 100644 --- a/addons/smartphone/tpl/smartphone.css +++ b/addons/smartphone/tpl/smartphone.css @@ -22,6 +22,16 @@ body { -webkit-box-sizing: border-box; } +.smartPhoneToolBar .buttons +{ + float: left; +} + +.smartPhoneToolBar .rightbuttons +{ + float: right; margin-right:5px; margin-top:5px; +} + .smartPhoneTitleBar h1 { white-space:nowrap; overflow: hidden; @@ -187,3 +197,4 @@ body { letter-spacing:0px; } + diff --git a/addons/smartphone/tpl/smartphone.js b/addons/smartphone/tpl/smartphone.js index d0b4a13ca..e27634d03 100644 --- a/addons/smartphone/tpl/smartphone.js +++ b/addons/smartphone/tpl/smartphone.js @@ -1,5 +1,9 @@ var xeSmartMenu = null; var xeSmartUpperMenu = null; +function setFullBrowse() { + location.href = current_url.setQuery('full_browse',1); +} + function showXEMenu() { if(!xeSmartMenu) { From d345d77d8575da852fdfaa19f6e6a17d8b2279c8 Mon Sep 17 00:00:00 2001 From: ngleader Date: Tue, 24 Nov 2009 05:49:05 +0000 Subject: [PATCH 26/51] =?UTF-8?q?#18446411=20fixed=20mysqli=20=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B8=EC=8A=A4=ED=86=A8=EC=8B=9C=20=EC=97=90=EB=9F=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6962 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DBMysqli.class.php | 6 ++-- config/config.inc.php | 2 +- modules/install/lang/es.lang.php | 1 + modules/install/lang/fr.lang.php | 1 + modules/install/lang/jp.lang.php | 1 + modules/install/lang/ko.lang.php | 5 +-- modules/install/lang/ru.lang.php | 1 + modules/install/lang/vi.lang.php | 1 + modules/install/lang/zh-CN.lang.php | 1 + modules/install/lang/zh-TW.lang.php | 1 + modules/install/tpl/form.mysqli.html | 51 ++++++++++++++++++++++++++++ 11 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 modules/install/tpl/form.mysqli.html diff --git a/classes/db/DBMysqli.class.php b/classes/db/DBMysqli.class.php index ba2b5613f..6145de187 100644 --- a/classes/db/DBMysqli.class.php +++ b/classes/db/DBMysqli.class.php @@ -75,13 +75,13 @@ // 접속시도 if($this->port){ - $this->fd = mysqli_connect($this->hostname, $this->userid, $this->password, $this->database, $this->port); + $this->fd = @mysqli_connect($this->hostname, $this->userid, $this->password, $this->database, $this->port); }else{ - $this->fd = mysqli_connect($this->hostname, $this->userid, $this->password, $this->database); + $this->fd = @mysqli_connect($this->hostname, $this->userid, $this->password, $this->database); } $error = mysqli_connect_errno(); if($error) { - $this->setError($error); + $this->setError($error,mysqli_connect_error()); return; } mysqli_set_charset($this->fd,'utf8'); diff --git a/config/config.inc.php b/config/config.inc.php index 7213792d1..592d4fc91 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -46,7 +46,7 @@ * 2 : 소요시간, Request/Response info 출력 * 4 : DB 쿼리 내역 출력 **/ - if(!defined('__DEBUG__')) define('__DEBUG__', 0); + if(!defined('__DEBUG__')) define('__DEBUG__', 1); /** * @brief 디버그 메세지의 출력 장소 diff --git a/modules/install/lang/es.lang.php b/modules/install/lang/es.lang.php index b6892c716..00974f082 100644 --- a/modules/install/lang/es.lang.php +++ b/modules/install/lang/es.lang.php @@ -233,6 +233,7 @@ EndOfLicense; $lang->db_desc = array( 'mysql' => 'Utilizando las funciones mysql*() de PHP usar DB mysql.
    La transacción es desabilitado ya que DB(Bases de Datos) está creado por myisam.', + 'mysqli' => 'Utilizando las funciones mysqli*() de PHP usar DB mysql.
    La transacción es desabilitado ya que DB(Bases de Datos) está creado por myisam.', 'mysql_innodb' => 'Utilizando innodb usar BD mysql.
    La transacción es hablilitado para innodb', 'sqlite2' => 'Soporta sqlite2, el cual almacena los datos en archivos
    En la instalacion, es necesario crear archivo de BD en un lugar inaccesible de la web.
    (Testeo de la estabilización no realizada)', 'sqlite3_pdo' => 'A través de PDO de PHP soporta sqlite2
    En la instalación, es necesario crear archivo de BD en un lugar inaccesible de la web.', diff --git a/modules/install/lang/fr.lang.php b/modules/install/lang/fr.lang.php index 29393dadd..86a9b6274 100644 --- a/modules/install/lang/fr.lang.php +++ b/modules/install/lang/fr.lang.php @@ -191,6 +191,7 @@ EndOfLicense; $lang->db_desc = array( 'mysql' => 'Utilisera fonction mysql*() pour utiliser la base de données de mysql.
    La transaction sera invalidé parce que le fichier de Base de Données est créé par myisam.', + 'mysqli' => 'Utilisera fonction mysqli*() pour utiliser la base de données de mysql.
    La transaction sera invalidé parce que le fichier de Base de Données est créé par myisam.', 'mysql_innodb' => 'Utilisera innodb pour utiliser Base de Données de mysql.
    La transaction sera validé pour innodb', 'sqlite2' => 'Surpporter sqlite2 qui conserve les données dans les fichiers.
    Quand vous installez, vous devez créer le fichier de Base de Données dans une place que l\'on ne peut pas accéder par web.
    (Jamais testé sur stabilization)', 'sqlite3_pdo' => 'Supporter sqlite3 PDO de PHP.
    Quand vous installez, vous devez cr?r le fichier de Base de Données dans une place que l\'on ne peut pas accéder par Web.', diff --git a/modules/install/lang/jp.lang.php b/modules/install/lang/jp.lang.php index be1b4a263..1cddbfe22 100644 --- a/modules/install/lang/jp.lang.php +++ b/modules/install/lang/jp.lang.php @@ -229,6 +229,7 @@ EndOfLicense; $lang->db_desc = array( 'mysql' => 'MySQL DBでPHPの「mysql*()」関数を利用してデータの入出力を行います。
    DBは「myisam」タイプで作成されるため、トランザクション処理は出来ません。', + 'mysqli' => 'MySQL DBでPHPの「mysqli*()」関数を利用してデータの入出力を行います。
    DBは「myisam」タイプで作成されるため、トランザクション処理は出来ません。', 'mysql_innodb' => 'MySQL DBで「innodb」タイプでデータの入出力を行います。
    「innodb」ではトランザクションの処理が行えます。', 'sqlite2' => 'ファイルタイプデータベースである「sqlite2」をサポートします。
    インストール時、セキュリティのため、DBファイルはウェブがらアクセス出来ない場所に作成して下さい。
    (安定化までのテストは行われていません)', 'sqlite3_pdo' => 'PHPのPDOを経由うして「sqlite3」をサポートします。
    インストール時、セキュリティのため、DBファイルはウェブからアクセス出来ない場所に作成して下さい。', diff --git a/modules/install/lang/ko.lang.php b/modules/install/lang/ko.lang.php index 99be1b687..298eddd46 100644 --- a/modules/install/lang/ko.lang.php +++ b/modules/install/lang/ko.lang.php @@ -228,8 +228,9 @@ EndOfLicense; $lang->cmd_ignore = '무시'; $lang->db_desc = array( - 'mysql' => 'mysql DB를 php의 mysql*()함수를 이용하여 사용합니다.
    DB 파일은 myisam으로 생성되기에 트랜잭션이 이루어지지 않습니다.', - 'mysql_innodb' => 'mysql DB를 innodb를 이용하여 사용합니다.
    innodb는 트랜잭션을 사용할 수 있습니다.', + 'mysql' => 'MySQL DB를 php의 mysql*()함수를 이용하여 사용합니다.
    DB 파일은 myisam으로 생성되기에 트랜잭션이 이루어지지 않습니다.', + 'mysqli' => 'MySQLi DB를 php의 mysql*()함수를 이용하여 사용합니다.
    DB 파일은 myisam으로 생성되기에 트랜잭션이 이루어지지 않습니다.', + 'mysql_innodb' => 'MySQL DB를 innodb를 이용하여 사용합니다.
    innodb는 트랜잭션을 사용할 수 있습니다.', 'sqlite2' => '파일로 데이터를 저장하는 sqlite2를 지원합니다.
    설치 시 DB파일은 웹에서 접근할 수 없는 곳에 생성하여 주셔야 합니다.
    (안정화 테스트가 되지 않았습니다.)', 'sqlite3_pdo' => 'PHP의 PDO로 sqlite3를 지원합니다.
    설치 시 DB파일은 웹에서 접근할 수 없는 곳에 생성하여 주셔야 합니다.', 'cubrid' => 'CUBRID DB를 이용합니다. manual', diff --git a/modules/install/lang/ru.lang.php b/modules/install/lang/ru.lang.php index d9d6bcf01..a09641189 100644 --- a/modules/install/lang/ru.lang.php +++ b/modules/install/lang/ru.lang.php @@ -321,6 +321,7 @@ EndOfLicense; $lang->db_desc = array( 'mysql' => 'Используем mysql*() функцию, чтобы использовать базу данных mysql.
    Транзакция отключена из-за того, что файл базы данных создан посредством myisam.', + 'mysqli' => 'Используем mysqli*() функцию, чтобы использовать базу данных mysql.
    Транзакция отключена из-за того, что файл базы данных создан посредством myisam.', 'mysql_innodb' => 'Используем innodb чтобы использовать базу данных mysql.
    Транзакция включена для innodb', 'sqlite2' => 'Поддерживает sqlite2, которая сохраняет данные в файл.
    Устанавливая, следует размещать файл базы данных в недоступном с веб месте.
    (Никогда не тестировалось на стабильность)', 'sqlite3_pdo' => 'Поддерживает sqlite3 посредством PHP\'s PDO.
    Устанавливая, следует размещать файл базы данных в недоступном с веб месте.', diff --git a/modules/install/lang/vi.lang.php b/modules/install/lang/vi.lang.php index abab21454..cd5330c22 100644 --- a/modules/install/lang/vi.lang.php +++ b/modules/install/lang/vi.lang.php @@ -137,6 +137,7 @@ EndOfLicense; $lang->db_desc = array( 'mysql' => 'Dùng chức năng mysql*() để sử dụng MySql Database.
    Giao dịch được vô hiệu hóa bởi File Database được tạo ra bởi myisam.', + 'mysqli' => 'Dùng chức năng mysqli*() để sử dụng MySql Database.
    Giao dịch được vô hiệu hóa bởi File Database được tạo ra bởi myisam.', 'mysql_innodb' => 'Dùng chức năng innodb để sử dụng MySql Database.
    Giao dịch được kích hoạt cho innodb', 'sqlite2' => 'Hỗ trợ sqlite2 khi lưu Database thành File.
    Khi cài đặt, File Database phải được tạo ra tại chỗ không sử dụng được từ Web.
    (Không khẳng định sẽ hoạt động ổn định)', 'sqlite3_pdo' => 'Hỗ trợ sqlite3 bởi PDO của PHP.
    Khi cài đặt, File Database phải được tạo ra tại chỗ không sử dụng được từ Web.', diff --git a/modules/install/lang/zh-CN.lang.php b/modules/install/lang/zh-CN.lang.php index 8427c0c8c..bbdbaed2b 100644 --- a/modules/install/lang/zh-CN.lang.php +++ b/modules/install/lang/zh-CN.lang.php @@ -220,6 +220,7 @@ EndOfLicense; $lang->db_desc = array( 'mysql' => '利用php的 mysql*()函数使用mysql DB。
    DB数据是以myisam生成,因此不能实现transaction。', + 'mysqli' => '利用php的 mysqli*()函数使用mysql DB。
    DB数据是以myisam生成,因此不能实现transaction。', 'mysql_innodb' => '利用innodb使用mysql DB。
    innodb可以使用transaction。', 'sqlite2' => '支持用文件形式保存数据的sqlite2。
    安装时DB文件应在web不能访问的地方生成。
    (还没有通过安全的测试)', 'sqlite3_pdo' => '用PHP的 PDO支持 sqlite3。
    安装时DB文件应在web不能访问的地方生成。', diff --git a/modules/install/lang/zh-TW.lang.php b/modules/install/lang/zh-TW.lang.php index 429d4503d..a854a9a76 100644 --- a/modules/install/lang/zh-TW.lang.php +++ b/modules/install/lang/zh-TW.lang.php @@ -221,6 +221,7 @@ EndOfLicense; $lang->db_desc = array( 'mysql' => '利用PHP的『mysql*()』函數使用MySQL資料庫。
    利用『myisam』建立資料庫檔案,因此不能實現transaction。', + 'mysqli' => '利用PHP的『mysqli*()』函數使用MySQL資料庫。
    利用『myisam』建立資料庫檔案,因此不能實現transaction。', 'mysql_innodb' => '利用『innodb』使用 mysql 資料庫。
    innodb可以使用 transaction。', 'sqlite2' => '支援用檔案形式保存數據的『sqlite2』。
    安裝時,資料庫數據應建立在 web無法訪問的地方。
    (尚未通過安全測試)', 'sqlite3_pdo' => '用 PHP的 PDO支援『sqlite3』。
    安裝時,資料庫數據應建立在網頁無法訪問的地方。', diff --git a/modules/install/tpl/form.mysqli.html b/modules/install/tpl/form.mysqli.html new file mode 100644 index 000000000..3a3c8187b --- /dev/null +++ b/modules/install/tpl/form.mysqli.html @@ -0,0 +1,51 @@ + + + + +
    + + +

    {$lang->form_title}

    + +
    {$config['mid']} {$lang->open_rss_types[$config['open_feed']]}{$lang->notuse}{$lang->use}class="buttonSet buttonDisable">{$lang->notuse}class="buttonSet buttonActive">{$lang->use}
    {$config['mid']}{$config['mid']} {$lang->open_rss_types[$config['open_feed']]} class="buttonSet buttonDisable">{$lang->notuse}class="buttonSet buttonActive">{$lang->use}
    {$lang->msg_ftp_installed_ftp_realpath}
    - +
      "+list+"
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$db_type}
    + +
    + +
    + + + + From ede3bff586c12ea76c2b02203c467ffcf7d8f0f7 Mon Sep 17 00:00:00 2001 From: haneul Date: Tue, 24 Nov 2009 06:10:02 +0000 Subject: [PATCH 27/51] #18428031 : fixed a javascript error occurred if browser_title contains special characters, git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6963 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/config.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/admin/tpl/config.html b/modules/admin/tpl/config.html index 5aaa6c305..219d5295c 100644 --- a/modules/admin/tpl/config.html +++ b/modules/admin/tpl/config.html @@ -13,7 +13,7 @@ var obj= xGetElementById('_'+id); var sObj = xGetElementById(id); sObj.value = module_srl; - obj.value = browser_title+' ('+mid+')'; + obj.value = decodeURIComponent(browser_title.replace(/\+/g," "))+' ('+mid+')'; } var pwd = '{$pwd}'; @@ -53,7 +53,7 @@
    {$lang->start_module}
    - {$lang->cmd_select} + {$lang->cmd_select} From c7e4f9b460e5522f511b52347193ba02886623d0 Mon Sep 17 00:00:00 2001 From: haneul Date: Tue, 24 Nov 2009 06:55:48 +0000 Subject: [PATCH 28/51] translation git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6964 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/autoinstall/lang/en.lang.php | 1 + modules/autoinstall/lang/ko.lang.php | 1 + modules/autoinstall/lang/vi.lang.php | 1 + modules/autoinstall/lang/zh-CN.lang.php | 1 + modules/autoinstall/lang/zh-TW.lang.php | 1 + modules/autoinstall/tpl/install.html | 4 ++-- 6 files changed, 7 insertions(+), 2 deletions(-) diff --git a/modules/autoinstall/lang/en.lang.php b/modules/autoinstall/lang/en.lang.php index c273a0d84..8398d7ae1 100644 --- a/modules/autoinstall/lang/en.lang.php +++ b/modules/autoinstall/lang/en.lang.php @@ -27,4 +27,5 @@ $lang->description_install = "Installation process also install/update programs which this program depends on"; $lang->description_download = "When FTP is disabled, you should download it and extract it into target path. (if target path is ./modules/board, extract it at ./modules)"; $lang->path = "Path"; + $lang->cmd_download = "Download"; ?> diff --git a/modules/autoinstall/lang/ko.lang.php b/modules/autoinstall/lang/ko.lang.php index 0d71fd533..31c702de1 100644 --- a/modules/autoinstall/lang/ko.lang.php +++ b/modules/autoinstall/lang/ko.lang.php @@ -27,4 +27,5 @@ $lang->description_install = "설치를 진행하면, 이 프로그램이 의존하고 있는 모든 프로그램을 업데이트/설치 합니다."; $lang->description_download = "FTP를 이용할 수 없는 경우, 직접 다운로드 하여 해당 path에 설치하셔야 합니다. (한칸 상위에서 압축을 푸시면 됩니다. ./modules/board의 경우 ./modules에서 tar를 푸세요)"; $lang->path = "설치경로"; + $lang->cmd_download = "다운로드"; ?> diff --git a/modules/autoinstall/lang/vi.lang.php b/modules/autoinstall/lang/vi.lang.php index 5e142484a..ac198851f 100644 --- a/modules/autoinstall/lang/vi.lang.php +++ b/modules/autoinstall/lang/vi.lang.php @@ -27,4 +27,5 @@ $lang->description_install = "Quá trình Cài đặt / Cập nhật này phụ thuộc vào "; $lang->description_download = "Khi FTP không được mở, bạn nên tải về và giả nén, sau đó Upload theo đường dẫn. (Nếu đường dẫn là ./modules/board, thì giải nén vào ./modules)"; $lang->path = "Đường dẫn"; + $lang->cmd_download = "Download"; ?> diff --git a/modules/autoinstall/lang/zh-CN.lang.php b/modules/autoinstall/lang/zh-CN.lang.php index 87adc73a8..ee8a2c0fd 100644 --- a/modules/autoinstall/lang/zh-CN.lang.php +++ b/modules/autoinstall/lang/zh-CN.lang.php @@ -27,4 +27,5 @@ $lang->current_version = "Installed version"; $lang->description_download = "When FTP is disabled, you should download it and extract it into target path. (if target path is ./modules/board, extract it at ./modules)"; $lang->path = "Path"; + $lang->cmd_download = "Download"; ?> diff --git a/modules/autoinstall/lang/zh-TW.lang.php b/modules/autoinstall/lang/zh-TW.lang.php index f6ea19dfd..6b2e9728d 100644 --- a/modules/autoinstall/lang/zh-TW.lang.php +++ b/modules/autoinstall/lang/zh-TW.lang.php @@ -27,4 +27,5 @@ $lang->current_version = "安裝版本"; $lang->description_download = "When FTP is disabled, you should download it and extract it into target path. (if target path is ./modules/board, extract it at ./modules)"; $lang->path = "路徑"; + $lang->cmd_download = "Download"; ?> diff --git a/modules/autoinstall/tpl/install.html b/modules/autoinstall/tpl/install.html index 481a8c1da..cf7f79f40 100644 --- a/modules/autoinstall/tpl/install.html +++ b/modules/autoinstall/tpl/install.html @@ -8,14 +8,14 @@
    {$lang->depending_programs} :
    {$dep->title} ver. {$dep->version} - {$lang->current_version}: {$dep->cur_version} ({$lang->require_update}) {$lang->require_installation} - {$lang->download} ({$lang->path} : {$dep->path}) + {$lang->cmd_download} ({$lang->path} : {$dep->path})

    {$lang->description_download}. (FTP Setup)

    {$lang->path} : {$package->path}

    -

    {$lang->download}

    +

    {$lang->cmd_download}

    {$lang->description_install}.

    {$lang->install}

    From fd82efce3f44ba2679171bd009d9fcfe507297a5 Mon Sep 17 00:00:00 2001 From: haneul Date: Tue, 24 Nov 2009 07:08:25 +0000 Subject: [PATCH 29/51] #18216098 : multi-language support for group name git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6965 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/tpl/group_update_form.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/member/tpl/group_update_form.html b/modules/member/tpl/group_update_form.html index 85afa4b2c..4d6c688c0 100644 --- a/modules/member/tpl/group_update_form.html +++ b/modules/member/tpl/group_update_form.html @@ -11,7 +11,7 @@ - + From ddcbf01c84069bbc1783b85df0b31bdd57a2ce2b Mon Sep 17 00:00:00 2001 From: haneul Date: Tue, 24 Nov 2009 10:12:02 +0000 Subject: [PATCH 30/51] #18445087 : make easy install install db and do update, too git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6966 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../autoinstall.admin.controller.php | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/modules/autoinstall/autoinstall.admin.controller.php b/modules/autoinstall/autoinstall.admin.controller.php index 43bca2f2b..f4942e40c 100644 --- a/modules/autoinstall/autoinstall.admin.controller.php +++ b/modules/autoinstall/autoinstall.admin.controller.php @@ -40,11 +40,37 @@ FileHandler::writeFile($this->download_file, $buff); } + function installModule() + { + $path_array = explode("/", $this->package->path); + $target_name = array_pop($path_array); + $type = substr(array_pop($path_array), 0, -1); + if($type == "module") + { + $oModuleModel = &getModel('module'); + $oInstallController = &getController('install'); + $module_path = ModuleHandler::getModulePath($target_name); + if($oModuleModel->checkNeedInstall($target_name)) + { + $oInstallController->installModule($target_name, $module_path); + } + if($oModuleModel->checkNeedUpdate($target_name)) + { + $oModule = &getModule($target_name, 'class'); + if(method_exists($oModule, 'moduleUpdate')) + { + $oModule->moduleUpdate(); + } + } + } + } + function install() { $this->_download(); $file_list = $this->_unPack(); $this->_copyDir($file_list); + $this->installModule(); FileHandler::removeDir($this->temp_dir); return; From 14f6655fde4143407e298551984f88fee1f1f621 Mon Sep 17 00:00:00 2001 From: khongchi Date: Tue, 24 Nov 2009 10:19:08 +0000 Subject: [PATCH 31/51] =?UTF-8?q?#18457144=20=EC=9E=90=EB=8F=99=EB=A7=81?= =?UTF-8?q?=ED=81=AC=EC=95=A0=EB=93=9C=EC=98=A8=EC=9D=84=20textyle=20?= =?UTF-8?q?=EB=8B=A8=EB=9D=BD=EC=97=90=EB=94=94=ED=84=B0=EC=9D=98=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=EB=A6=AC=EC=82=AC=EC=9D=B4=EC=A6=88?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6967 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- addons/resize_image/js/resize_image.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/addons/resize_image/js/resize_image.js b/addons/resize_image/js/resize_image.js index b0fe66bc8..70c3d02ed 100644 --- a/addons/resize_image/js/resize_image.js +++ b/addons/resize_image/js/resize_image.js @@ -121,11 +121,14 @@ function getScreen() { prevbtn.css("visibility", (this.index>0)?"visible":"hidden"); nextbtn.css("visibility", (this.index Date: Wed, 25 Nov 2009 01:47:51 +0000 Subject: [PATCH 32/51] Modify CHT language git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6968 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/zh-TW.lang.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/lang/zh-TW.lang.php b/common/lang/zh-TW.lang.php index d826b25fe..c33c34b81 100644 --- a/common/lang/zh-TW.lang.php +++ b/common/lang/zh-TW.lang.php @@ -126,7 +126,7 @@ $lang->mid = '模組名稱'; $lang->sid = '網站名稱'; $lang->layout = '版面'; - $lang->widget = 'Widget '; + $lang->widget = 'Widget'; $lang->module = '模組'; $lang->skin = '面板'; $lang->colorset = '顏色設定'; @@ -298,7 +298,7 @@ $lang->msg_ftp_connect_success = 'FTP連線成功。'; $lang->ftp_path_title = '請輸入FTP路經'; - $lang->msg_ftp_installed_realpath = '請輸入安裝XE時的絕對路經'; + $lang->msg_ftp_installed_realpath = '安裝XE時的絕對路經'; $lang->msg_ftp_installed_ftp_realpath = '請輸入安裝XE時的FTP絕對路經'; From 038ee6c4f23f27197984fcf2a38a7554edc3bb68 Mon Sep 17 00:00:00 2001 From: bnu Date: Wed, 25 Nov 2009 01:48:22 +0000 Subject: [PATCH 33/51] =?UTF-8?q?#18456985=20*=20=EC=9E=90=EB=8F=99?= =?UTF-8?q?=EB=A7=81=ED=81=AC=20=EC=95=A0=EB=93=9C=EC=98=A8=20=EB=A6=AC?= =?UTF-8?q?=EC=86=8C=EC=8A=A4=20=EA=B3=BC=EB=8B=A4=20=EC=82=AC=EC=9A=A9=20?= =?UTF-8?q?=EB=B0=8F=20=EC=A4=91=EB=B3=B5=EC=B2=98=EB=A6=AC=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6969 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- addons/autolink/autolink.js | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/addons/autolink/autolink.js b/addons/autolink/autolink.js index 5d32aadb2..f3068b9f7 100644 --- a/addons/autolink/autolink.js +++ b/addons/autolink/autolink.js @@ -31,6 +31,7 @@ }, API_AUTOLINK : function(oSender, params) { var textNode = params[0]; + if(!$(textNode).parent().length || $(textNode).parent().get(0).nodeName.toLowerCase() == 'a') return; var content = textNode.nodeValue; var dummy = $(''); @@ -44,20 +45,31 @@ }, extractTargets : function(obj) { var thisPlugin = this; + var wrap = $('.xe_content', obj); + if(wrap.length) { + this.extractTargets(wrap); + return; + } $(obj) .contents() .each(function(){ + var node_name = this.nodeName.toLowerCase(); + if($.inArray(node_name, ['a', 'pre', 'xml', 'textarea', 'input', 'select', 'option', 'code', 'script', 'style', 'iframe', 'button', 'img', 'embed', 'object', 'ins']) != -1) return; + // FIX ME : When this meanless code wasn't executed, url_regex do not run correctly. why? url_regex.exec(''); - if (!$(this).is('a,pre,xml,code,script,style,:input')) { - if (this.nodeType == 3 && url_regex.test(this.nodeValue)) { // text node - thisPlugin.targets.push(this); - } else { - - thisPlugin.extractTargets(this); - } + if(this.nodeType == 3) { // text node + var content = this.nodeValue; + + if(content.length < 5) return; + + if(!/(http|https|ftp|news|telnet|irc):\/\//i.test(content)) return; + + thisPlugin.targets.push(this); + } else { + thisPlugin.extractTargets(this); } }); } From 400bdef3c73ad1d4a05af9e3af82350d4ccdd719 Mon Sep 17 00:00:00 2001 From: khongchi Date: Wed, 25 Nov 2009 04:04:52 +0000 Subject: [PATCH 34/51] =?UTF-8?q?#18457969=20TTXML=20=EC=9D=B4=EC=A0=84?= =?UTF-8?q?=EC=8B=9C=20=EC=A4=91=EC=B2=A9=EC=B9=B4=ED=85=8C=EA=B3=A0?= =?UTF-8?q?=EB=A6=AC=20=EC=B2=98=EB=A6=AC=EB=AA=BB=ED=95=A8=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6970 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/importer/ttimport.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/importer/ttimport.class.php b/modules/importer/ttimport.class.php index 2431f93ee..05f4dd40c 100644 --- a/modules/importer/ttimport.class.php +++ b/modules/importer/ttimport.class.php @@ -552,7 +552,7 @@ $obj->sequence = $idx; $obj->parent = $parent; - $category[$priority] = $obj; + $category[$idx] = $obj; $this->arrangeCategory($val, $category, $idx, $idx); } From bee1cf38599b71ab3d1f1b72557ca86ae5744366 Mon Sep 17 00:00:00 2001 From: khongchi Date: Wed, 25 Nov 2009 04:09:14 +0000 Subject: [PATCH 35/51] =?UTF-8?q?#18457976=20TTXML=20=ED=85=8D=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=ED=81=90=EB=B8=8C=EC=97=90=EC=84=9C=20=EC=9D=B4?= =?UTF-8?q?=EC=A0=84=EC=8B=9C=20=EC=98=A4=EB=A5=98=EB=B0=9C=EC=83=9D=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6971 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/importer/importer.admin.controller.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/importer/importer.admin.controller.php b/modules/importer/importer.admin.controller.php index 52ebcca80..61b8e4ad3 100644 --- a/modules/importer/importer.admin.controller.php +++ b/modules/importer/importer.admin.controller.php @@ -63,7 +63,10 @@ $buff = ''; while (!feof($oExtract->fd)) { $str = fgets($oExtract->fd, 1024); - if(substr($str,0,strlen(''))=='') $started = true; + if(strstr($str, '')) { + $started = true; + $str = strstr($str, ''); + } if(substr($str,0,strlen('fd)) { $str = fgets($oExtract->fd, 1024); - if(substr($str,0,strlen(''))=='') $started = true; + if(strstr($str, '')) { + $started = true; + $str = strstr($str, ''); + } if ($started) { $pos = strpos($str, ''); if ($pos !== false) { From 417382994f7870133e9271908108f2e9f6080c2c Mon Sep 17 00:00:00 2001 From: taggon Date: Wed, 25 Nov 2009 04:41:18 +0000 Subject: [PATCH 36/51] =?UTF-8?q?#18458084=20=ED=88=B4=ED=8C=81=20?= =?UTF-8?q?=ED=94=8C=EB=9F=AC=EA=B7=B8=EC=9D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6972 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/js/plugins/qtip/jquery.qtip.debug.js | 142 ++ common/js/plugins/qtip/jquery.qtip.js | 2149 +++++++++++++++++++ common/js/plugins/qtip/jquery.qtip.min.js | 15 + common/js/plugins/qtip/plugin.load | 1 + 4 files changed, 2307 insertions(+) create mode 100644 common/js/plugins/qtip/jquery.qtip.debug.js create mode 100644 common/js/plugins/qtip/jquery.qtip.js create mode 100644 common/js/plugins/qtip/jquery.qtip.min.js create mode 100644 common/js/plugins/qtip/plugin.load diff --git a/common/js/plugins/qtip/jquery.qtip.debug.js b/common/js/plugins/qtip/jquery.qtip.debug.js new file mode 100644 index 000000000..5b9801140 --- /dev/null +++ b/common/js/plugins/qtip/jquery.qtip.debug.js @@ -0,0 +1,142 @@ +/** + * jquery.qtip.debug. The jQuery tooltip plugin debugger + * + * Debug mode logs all tooltip events and error messages to the + * global $.fn.qtip.log object, as well as creates an array of + * references to all tooltips on the page. + * + * If a console is present, such as firebug (http://getfirebug.com), + * Opera's inbuilt Drangonfly, or IE8's internal Web Developer tool, + * errors will be reported to the console based on your set report + * mask, which is explained in details below. + * + * + * Copyright (c) 2009 Craig Thompson + * http://craigsworks.com + * + * Licensed under MIT + * http://www.opensource.org/licenses/mit-license.php + * + * Launch : February 2009 + * Version : 1.0.0-rc3 + * Released: Friday 27th April, 2009 - 23:30 + */ + +/* DEBUG MODE - OFF BY DEFAULT - set to true to enable debugging */ +$.fn.qtip.debug = true; + + +if($.fn.qtip.debug) +{ + // Create new debug constants + $.fn.qtip.constants = + { + /* Error messages */ + NO_TOOLTIP_PRESENT: 'No tooltip is present on the selected element. Cannot proceed with API call.', + TOOLTIP_NOT_RENDERED: 'Tooltip has not yet been rendered! Cannot proceed with API call.', + NO_VALID_CONTENT: 'No valid content was provided in the options. Using blank content.', + TOOLTIP_IS_DISABLED: 'Tooltip is disabled, cannot proceed with API call.', + TOOLTIP_ALREADY_DISABLED: 'Tooltip is already disabled.', + TOOLTIP_ALREADY_ENABLED: 'Tooltip is already enabled.', + CANVAS_VML_NOT_SUPPORTED: 'Niether canvas or VML are supported, corner and tips will not be drawn.', + STYLE_NOT_DEFINED: 'No such style is defined in the global styles object.', + INVALID_AREA_SHAPE: 'The AREA element used as your target has an invalid area shape. Possible values are: rect, circle, poly.', + CANNOT_FOCUS_STATIC: 'Focusing static elements is not possible as they don\'t have z-index properties.', + CANNOT_POSITION_STATIC: 'Positioning static elements is not possible as they don\'t have left or top properties.', + NO_CONTENT_PROVIDED: 'You must specify some content with which to update.', + + /* Event messages */ + EVENT_RENDERED: '(Event) Tooltip has been rendered.', + EVENT_SHOWN: '(Event) Tooltip has been shown.', + EVENT_HIDDEN: '(Event) Tooltip has been hidden.', + EVENT_FOCUSED: '(Event) Tooltip has been focused.', + EVENT_DISABLED: '(Event) Tooltip has been disabled.', + EVENT_ENABLED: '(Event) Tooltip has been enabled.', + EVENT_DESTROYED: '(Event) Tooltip has been destroyed.', + EVENT_POSITION_UPDATED: '(Event) Tooltip position has been updated.', + EVENT_CONTENT_UPDATED: '(Event) Tooltip contents have been updated.', + EVENT_CONTENT_LOADED: '(Event) Tooltip contents have been loaded from specified URL.', + EVENT_TITLE_UPDATED: '(Event) Tooltip title has been updated.', + EVENT_STYLE_UPDATED: '(Event) Tooltip style has been updated.', + EVENT_WIDTH_UPDATED: '(Event) Tooltip width has been updated.' + }; + + // Define qTip log object + $.fn.qtip.log = { + /* CONSOLE REPORTING MASK + To use this functionality you need a console installed, such as firebug: + http://getfirebug.com + + This mask determines what errors are reported to the console. Possible values are: + 7 = Errors, warnings and messages + 6 = Errors and warnings + 5 = Errors and messages + 4 = Errors only + 3 = Warnings and messages + 2 = Warnings only + 1 = Messages only + */ + report: 7, + + /* DO NOT ALTER ANYTHING BELOW HERE! */ + qtips: [], + messages: [], + errors: [], + + /* Error handler function */ + error: function(type, message, method) + { + var self = this; + + // Format type string + switch(type) + { + case 1: + var typeString = 'info'; + var addTo = 'messages'; + break; + + case 2: + var typeString = 'warn'; + var addTo = 'messages'; + break; + + default: case 4: + var typeString = 'error'; + var addTo = 'errors'; + break; + } + + // Format time + var DateObj = new Date(); + var time = DateObj.getHours() + ':' + + DateObj.getMinutes() + ':' + + DateObj.getSeconds(); + + // Log the error into the log array + $.fn.qtip.log[addTo].push({ + time: time, + message: message, + + api: self, + callee: self[method] || method || null + }); + + // If debug mode is enabled, display the error + if($.fn.qtip.log.report & type > 0) + { + var logMessage = 'qTip ' + + ((typeof self.id !== 'undefined') ? '['+self.id+']' : '') + + ': ' + message; + + // Check console is present + if(window.console) window.console[typeString](logMessage); + + // Check for Opera Dragonfly + else if($.browser.opera && window.opera.postError) window.opera.postError(logMessage); + } + + return self; + } + }; +}; diff --git a/common/js/plugins/qtip/jquery.qtip.js b/common/js/plugins/qtip/jquery.qtip.js new file mode 100644 index 000000000..405424f2d --- /dev/null +++ b/common/js/plugins/qtip/jquery.qtip.js @@ -0,0 +1,2149 @@ +/*! + * jquery.qtip. The jQuery tooltip plugin + * + * Copyright (c) 2009 Craig Thompson + * http://craigsworks.com + * + * Licensed under MIT + * http://www.opensource.org/licenses/mit-license.php + * + * Launch : February 2009 + * Version : 1.0.0-rc3 + * Released: Tuesday 12th May, 2009 - 00:00 + * Debug: jquery.qtip.debug.js + */ +(function($) +{ + // Implementation + $.fn.qtip = function(options, blanket) + { + var i, id, interfaces, opts, obj, command, config, api; + + // Return API / Interfaces if requested + if(typeof options == 'string') + { + // Make sure API data exists if requested + if(typeof $(this).data('qtip') !== 'object') + $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.NO_TOOLTIP_PRESENT, false); + + // Return requested object + if(options == 'api') + return $(this).data('qtip').interfaces[ $(this).data('qtip').current ]; + else if(options == 'interfaces') + return $(this).data('qtip').interfaces; + } + + // Validate provided options + else + { + // Set null options object if no options are provided + if(!options) options = {}; + + // Sanitize option data + if(typeof options.content !== 'object' || (options.content.jquery && options.content.length > 0)) options.content = { text: options.content }; + if(typeof options.content.title !== 'object') options.content.title = { text: options.content.title }; + if(typeof options.position !== 'object') options.position = { corner: options.position }; + if(typeof options.position.corner !== 'object') options.position.corner = { target: options.position.corner, tooltip: options.position.corner }; + if(typeof options.show !== 'object') options.show = { when: options.show }; + if(typeof options.show.when !== 'object') options.show.when = { event: options.show.when }; + if(typeof options.show.effect !== 'object') options.show.effect = { type: options.show.effect }; + if(typeof options.hide !== 'object') options.hide = { when: options.hide }; + if(typeof options.hide.when !== 'object') options.hide.when = { event: options.hide.when }; + if(typeof options.hide.effect !== 'object') options.hide.effect = { type: options.hide.effect }; + if(typeof options.style !== 'object') options.style = { name: options.style }; + options.style = sanitizeStyle(options.style); + + // Build main options object + opts = $.extend(true, {}, $.fn.qtip.defaults, options); + + // Inherit all style properties into one syle object and include original options + opts.style = buildStyle.call({ options: opts }, opts.style); + opts.user = $.extend(true, {}, options); + }; + + // Iterate each matched element + return $(this).each(function() // Return original elements as per jQuery guidelines + { + // Check for API commands + if(typeof options == 'string') + { + command = options.toLowerCase(); + interfaces = $(this).qtip('interfaces'); + + // Make sure API data exists$('.qtip').qtip('destroy') + if(typeof interfaces == 'object') + { + // Check if API call is a BLANKET DESTROY command + if(blanket === true && command == 'destroy') + while(interfaces.length > 0) interfaces[interfaces.length-1].destroy(); + + // API call is not a BLANKET DESTROY command + else + { + // Check if supplied command effects this tooltip only (NOT BLANKET) + if(blanket !== true) interfaces = [ $(this).qtip('api') ]; + + // Execute command on chosen qTips + for(i = 0; i < interfaces.length; i++) + { + // Destroy command doesn't require tooltip to be rendered + if(command == 'destroy') interfaces[i].destroy(); + + // Only call API if tooltip is rendered and it wasn't a destroy call + else if(interfaces[i].status.rendered === true) + { + if(command == 'show') interfaces[i].show(); + else if(command == 'hide') interfaces[i].hide(); + else if(command == 'focus') interfaces[i].focus(); + else if(command == 'disable') interfaces[i].disable(true); + else if(command == 'enable') interfaces[i].disable(false); + }; + }; + }; + }; + } + + // No API commands, continue with qTip creation + else + { + // Create unique configuration object + config = $.extend(true, {}, opts); + config.hide.effect.length = opts.hide.effect.length; + config.show.effect.length = opts.show.effect.length; + + // Sanitize target options + if(config.position.container === false) config.position.container = $(document.body); + if(config.position.target === false) config.position.target = $(this); + if(config.show.when.target === false) config.show.when.target = $(this); + if(config.hide.when.target === false) config.hide.when.target = $(this); + + // Determine tooltip ID (Reuse array slots if possible) + id = $.fn.qtip.interfaces.length; + for(i = 0; i < id; i++) + { + if(typeof $.fn.qtip.interfaces[i] == 'undefined'){ id = i; break; }; + }; + + // Instantiate the tooltip + obj = new qTip($(this), config, id); + + // Add API references + $.fn.qtip.interfaces[id] = obj; + + // Check if element already has qTip data assigned + if(typeof $(this).data('qtip') == 'object') + { + // Set new current interface id + if(typeof $(this).attr('qtip') === 'undefined') + $(this).data('qtip').current = $(this).data('qtip').interfaces.length; + + // Push new API interface onto interfaces array + $(this).data('qtip').interfaces.push(obj); + } + + // No qTip data is present, create now + else $(this).data('qtip', { current: 0, interfaces: [obj] }); + + // If prerendering is disabled, create tooltip on showEvent + if(config.content.prerender === false && config.show.when.event !== false && config.show.ready !== true) + { + config.show.when.target.bind(config.show.when.event+'.qtip-'+id+'-create', { qtip: id }, function(event) + { + // Retrieve API interface via passed qTip Id + api = $.fn.qtip.interfaces[ event.data.qtip ]; + + // Unbind show event and cache mouse coords + api.options.show.when.target.unbind(api.options.show.when.event+'.qtip-'+event.data.qtip+'-create'); + api.cache.mouse = { x: event.pageX, y: event.pageY }; + + // Render tooltip and start the event sequence + construct.call( api ); + api.options.show.when.target.trigger(api.options.show.when.event); + }); + } + + // Prerendering is enabled, create tooltip now + else + { + // Set mouse position cache to top left of the element + obj.cache.mouse = { + x: config.show.when.target.offset().left, + y: config.show.when.target.offset().top + }; + + // Construct the tooltip + construct.call(obj); + } + }; + }); + }; + + // Instantiator + function qTip(target, options, id) + { + // Declare this reference + var self = this; + + // Setup class attributes + self.id = id; + self.options = options; + self.status = { + animated: false, + rendered: false, + disabled: false, + focused: false + }; + self.elements = { + target: target.addClass(self.options.style.classes.target), + tooltip: null, + wrapper: null, + content: null, + contentWrapper: null, + title: null, + button: null, + tip: null, + bgiframe: null + }; + self.cache = { + mouse: {}, + position: {}, + toggle: 0 + }; + self.timers = {}; + + // Define exposed API methods + $.extend(self, self.options.api, + { + show: function(event) + { + var returned, solo; + + // Make sure tooltip is rendered and if not, return + if(!self.status.rendered) + return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'show'); + + // Only continue if element is visible + if(self.elements.tooltip.css('display') !== 'none') return self; + + // Clear animation queue + self.elements.tooltip.stop(true, false); + + // Call API method and if return value is false, halt + returned = self.beforeShow.call(self, event); + if(returned === false) return self; + + // Define afterShow callback method + function afterShow() + { + // Call API method and focus if it isn't static + if(self.options.position.type !== 'static') self.focus(); + self.onShow.call(self, event); + + // Prevent antialias from disappearing in IE7 by removing filter attribute + if($.browser.msie) self.elements.tooltip.get(0).style.removeAttribute('filter'); + }; + + // Maintain toggle functionality if enabled + self.cache.toggle = 1; + + // Update tooltip position if it isn't static + if(self.options.position.type !== 'static') + self.updatePosition(event, (self.options.show.effect.length > 0)); + + // Hide other tooltips if tooltip is solo + if(typeof self.options.show.solo == 'object') solo = $(self.options.show.solo); + else if(self.options.show.solo === true) solo = $('div.qtip').not(self.elements.tooltip); + if(solo) solo.each(function(){ if($(this).qtip('api').status.rendered === true) $(this).qtip('api').hide(); }); + + // Show tooltip + if(typeof self.options.show.effect.type == 'function') + { + self.options.show.effect.type.call(self.elements.tooltip, self.options.show.effect.length); + self.elements.tooltip.queue(function(){ afterShow(); $(this).dequeue(); }); + } + else + { + switch(self.options.show.effect.type.toLowerCase()) + { + case 'fade': + self.elements.tooltip.fadeIn(self.options.show.effect.length, afterShow); + break; + case 'slide': + self.elements.tooltip.slideDown(self.options.show.effect.length, function() + { + afterShow(); + if(self.options.position.type !== 'static') self.updatePosition(event, true); + }); + break; + case 'grow': + self.elements.tooltip.show(self.options.show.effect.length, afterShow); + break; + default: + self.elements.tooltip.show(null, afterShow); + break; + }; + + // Add active class to tooltip + self.elements.tooltip.addClass(self.options.style.classes.active); + }; + + // Log event and return + return $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_SHOWN, 'show'); + }, + + hide: function(event) + { + var returned; + + // Make sure tooltip is rendered and if not, return + if(!self.status.rendered) + return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'hide'); + + // Only continue if element is visible + else if(self.elements.tooltip.css('display') === 'none') return self; + + // Stop show timer and animation queue + clearTimeout(self.timers.show); + self.elements.tooltip.stop(true, false); + + // Call API method and if return value is false, halt + returned = self.beforeHide.call(self, event); + if(returned === false) return self; + + // Define afterHide callback method + function afterHide(){ self.onHide.call(self, event); }; + + // Maintain toggle functionality if enabled + self.cache.toggle = 0; + + // Hide tooltip + if(typeof self.options.hide.effect.type == 'function') + { + self.options.hide.effect.type.call(self.elements.tooltip, self.options.hide.effect.length); + self.elements.tooltip.queue(function(){ afterHide(); $(this).dequeue(); }); + } + else + { + switch(self.options.hide.effect.type.toLowerCase()) + { + case 'fade': + self.elements.tooltip.fadeOut(self.options.hide.effect.length, afterHide); + break; + case 'slide': + self.elements.tooltip.slideUp(self.options.hide.effect.length, afterHide); + break; + case 'grow': + self.elements.tooltip.hide(self.options.hide.effect.length, afterHide); + break; + default: + self.elements.tooltip.hide(null, afterHide); + break; + }; + + // Remove active class to tooltip + self.elements.tooltip.removeClass(self.options.style.classes.active); + }; + + // Log event and return + return $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_HIDDEN, 'hide'); + }, + + updatePosition: function(event, animate) + { + var i, target, tooltip, coords, mapName, imagePos, newPosition, ieAdjust, ie6Adjust, borderAdjust, mouseAdjust, offset, curPosition, returned + + // Make sure tooltip is rendered and if not, return + if(!self.status.rendered) + return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'updatePosition'); + + // If tooltip is static, return + else if(self.options.position.type == 'static') + return $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.CANNOT_POSITION_STATIC, 'updatePosition'); + + // Define property objects + target = { + position: { left: 0, top: 0 }, + dimensions: { height: 0, width: 0 }, + corner: self.options.position.corner.target + }; + tooltip = { + position: self.getPosition(), + dimensions: self.getDimensions(), + corner: self.options.position.corner.tooltip + }; + + // Target is an HTML element + if(self.options.position.target !== 'mouse') + { + // If the HTML element is AREA, calculate position manually + if(self.options.position.target.get(0).nodeName.toLowerCase() == 'area') + { + // Retrieve coordinates from coords attribute and parse into integers + coords = self.options.position.target.attr('coords').split(','); + for(i = 0; i < coords.length; i++) coords[i] = parseInt(coords[i]); + + // Setup target position object + mapName = self.options.position.target.parent('map').attr('name'); + imagePos = $('img[usemap="#'+mapName+'"]:first').offset(); + target.position = { + left: Math.floor(imagePos.left + coords[0]), + top: Math.floor(imagePos.top + coords[1]) + }; + + // Determine width and height of the area + switch(self.options.position.target.attr('shape').toLowerCase()) + { + case 'rect': + target.dimensions = { + width: Math.ceil(Math.abs(coords[2] - coords[0])), + height: Math.ceil(Math.abs(coords[3] - coords[1])) + }; + break; + + case 'circle': + target.dimensions = { + width: coords[2] + 1, + height: coords[2] + 1 + }; + break; + + case 'poly': + target.dimensions = { + width: coords[0], + height: coords[1] + }; + + for(i = 0; i < coords.length; i++) + { + if(i % 2 == 0) + { + if(coords[i] > target.dimensions.width) + target.dimensions.width = coords[i]; + if(coords[i] < coords[0]) + target.position.left = Math.floor(imagePos.left + coords[i]); + } + else + { + if(coords[i] > target.dimensions.height) + target.dimensions.height = coords[i]; + if(coords[i] < coords[1]) + target.position.top = Math.floor(imagePos.top + coords[i]); + }; + }; + + target.dimensions.width = target.dimensions.width - (target.position.left - imagePos.left); + target.dimensions.height = target.dimensions.height - (target.position.top - imagePos.top); + break; + + default: + return $.fn.qtip.log.error.call(self, 4, $.fn.qtip.constants.INVALID_AREA_SHAPE, 'updatePosition'); + break; + }; + + // Adjust position by 2 pixels (Positioning bug?) + target.dimensions.width -= 2; target.dimensions.height -= 2; + } + + // Target is the document + else if(self.options.position.target.add(document.body).length === 1) + { + target.position = { left: $(document).scrollLeft(), top: $(document).scrollTop() }; + target.dimensions = { height: $(window).height(), width: $(window).width() }; + } + + // Target is a regular HTML element, find position normally + else + { + // Check if the target is another tooltip. If its animated, retrieve position from newPosition data + if(typeof self.options.position.target.attr('qtip') !== 'undefined') + target.position = self.options.position.target.qtip('api').cache.position; + else + target.position = self.options.position.target.offset(); + + // Setup dimensions objects + target.dimensions = { + height: self.options.position.target.outerHeight(), + width: self.options.position.target.outerWidth() + }; + }; + + // Calculate correct target corner position + newPosition = $.extend({}, target.position); + if(target.corner.search(/right/i) !== -1) + newPosition.left += target.dimensions.width; + + if(target.corner.search(/bottom/i) !== -1) + newPosition.top += target.dimensions.height; + + if(target.corner.search(/((top|bottom)Middle)|center/) !== -1) + newPosition.left += (target.dimensions.width / 2); + + if(target.corner.search(/((left|right)Middle)|center/) !== -1) + newPosition.top += (target.dimensions.height / 2); + } + + // Mouse is the target, set position to current mouse coordinates + else + { + // Setup target position and dimensions objects + target.position = newPosition = { left: self.cache.mouse.x, top: self.cache.mouse.y }; + target.dimensions = { height: 1, width: 1 }; + }; + + // Calculate correct target corner position + if(tooltip.corner.search(/right/i) !== -1) + newPosition.left -= tooltip.dimensions.width; + + if(tooltip.corner.search(/bottom/i) !== -1) + newPosition.top -= tooltip.dimensions.height; + + if(tooltip.corner.search(/((top|bottom)Middle)|center/) !== -1) + newPosition.left -= (tooltip.dimensions.width / 2); + + if(tooltip.corner.search(/((left|right)Middle)|center/) !== -1) + newPosition.top -= (tooltip.dimensions.height / 2); + + // Setup IE adjustment variables (Pixel gap bugs) + ieAdjust = ($.browser.msie) ? 1 : 0; // And this is why I hate IE... + ie6Adjust = ($.browser.msie && parseInt($.browser.version.charAt(0)) === 6) ? 1 : 0; // ...and even more so IE6! + + // Adjust for border radius + if(self.options.style.border.radius > 0) + { + if(tooltip.corner.search(/Left/) !== -1) + newPosition.left -= self.options.style.border.radius; + else if(tooltip.corner.search(/Right/) !== -1) + newPosition.left += self.options.style.border.radius; + + if(tooltip.corner.search(/Top/) !== -1) + newPosition.top -= self.options.style.border.radius; + else if(tooltip.corner.search(/Bottom/) !== -1) + newPosition.top += self.options.style.border.radius; + }; + + // IE only adjustments (Pixel perfect!) + if(ieAdjust) + { + if(tooltip.corner.search(/top/) !== -1) + newPosition.top -= ieAdjust + else if(tooltip.corner.search(/bottom/) !== -1) + newPosition.top += ieAdjust + + if(tooltip.corner.search(/left/) !== -1) + newPosition.left -= ieAdjust + else if(tooltip.corner.search(/right/) !== -1) + newPosition.left += ieAdjust + + if(tooltip.corner.search(/leftMiddle|rightMiddle/) !== -1) + newPosition.top -= 1 + }; + + // If screen adjustment is enabled, apply adjustments + if(self.options.position.adjust.screen === true) + newPosition = screenAdjust.call(self, newPosition, target, tooltip); + + // If mouse is the target, prevent tooltip appearing directly under the mouse + if(self.options.position.target === 'mouse' && self.options.position.adjust.mouse === true) + { + if(self.options.position.adjust.screen === true && self.elements.tip) + mouseAdjust = self.elements.tip.attr('rel'); + else + mouseAdjust = self.options.position.corner.tooltip; + + newPosition.left += (mouseAdjust.search(/right/i) !== -1) ? -6 : 6; + newPosition.top += (mouseAdjust.search(/bottom/i) !== -1) ? -6 : 6; + } + + // Initiate bgiframe plugin in IE6 if tooltip overlaps a select box or object element + if(!self.elements.bgiframe && $.browser.msie && parseInt($.browser.version.charAt(0)) == 6) + { + $('select, object').each(function() + { + offset = $(this).offset(); + offset.bottom = offset.top + $(this).height(); + offset.right = offset.left + $(this).width(); + + if(newPosition.top + tooltip.dimensions.height >= offset.top + && newPosition.left + tooltip.dimensions.width >= offset.left) + bgiframe.call(self); + }); + }; + + // Add user xy adjustments + newPosition.left += self.options.position.adjust.x; + newPosition.top += self.options.position.adjust.y; + + // Set new tooltip position if its moved, animate if enabled + curPosition = self.getPosition(); + if(newPosition.left != curPosition.left || newPosition.top != curPosition.top) + { + // Call API method and if return value is false, halt + returned = self.beforePositionUpdate.call(self, event); + if(returned === false) return self; + + // Cache new position + self.cache.position = newPosition; + + // Check if animation is enabled + if(animate === true) + { + // Set animated status + self.status.animated = true; + + // Animate and reset animated status on animation end + self.elements.tooltip.animate(newPosition, 200, 'swing', function(){ self.status.animated = false }); + } + + // Set new position via CSS + else self.elements.tooltip.css(newPosition); + + // Call API method and log event if its not a mouse move + self.onPositionUpdate.call(self, event); + if(typeof event !== 'undefined' && event.type && event.type !== 'mousemove') + $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_POSITION_UPDATED, 'updatePosition'); + }; + + return self; + }, + + updateWidth: function(newWidth) + { + var hidden; + + // Make sure tooltip is rendered and if not, return + if(!self.status.rendered) + return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'updateWidth'); + + // Make sure supplied width is a number and if not, return + else if(newWidth && typeof newWidth !== 'number') + return $.fn.qtip.log.error.call(self, 2, 'newWidth must be of type number', 'updateWidth'); + + // Setup elements which must be hidden during width update + hidden = self.elements.contentWrapper.siblings().add(self.elements.tip).add(self.elements.button); + + // Calculate the new width if one is not supplied + if(!newWidth) + { + // Explicit width is set + if(typeof self.options.style.width.value == 'number') + newWidth = self.options.style.width.value; + + // No width is set, proceed with auto detection + else + { + // Set width to auto initally to determine new width and hide other elements + self.elements.tooltip.css({ width: 'auto' }); + hidden.hide(); + + // Set position and zoom to defaults to prevent IE hasLayout bug + if($.browser.msie) + self.elements.wrapper.add(self.elements.contentWrapper.children()).css({ zoom: 'normal' }); + + // Set the new width + newWidth = self.getDimensions().width + 1; + + // Make sure its within the maximum and minimum width boundries + if(!self.options.style.width.value) + { + if(newWidth > self.options.style.width.max) newWidth = self.options.style.width.max + if(newWidth < self.options.style.width.min) newWidth = self.options.style.width.min + }; + }; + }; + + // Adjust newWidth by 1px if width is odd (IE6 rounding bug fix) + if(newWidth % 2 !== 0) newWidth -= 1; + + // Set the new calculated width and unhide other elements + self.elements.tooltip.width(newWidth); + hidden.show(); + + // Set the border width, if enabled + if(self.options.style.border.radius) + { + self.elements.tooltip.find('.qtip-betweenCorners').each(function(i) + { + $(this).width(newWidth - (self.options.style.border.radius * 2)); + }) + }; + + // IE only adjustments + if($.browser.msie) + { + // Reset position and zoom to give the wrapper layout (IE hasLayout bug) + self.elements.wrapper.add(self.elements.contentWrapper.children()).css({ zoom: '1' }); + + // Set the new width + self.elements.wrapper.width(newWidth); + + // Adjust BGIframe height and width if enabled + if(self.elements.bgiframe) self.elements.bgiframe.width(newWidth).height(self.getDimensions.height); + }; + + // Log event and return + return $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_WIDTH_UPDATED, 'updateWidth'); + }, + + updateStyle: function(name) + { + var tip, borders, context, corner, coordinates; + + // Make sure tooltip is rendered and if not, return + if(!self.status.rendered) + return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'updateStyle'); + + // Return if style is not defined or name is not a string + else if(typeof name !== 'string' || !$.fn.qtip.styles[name]) + return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.STYLE_NOT_DEFINED, 'updateStyle'); + + // Set the new style object + self.options.style = buildStyle.call(self, $.fn.qtip.styles[name], self.options.user.style); + + // Update initial styles of content and title elements + self.elements.content.css( jQueryStyle(self.options.style) ); + if(self.options.content.title.text !== false) + self.elements.title.css( jQueryStyle(self.options.style.title, true) ); + + // Update CSS border colour + self.elements.contentWrapper.css({ borderColor: self.options.style.border.color }); + + // Update tip color if enabled + if(self.options.style.tip.corner !== false) + { + if($('').get(0).getContext) + { + // Retrieve canvas context and clear + tip = self.elements.tooltip.find('.qtip-tip canvas:first'); + context = tip.get(0).getContext('2d'); + context.clearRect(0,0,300,300); + + // Draw new tip + corner = tip.parent('div[rel]:first').attr('rel'); + coordinates = calculateTip(corner, self.options.style.tip.size.width, self.options.style.tip.size.height); + drawTip.call(self, tip, coordinates, self.options.style.tip.color || self.options.style.border.color); + } + else if($.browser.msie) + { + // Set new fillcolor attribute + tip = self.elements.tooltip.find('.qtip-tip [nodeName="shape"]'); + tip.attr('fillcolor', self.options.style.tip.color || self.options.style.border.color); + }; + }; + + // Update border colors if enabled + if(self.options.style.border.radius > 0) + { + self.elements.tooltip.find('.qtip-betweenCorners').css({ backgroundColor: self.options.style.border.color }); + + if($('').get(0).getContext) + { + borders = calculateBorders(self.options.style.border.radius) + self.elements.tooltip.find('.qtip-wrapper canvas').each(function() + { + // Retrieve canvas context and clear + context = $(this).get(0).getContext('2d'); + context.clearRect(0,0,300,300); + + // Draw new border + corner = $(this).parent('div[rel]:first').attr('rel') + drawBorder.call(self, $(this), borders[corner], + self.options.style.border.radius, self.options.style.border.color); + }); + } + else if($.browser.msie) + { + // Set new fillcolor attribute on each border corner + self.elements.tooltip.find('.qtip-wrapper [nodeName="arc"]').each(function() + { + $(this).attr('fillcolor', self.options.style.border.color) + }); + }; + }; + + // Log event and return + return $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_STYLE_UPDATED, 'updateStyle'); + }, + + updateContent: function(content, reposition) + { + var parsedContent, images, loadedImages; + + // Make sure tooltip is rendered and if not, return + if(!self.status.rendered) + return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'updateContent'); + + // Make sure content is defined before update + else if(!content) + return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.NO_CONTENT_PROVIDED, 'updateContent'); + + // Call API method and set new content if a string is returned + parsedContent = self.beforeContentUpdate.call(self, content); + if(typeof parsedContent == 'string') content = parsedContent; + else if(parsedContent === false) return; + + // Set position and zoom to defaults to prevent IE hasLayout bug + if($.browser.msie) self.elements.contentWrapper.children().css({ zoom: 'normal' }); + + // Append new content if its a DOM array and show it if hidden + if(content.jquery && content.length > 0) + content.clone(true).appendTo(self.elements.content).show(); + + // Content is a regular string, insert the new content + else self.elements.content.html(content); + + // Check if images need to be loaded before position is updated to prevent mis-positioning + images = self.elements.content.find('img[complete=false]'); + if(images.length > 0) + { + loadedImages = 0; + images.each(function(i) + { + $('') + .load(function(){ if(++loadedImages == images.length) afterLoad(); }); + }); + } + else afterLoad(); + + function afterLoad() + { + // Update the tooltip width + self.updateWidth(); + + // If repositioning is enabled, update positions + if(reposition !== false) + { + // Update position if tooltip isn't static + if(self.options.position.type !== 'static') + self.updatePosition(self.elements.tooltip.is(':visible'), true); + + // Reposition the tip if enabled + if(self.options.style.tip.corner !== false) + positionTip.call(self); + }; + }; + + // Call API method and log event + self.onContentUpdate.call(self); + return $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_CONTENT_UPDATED, 'loadContent'); + }, + + loadContent: function(url, data, method) + { + var returned; + + // Make sure tooltip is rendered and if not, return + if(!self.status.rendered) + return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'loadContent'); + + // Call API method and if return value is false, halt + returned = self.beforeContentLoad.call(self); + if(returned === false) return self; + + // Load content using specified request type + if(method == 'post') + $.post(url, data, setupContent); + else + $.get(url, data, setupContent); + + function setupContent(content) + { + // Call API method and log event + self.onContentLoad.call(self); + $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_CONTENT_LOADED, 'loadContent'); + + // Update the content + self.updateContent(content); + }; + + return self; + }, + + updateTitle: function(content) + { + // Make sure tooltip is rendered and if not, return + if(!self.status.rendered) + return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'updateTitle'); + + // Make sure content is defined before update + else if(!content) + return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.NO_CONTENT_PROVIDED, 'updateTitle'); + + // Call API method and if return value is false, halt + returned = self.beforeTitleUpdate.call(self); + if(returned === false) return self; + + // Set the new content and reappend the button if enabled + if(self.elements.button) self.elements.button = self.elements.button.clone(true); + self.elements.title.html(content) + if(self.elements.button) self.elements.title.prepend(self.elements.button); + + // Call API method and log event + self.onTitleUpdate.call(self); + return $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_TITLE_UPDATED, 'updateTitle'); + }, + + focus: function(event) + { + var curIndex, newIndex, elemIndex, returned; + + // Make sure tooltip is rendered and if not, return + if(!self.status.rendered) + return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'focus'); + + else if(self.options.position.type == 'static') + return $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.CANNOT_FOCUS_STATIC, 'focus'); + + // Set z-index variables + curIndex = parseInt( self.elements.tooltip.css('z-index') ); + newIndex = 6000 + $('div.qtip[qtip]').length - 1; + + // Only update the z-index if it has changed and tooltip is not already focused + if(!self.status.focused && curIndex !== newIndex) + { + // Call API method and if return value is false, halt + returned = self.beforeFocus.call(self, event); + if(returned === false) return self; + + // Loop through all other tooltips + $('div.qtip[qtip]').not(self.elements.tooltip).each(function() + { + if($(this).qtip('api').status.rendered === true) + { + elemIndex = parseInt($(this).css('z-index')); + + // Reduce all other tooltip z-index by 1 + if(typeof elemIndex == 'number' && elemIndex > -1) + $(this).css({ zIndex: parseInt( $(this).css('z-index') ) - 1 }); + + // Set focused status to false + $(this).qtip('api').status.focused = false; + } + }) + + // Set the new z-index and set focus status to true + self.elements.tooltip.css({ zIndex: newIndex }); + self.status.focused = true; + + // Call API method and log event + self.onFocus.call(self, event); + $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_FOCUSED, 'focus'); + }; + + return self; + }, + + disable: function(state) + { + // Make sure tooltip is rendered and if not, return + if(!self.status.rendered) + return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'disable'); + + if(state) + { + // Tooltip is not already disabled, proceed + if(!self.status.disabled) + { + // Set the disabled flag and log event + self.status.disabled = true; + $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_DISABLED, 'disable'); + } + + // Tooltip is already disabled, inform user via log + else $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.TOOLTIP_ALREADY_DISABLED, 'disable'); + } + else + { + // Tooltip is not already enabled, proceed + if(self.status.disabled) + { + // Reassign events, set disable status and log + self.status.disabled = false; + $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_ENABLED, 'disable'); + } + + // Tooltip is already enabled, inform the user via log + else $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.TOOLTIP_ALREADY_ENABLED, 'disable'); + }; + + return self; + }, + + destroy: function() + { + var i, returned, interfaces; + + // Call API method and if return value is false, halt + returned = self.beforeDestroy.call(self); + if(returned === false) return self; + + // Check if tooltip is rendered + if(self.status.rendered) + { + // Remove event handlers and remove element + self.options.show.when.target.unbind('mousemove.qtip', self.updatePosition); + self.options.show.when.target.unbind('mouseout.qtip', self.hide); + self.options.show.when.target.unbind(self.options.show.when.event + '.qtip'); + self.options.hide.when.target.unbind(self.options.hide.when.event + '.qtip'); + self.elements.tooltip.unbind(self.options.hide.when.event + '.qtip'); + self.elements.tooltip.unbind('mouseover.qtip', self.focus); + self.elements.tooltip.remove(); + } + + // Tooltip isn't yet rendered, remove render event + else self.options.show.when.target.unbind(self.options.show.when.event+'.qtip-create'); + + // Check to make sure qTip data is present on target element + if(typeof self.elements.target.data('qtip') == 'object') + { + // Remove API references from interfaces object + interfaces = self.elements.target.data('qtip').interfaces; + if(typeof interfaces == 'object' && interfaces.length > 0) + { + // Remove API from interfaces array + for(i = 0; i < interfaces.length - 1; i++) + if(interfaces[i].id == self.id) interfaces.splice(i, 1) + } + } + delete $.fn.qtip.interfaces[self.id]; + + // Set qTip current id to previous tooltips API if available + if(typeof interfaces == 'object' && interfaces.length > 0) + self.elements.target.data('qtip').current = interfaces.length -1; + else + self.elements.target.removeData('qtip'); + + // Call API method and log destroy + self.onDestroy.call(self); + $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_DESTROYED, 'destroy'); + + return self.elements.target + }, + + getPosition: function() + { + var show, offset; + + // Make sure tooltip is rendered and if not, return + if(!self.status.rendered) + return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'getPosition'); + + show = (self.elements.tooltip.css('display') !== 'none') ? false : true; + + // Show and hide tooltip to make sure coordinates are returned + if(show) self.elements.tooltip.css({ visiblity: 'hidden' }).show(); + offset = self.elements.tooltip.offset(); + if(show) self.elements.tooltip.css({ visiblity: 'visible' }).hide(); + + return offset; + }, + + getDimensions: function() + { + var show, dimensions; + + // Make sure tooltip is rendered and if not, return + if(!self.status.rendered) + return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'getDimensions'); + + show = (!self.elements.tooltip.is(':visible')) ? true : false; + + // Show and hide tooltip to make sure dimensions are returned + if(show) self.elements.tooltip.css({ visiblity: 'hidden' }).show(); + dimensions = { + height: self.elements.tooltip.outerHeight(), + width: self.elements.tooltip.outerWidth() + }; + if(show) self.elements.tooltip.css({ visiblity: 'visible' }).hide(); + + return dimensions; + } + }); + }; + + // Define priamry construct function + function construct() + { + var self, adjust, content, url, data, method, tempLength; + self = this; + + // Call API method + self.beforeRender.call(self); + + // Set rendered status to true + self.status.rendered = true; + + // Create initial tooltip elements + self.elements.tooltip = '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    '; + + // Append to container element + self.elements.tooltip = $(self.elements.tooltip); + self.elements.tooltip.appendTo(self.options.position.container) + + // Setup tooltip qTip data + self.elements.tooltip.data('qtip', { current: 0, interfaces: [self] }); + + // Setup element references + self.elements.wrapper = self.elements.tooltip.children('div:first'); + self.elements.contentWrapper = self.elements.wrapper.children('div:first').css({ background: self.options.style.background }); + self.elements.content = self.elements.contentWrapper.children('div:first').css( jQueryStyle(self.options.style) ); + + // Apply IE hasLayout fix to wrapper and content elements + if($.browser.msie) self.elements.wrapper.add(self.elements.content).css({ zoom: 1 }); + + // Setup tooltip attributes + if(self.options.hide.when.event == 'unfocus') self.elements.tooltip.attr('unfocus', true); + + // If an explicit width is set, updateWidth prior to setting content to prevent dirty rendering + if(typeof self.options.style.width.value == 'number') self.updateWidth(); + + // Create borders and tips if supported by the browser + if($('').get(0).getContext || $.browser.msie) + { + // Create border + if(self.options.style.border.radius > 0) + createBorder.call(self); + else + self.elements.contentWrapper.css({ border: self.options.style.border.width+'px solid '+self.options.style.border.color }); + + // Create tip if enabled + if(self.options.style.tip.corner !== false) + createTip.call(self); + } + + // Neither canvas or VML is supported, tips and borders cannot be drawn! + else + { + // Set defined border width + self.elements.contentWrapper.css({ border: self.options.style.border.width+'px solid '+self.options.style.border.color }); + + // Reset border radius and tip + self.options.style.border.radius = 0; + self.options.style.tip.corner = false; + + // Inform via log + $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.CANVAS_VML_NOT_SUPPORTED, 'render'); + }; + + // Use the provided content string or DOM array + if((typeof self.options.content.text == 'string' && self.options.content.text.length > 0) + || (self.options.content.text.jquery && self.options.content.text.length > 0)) + content = self.options.content.text; + + // Use title string for content if present + else if(typeof self.elements.target.attr('title') == 'string' && self.elements.target.attr('title').length > 0) + { + content = self.elements.target.attr('title').replace("\\n", '
    '); + self.elements.target.attr('title', ''); // Remove title attribute to prevent default tooltip showing + } + + // No title is present, use alt attribute instead + else if(typeof self.elements.target.attr('alt') == 'string' && self.elements.target.attr('alt').length > 0) + { + content = self.elements.target.attr('alt').replace("\\n", '
    '); + self.elements.target.attr('alt', ''); // Remove alt attribute to prevent default tooltip showing + } + + // No valid content was provided, inform via log + else + { + content = ' '; + $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.NO_VALID_CONTENT, 'render'); + }; + + // Set the tooltips content and create title if enabled + if(self.options.content.title.text !== false) createTitle.call(self); + self.updateContent(content); + + // Assign events and toggle tooltip with focus + assignEvents.call(self); + if(self.options.show.ready === true) self.show(); + + // Retrieve ajax content if provided + if(self.options.content.url !== false) + { + url = self.options.content.url; + data = self.options.content.data; + method = self.options.content.method || 'get'; + self.loadContent(url, data, method); + }; + + // Call API method and log event + self.onRender.call(self); + $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_RENDERED, 'render'); + }; + + // Create borders using canvas and VML + function createBorder() + { + var self, i, width, radius, color, coordinates, containers, size, betweenWidth, betweenCorners, borderTop, borderBottom, borderCoord, sideWidth, vertWidth; + self = this; + + // Destroy previous border elements, if present + self.elements.wrapper.find('.qtip-borderBottom, .qtip-borderTop').remove(); + + // Setup local variables + width = self.options.style.border.width; + radius = self.options.style.border.radius; + color = self.options.style.border.color || self.options.style.tip.color; + + // Calculate border coordinates + coordinates = calculateBorders(radius); + + // Create containers for the border shapes + containers = {}; + for(i in coordinates) + { + // Create shape container + containers[i] = '
    '; + + // Canvas is supported + if($('').get(0).getContext) + containers[i] += ''; + + // No canvas, but if it's IE use VML + else if($.browser.msie) + { + size = radius * 2 + 3; + containers[i] += ''; + + }; + + containers[i] += '
    '; + }; + + // Create between corners elements + betweenWidth = self.getDimensions().width - (Math.max(width, radius) * 2); + betweenCorners = '
    '; + + // Create top border container + borderTop = '
    ' + + containers['topLeft'] + containers['topRight'] + betweenCorners; + self.elements.wrapper.prepend(borderTop); + + // Create bottom border container + borderBottom = '
    ' + + containers['bottomLeft'] + containers['bottomRight'] + betweenCorners; + self.elements.wrapper.append(borderBottom); + + // Draw the borders if canvas were used (Delayed til after DOM creation) + if($('').get(0).getContext) + { + self.elements.wrapper.find('canvas').each(function() + { + borderCoord = coordinates[ $(this).parent('[rel]:first').attr('rel') ]; + drawBorder.call(self, $(this), borderCoord, radius, color); + }) + } + + // Create a phantom VML element (IE won't show the last created VML element otherwise) + else if($.browser.msie) self.elements.tooltip.append(''); + + // Setup contentWrapper border + sideWidth = Math.max(radius, (radius + (width - radius)) ) + vertWidth = Math.max(width - radius, 0); + self.elements.contentWrapper.css({ + border: '0px solid ' + color, + borderWidth: vertWidth + 'px ' + sideWidth + 'px' + }) + }; + + // Border canvas draw method + function drawBorder(canvas, coordinates, radius, color) + { + // Create corner + var context = canvas.get(0).getContext('2d'); + context.fillStyle = color; + context.beginPath(); + context.arc(coordinates[0], coordinates[1], radius, 0, Math.PI * 2, false); + context.fill(); + }; + + // Create tip using canvas and VML + function createTip(corner) + { + var self, color, coordinates, coordsize, path; + self = this; + + // Destroy previous tip, if there is one + if(self.elements.tip !== null) self.elements.tip.remove(); + + // Setup color and corner values + color = self.options.style.tip.color || self.options.style.border.color; + if(self.options.style.tip.corner === false) return; + else if(!corner) corner = self.options.style.tip.corner; + + // Calculate tip coordinates + coordinates = calculateTip(corner, self.options.style.tip.size.width, self.options.style.tip.size.height); + + // Create tip element + self.elements.tip = '
    '; + + // Use canvas element if supported + if($('').get(0).getContext) + self.elements.tip += ''; + + // Canvas not supported - Use VML (IE) + else if($.browser.msie) + { + // Create coordize and tip path using tip coordinates + coordsize = self.options.style.tip.size.width + ',' + self.options.style.tip.size.height; + path = 'm' + coordinates[0][0] + ',' + coordinates[0][1]; + path += ' l' + coordinates[1][0] + ',' + coordinates[1][1]; + path += ' ' + coordinates[2][0] + ',' + coordinates[2][1]; + path += ' xe'; + + // Create VML element + self.elements.tip += ''; + + // Create a phantom VML element (IE won't show the last created VML element otherwise) + self.elements.tip += ''; + + // Prevent tooltip appearing above the content (IE z-index bug) + self.elements.contentWrapper.css('position', 'relative'); + }; + + // Attach new tip to tooltip element + self.elements.tooltip.prepend(self.elements.tip + '
    '); + + // Create element reference and draw the canvas tip (Delayed til after DOM creation) + self.elements.tip = self.elements.tooltip.find('.'+self.options.style.classes.tip).eq(0); + if($('').get(0).getContext) + drawTip.call(self, self.elements.tip.find('canvas:first'), coordinates, color); + + // Fix IE small tip bug + if(corner.search(/top/) !== -1 && $.browser.msie && parseInt($.browser.version.charAt(0)) === 6) + self.elements.tip.css({ marginTop: -4 }); + + // Set the tip position + positionTip.call(self, corner); + }; + + // Canvas tip drawing method + function drawTip(canvas, coordinates, color) + { + // Setup properties + var context = canvas.get(0).getContext('2d'); + context.fillStyle = color; + + // Create tip + context.beginPath(); + context.moveTo(coordinates[0][0], coordinates[0][1]); + context.lineTo(coordinates[1][0], coordinates[1][1]); + context.lineTo(coordinates[2][0], coordinates[2][1]); + context.fill(); + }; + + function positionTip(corner) + { + var self, ieAdjust, paddingCorner, paddingSize, newMargin; + self = this; + + // Return if tips are disabled or tip is not yet rendered + if(self.options.style.tip.corner === false || !self.elements.tip) return; + if(!corner) corner = self.elements.tip.attr('rel'); + + // Setup adjustment variables + ieAdjust = positionAdjust = ($.browser.msie) ? 1 : 0; + + // Set initial position + self.elements.tip.css(corner.match(/left|right|top|bottom/)[0], 0); + + // Set position of tip to correct side + if(corner.search(/top|bottom/) !== -1) + { + // Adjustments for IE6 - 0.5px border gap bug + if($.browser.msie) + { + if(parseInt($.browser.version.charAt(0)) === 6) + positionAdjust = (corner.search(/top/) !== -1) ? -3 : 1; + else + positionAdjust = (corner.search(/top/) !== -1) ? 1 : 2; + }; + + if(corner.search(/Middle/) !== -1) + self.elements.tip.css({ left: '50%', marginLeft: -(self.options.style.tip.size.width / 2) }); + + else if(corner.search(/Left/) !== -1) + self.elements.tip.css({ left: self.options.style.border.radius - ieAdjust }); + + else if(corner.search(/Right/) !== -1) + self.elements.tip.css({ right: self.options.style.border.radius + ieAdjust }); + + if(corner.search(/top/) !== -1) + self.elements.tip.css({ top: -positionAdjust }); + else + self.elements.tip.css({ bottom: positionAdjust }); + + } + else if(corner.search(/left|right/) !== -1) + { + // Adjustments for IE6 - 0.5px border gap bug + if($.browser.msie) + positionAdjust = (parseInt($.browser.version.charAt(0)) === 6) ? 1 : ((corner.search(/left/) !== -1) ? 1 : 2); + + if(corner.search(/Middle/) !== -1) + self.elements.tip.css({ top: '50%', marginTop: -(self.options.style.tip.size.height / 2) }); + + else if(corner.search(/Top/) !== -1) + self.elements.tip.css({ top: self.options.style.border.radius - ieAdjust }); + + else if(corner.search(/Bottom/) !== -1) + self.elements.tip.css({ bottom: self.options.style.border.radius + ieAdjust }); + + if(corner.search(/left/) !== -1) + self.elements.tip.css({ left: -positionAdjust }); + else + self.elements.tip.css({ right: positionAdjust }); + }; + + // Adjust tooltip padding to compensate for tip + paddingCorner = 'padding-' + corner.match(/left|right|top|bottom/)[0]; + paddingSize = self.options.style.tip.size[ (paddingCorner.search(/left|right/) !== -1) ? 'width' : 'height' ]; + self.elements.tooltip.css('padding', 0); + self.elements.tooltip.css(paddingCorner, paddingSize); + + // Match content margin to prevent gap bug in IE6 ONLY + if($.browser.msie && parseInt($.browser.version.charAt(0)) == 6) + { + newMargin = parseInt(self.elements.tip.css('margin-top')) || 0; + newMargin += parseInt(self.elements.content.css('margin-top')) || 0; + + self.elements.tip.css({ marginTop: newMargin }); + }; + }; + + // Create title bar for content + function createTitle() + { + var self = this; + + // Destroy previous title element, if present + if(self.elements.title !== null) self.elements.title.remove(); + + // Create title element + self.elements.title = $('
    ') + .css( jQueryStyle(self.options.style.title, true) ) + .css({ zoom: ($.browser.msie) ? 1 : 0 }) + .prependTo(self.elements.contentWrapper); + + // Update title with contents if enabled + if(self.options.content.title.text) self.updateTitle.call(self, self.options.content.title.text); + + // Create title close buttons if enabled + if(self.options.content.title.button !== false + && typeof self.options.content.title.button == 'string') + { + self.elements.button = $('') + .css( jQueryStyle(self.options.style.button, true) ) + .html(self.options.content.title.button) + .prependTo(self.elements.title) + .click(function(event){ if(!self.status.disabled) self.hide(event) }); + }; + }; + + // Assign hide and show events + function assignEvents() + { + var self, showTarget, hideTarget, inactiveEvents; + self = this; + + // Setup event target variables + showTarget = self.options.show.when.target; + hideTarget = self.options.hide.when.target; + + // Add tooltip as a hideTarget is its fixed + if(self.options.hide.fixed) hideTarget = hideTarget.add(self.elements.tooltip); + + // Check if the hide event is special 'inactive' type + if(self.options.hide.when.event == 'inactive') + { + // Define events which reset the 'inactive' event handler + inactiveEvents = ['click', 'dblclick', 'mousedown', 'mouseup', 'mousemove', + 'mouseout', 'mouseenter', 'mouseleave', 'mouseover' ]; + + // Define 'inactive' event timer method + function inactiveMethod(event) + { + if(self.status.disabled === true) return; + + //Clear and reset the timer + clearTimeout(self.timers.inactive); + self.timers.inactive = setTimeout(function() + { + // Unassign 'inactive' events + $(inactiveEvents).each(function() + { + hideTarget.unbind(this+'.qtip-inactive'); + self.elements.content.unbind(this+'.qtip-inactive'); + }); + + // Hide the tooltip + self.hide(event); + } + , self.options.hide.delay); + }; + } + + // Check if the tooltip is 'fixed' + else if(self.options.hide.fixed === true) + { + self.elements.tooltip.bind('mouseover.qtip', function() + { + if(self.status.disabled === true) return; + + // Reset the hide timer + clearTimeout(self.timers.hide); + }); + }; + + // Define show event method + function showMethod(event) + { + if(self.status.disabled === true) return; + + // If set, hide tooltip when inactive for delay period + if(self.options.hide.when.event == 'inactive') + { + // Assign each reset event + $(inactiveEvents).each(function() + { + hideTarget.bind(this+'.qtip-inactive', inactiveMethod); + self.elements.content.bind(this+'.qtip-inactive', inactiveMethod); + }); + + // Start the inactive timer + inactiveMethod(); + }; + + // Clear hide timers + clearTimeout(self.timers.show); + clearTimeout(self.timers.hide); + + // Start show timer + self.timers.show = setTimeout(function(){ self.show(event); }, self.options.show.delay); + }; + + // Define hide event method + function hideMethod(event) + { + if(self.status.disabled === true) return; + + // Prevent hiding if tooltip is fixed and event target is the tooltip + if(self.options.hide.fixed === true + && self.options.hide.when.event.search(/mouse(out|leave)/i) !== -1 + && $(event.relatedTarget).parents('div.qtip[qtip]').length > 0) + { + // Prevent default and popagation + event.stopPropagation(); + event.preventDefault(); + + // Reset the hide timer + clearTimeout(self.timers.hide); + return false; + }; + + // Clear timers and stop animation queue + clearTimeout(self.timers.show); + clearTimeout(self.timers.hide); + self.elements.tooltip.stop(true, true); + + // If tooltip has displayed, start hide timer + self.timers.hide = setTimeout(function(){ self.hide(event); }, self.options.hide.delay); + }; + + // Both events and targets are identical, apply events using a toggle + if((self.options.show.when.target.add(self.options.hide.when.target).length === 1 + && self.options.show.when.event == self.options.hide.when.event + && self.options.hide.when.event !== 'inactive') + || self.options.hide.when.event == 'unfocus') + { + self.cache.toggle = 0; + // Use a toggle to prevent hide/show conflicts + showTarget.bind(self.options.show.when.event + '.qtip', function(event) + { + if(self.cache.toggle == 0) showMethod(event); + else hideMethod(event); + }); + } + + // Events are not identical, bind normally + else + { + showTarget.bind(self.options.show.when.event + '.qtip', showMethod); + + // If the hide event is not 'inactive', bind the hide method + if(self.options.hide.when.event !== 'inactive') + hideTarget.bind(self.options.hide.when.event + '.qtip', hideMethod); + }; + + // Focus the tooltip on mouseover + if(self.options.position.type.search(/(fixed|absolute)/) !== -1) + self.elements.tooltip.bind('mouseover.qtip', self.focus); + + // If mouse is the target, update tooltip position on mousemove + if(self.options.position.target === 'mouse' && self.options.position.type !== 'static') + { + showTarget.bind('mousemove.qtip', function(event) + { + // Set the new mouse positions if adjustment is enabled + self.cache.mouse = { x: event.pageX, y: event.pageY }; + + // Update the tooltip position only if the tooltip is visible and adjustment is enabled + if(self.status.disabled === false + && self.options.position.adjust.mouse === true + && self.options.position.type !== 'static' + && self.elements.tooltip.css('display') !== 'none') + self.updatePosition(event); + }); + }; + }; + + // Screen position adjustment + function screenAdjust(position, target, tooltip) + { + var self, adjustedPosition, adjust, newCorner, overflow, corner; + self = this; + + // Setup corner and adjustment variable + if(tooltip.corner == 'center') return target.position // TODO: 'center' corner adjustment + adjustedPosition = $.extend({}, position); + newCorner = { x: false, y: false }; + + // Define overflow properties + overflow = { + left: (adjustedPosition.left < $.fn.qtip.cache.screen.scroll.left), + right: (adjustedPosition.left + tooltip.dimensions.width + 2 >= $.fn.qtip.cache.screen.width + $.fn.qtip.cache.screen.scroll.left), + top: (adjustedPosition.top < $.fn.qtip.cache.screen.scroll.top), + bottom: (adjustedPosition.top + tooltip.dimensions.height + 2 >= $.fn.qtip.cache.screen.height + $.fn.qtip.cache.screen.scroll.top) + }; + + // Determine new positioning properties + adjust = { + left: (overflow.left && (tooltip.corner.search(/right/i) != -1 || (tooltip.corner.search(/right/i) == -1 && !overflow.right))), + right: (overflow.right && (tooltip.corner.search(/left/i) != -1 || (tooltip.corner.search(/left/i) == -1 && !overflow.left))), + top: (overflow.top && tooltip.corner.search(/top/i) == -1), + bottom: (overflow.bottom && tooltip.corner.search(/bottom/i) == -1) + }; + + // Tooltip overflows off the left side of the screen + if(adjust.left) + { + if(self.options.position.target !== 'mouse') + adjustedPosition.left = target.position.left + target.dimensions.width; + else + adjustedPosition.left = self.cache.mouse.x + + newCorner.x = 'Left'; + } + + // Tooltip overflows off the right side of the screen + else if(adjust.right) + { + if(self.options.position.target !== 'mouse') + adjustedPosition.left = target.position.left - tooltip.dimensions.width; + else + adjustedPosition.left = self.cache.mouse.x - tooltip.dimensions.width; + + newCorner.x = 'Right'; + }; + + // Tooltip overflows off the top of the screen + if(adjust.top) + { + if(self.options.position.target !== 'mouse') + adjustedPosition.top = target.position.top + target.dimensions.height; + else + adjustedPosition.top = self.cache.mouse.y + + newCorner.y = 'top'; + } + + // Tooltip overflows off the bottom of the screen + else if(adjust.bottom) + { + if(self.options.position.target !== 'mouse') + adjustedPosition.top = target.position.top - tooltip.dimensions.height; + else + adjustedPosition.top = self.cache.mouse.y - tooltip.dimensions.height; + + newCorner.y = 'bottom'; + }; + + // Don't adjust if resulting position is negative + if(adjustedPosition.left < 0) + { + adjustedPosition.left = position.left; + newCorner.x = false; + }; + if(adjustedPosition.top < 0) + { + adjustedPosition.top = position.top; + newCorner.y = false; + }; + + // Change tip corner if positioning has changed and tips are enabled + if(self.options.style.tip.corner !== false) + { + // Determine new corner properties + adjustedPosition.corner = new String(tooltip.corner); + if(newCorner.x !== false) adjustedPosition.corner = adjustedPosition.corner.replace(/Left|Right|Middle/, newCorner.x); + if(newCorner.y !== false) adjustedPosition.corner = adjustedPosition.corner.replace(/top|bottom/, newCorner.y); + + // Adjust tip if position has changed and tips are enabled + if(adjustedPosition.corner !== self.elements.tip.attr('rel')) + createTip.call(self, adjustedPosition.corner); + }; + + return adjustedPosition; + }; + + // Build a jQuery style object from supplied style object + function jQueryStyle(style, sub) + { + var styleObj, i; + + styleObj = $.extend(true, {}, style); + for(i in styleObj) + { + if(sub === true && i.search(/(tip|classes)/i) !== -1) + delete styleObj[i]; + else if(!sub && i.search(/(width|border|tip|title|classes|user)/i) !== -1) + delete styleObj[i]; + }; + + return styleObj; + }; + + // Sanitize styles + function sanitizeStyle(style) + { + if(typeof style.tip !== 'object') style.tip = { corner: style.tip }; + if(typeof style.tip.size !== 'object') style.tip.size = { width: style.tip.size, height: style.tip.size }; + if(typeof style.border !== 'object') style.border = { width: style.border }; + if(typeof style.width !== 'object') style.width = { value: style.width }; + if(typeof style.width.max == 'string') style.width.max = parseInt(style.width.max.replace(/([0-9]+)/i, "$1")); + if(typeof style.width.min == 'string') style.width.min = parseInt(style.width.min.replace(/([0-9]+)/i, "$1")); + + // Convert deprecated x and y tip values to width/height + if(typeof style.tip.size.x == 'number') + { + style.tip.size.width = style.tip.size.x; + delete style.tip.size.x; + }; + if(typeof style.tip.size.y == 'number') + { + style.tip.size.height = style.tip.size.y; + delete style.tip.size.y; + }; + + return style; + }; + + // Build styles recursively with inheritance + function buildStyle() + { + var self, i, styleArray, styleExtend, finalStyle, ieAdjust; + self = this; + + // Build style options from supplied arguments + styleArray = [true, {}]; + for(i = 0; i < arguments.length; i++) + styleArray.push(arguments[i]); + styleExtend = [ $.extend.apply($, styleArray) ]; + + // Loop through each named style inheritance + while(typeof styleExtend[0].name == 'string') + { + // Sanitize style data and append to extend array + styleExtend.unshift( sanitizeStyle($.fn.qtip.styles[ styleExtend[0].name ]) ); + }; + + // Make sure resulting tooltip className represents final style + styleExtend.unshift(true, {classes:{ tooltip: 'qtip-' + (arguments[0].name || 'defaults') }}, $.fn.qtip.styles.defaults); + + // Extend into a single style object + finalStyle = $.extend.apply($, styleExtend); + + // Adjust tip size if needed (IE 1px adjustment bug fix) + ieAdjust = ($.browser.msie) ? 1 : 0; + finalStyle.tip.size.width += ieAdjust; + finalStyle.tip.size.height += ieAdjust; + + // Force even numbers for pixel precision + if(finalStyle.tip.size.width % 2 > 0) finalStyle.tip.size.width += 1; + if(finalStyle.tip.size.height % 2 > 0) finalStyle.tip.size.height += 1; + + // Sanitize final styles tip corner value + if(finalStyle.tip.corner === true) + finalStyle.tip.corner = (self.options.position.corner.tooltip === 'center') ? false : self.options.position.corner.tooltip; + + return finalStyle; + }; + + // Tip coordinates calculator + function calculateTip(corner, width, height) + { + // Define tip coordinates in terms of height and width values + var tips = { + bottomRight: [[0,0], [width,height], [width,0]], + bottomLeft: [[0,0], [width,0], [0,height]], + topRight: [[0,height], [width,0], [width,height]], + topLeft: [[0,0], [0,height], [width,height]], + topMiddle: [[0,height], [width / 2,0], [width,height]], + bottomMiddle: [[0,0], [width,0], [width / 2,height]], + rightMiddle: [[0,0], [width,height / 2], [0,height]], + leftMiddle: [[width,0], [width,height], [0,height / 2]] + }; + tips.leftTop = tips.bottomRight; + tips.rightTop = tips.bottomLeft; + tips.leftBottom = tips.topRight; + tips.rightBottom = tips.topLeft; + + return tips[corner]; + }; + + // Border coordinates calculator + function calculateBorders(radius) + { + var borders; + + // Use canvas element if supported + if($('').get(0).getContext) + { + borders = { + topLeft: [radius,radius], topRight: [0,radius], + bottomLeft: [radius,0], bottomRight: [0,0] + }; + } + + // Canvas not supported - Use VML (IE) + else if($.browser.msie) + { + borders = { + topLeft: [-90,90,0], topRight: [-90,90,-radius], + bottomLeft: [90,270,0], bottomRight: [90, 270,-radius] + }; + }; + + return borders; + }; + + // BGIFRAME JQUERY PLUGIN ADAPTION + // Special thanks to Brandon Aaron for this plugin + // http://plugins.jquery.com/project/bgiframe + function bgiframe() + { + var self, html, dimensions; + self = this; + dimensions = self.getDimensions(); + + // Setup iframe HTML string + html = '
    {$lang->group_title}